start adding Week view

Signed-off-by: Fabrizio Iannetti <fabrizio.iannetti@gmail.com>
This commit is contained in:
Fabrizio Iannetti 2023-12-21 17:36:53 +01:00
parent 80a05b0b04
commit 75a019db80
2 changed files with 20 additions and 4 deletions

View File

@ -67,6 +67,8 @@ struct CalendarApp {
#[derive(Debug, Clone, Copy)]
enum Message {
NextWeek,
PrevWeek,
NextMonth,
PrevMonth,
NextYear,
@ -93,6 +95,7 @@ impl std::fmt::Display for ViewMode {
f,
"{}",
match self {
ViewMode::Week => "Week",
ViewMode::Month => "Month",
ViewMode::Year => "Year",
}
@ -101,7 +104,7 @@ impl std::fmt::Display for ViewMode {
}
impl Controls {
const MODES : [ViewMode; 2] = [ViewMode::Month, ViewMode::Year];
const MODES : [ViewMode; 3] = [ViewMode::Week, ViewMode::Month, ViewMode::Year];
fn view<'a>(&'a self, month_name: &'a str, year: i32) -> Element<Message> {
let description = match self.mode {
@ -184,6 +187,12 @@ impl Application for CalendarApp {
fn update(&mut self, message: Message) -> Command<Message> {
match message {
Message::PrevWeek => {
self.month = self.month; // TODO
}
Message::NextWeek => {
self.month = self.month; // TODO
}
Message::PrevMonth => {
self.month = self.month - Months::new(1);
}

View File

@ -275,6 +275,7 @@ where
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CalendarViewMode {
Week,
Month,
Year,
}
@ -292,9 +293,10 @@ pub struct CalendarView<'a> {
impl<'a> CalendarView<'a> {
pub fn new(mode: CalendarViewMode, params: &CalendarParams, day: NaiveDate, events: &'a EventsCollection) -> Self {
let first_day = match mode {
CalendarViewMode::Month => day.with_day0(0),
CalendarViewMode::Year => day.with_month0(0).unwrap().with_day0(0)
}.unwrap();
CalendarViewMode::Week => day.week(chrono::Weekday::Mon).first_day(),
CalendarViewMode::Month => day.with_day0(0).unwrap(),
CalendarViewMode::Year => day.with_month0(0).unwrap().with_day0(0).unwrap()
};
CalendarView {
first_day,
params: params.clone(),
@ -308,6 +310,7 @@ impl<'a> CalendarView<'a> {
fn get_days_per_row(&self) -> u32 {
match self.mode {
CalendarViewMode::Week => 7, // one week -> 7 days
CalendarViewMode::Month => 7, // one week per row -> 7 days
CalendarViewMode::Year => YEAR_VIEW_DAYS_PER_ROW, // one month per row, aligned by weekday
}
@ -315,6 +318,7 @@ impl<'a> CalendarView<'a> {
fn get_row_count(&self) -> u32 {
match self.mode {
CalendarViewMode::Week => 1, // just one week
CalendarViewMode::Month => 6, // one week per row -> max 6 (incomplate) in a month
CalendarViewMode::Year => 12, // one month per row
}
@ -322,6 +326,7 @@ impl<'a> CalendarView<'a> {
fn get_calendar_row(&self, day: NaiveDate, row: u32) -> CalendarRow {
match self.mode {
CalendarViewMode::Week => CalendarRow::for_week(day + Duration::weeks(row.into())),
CalendarViewMode::Month => CalendarRow::for_week(day + Duration::weeks(row.into())),
CalendarViewMode::Year => CalendarRow::for_month(day + Months::new(row)),
}
@ -329,6 +334,7 @@ impl<'a> CalendarView<'a> {
fn get_row_label(&self, cal_row: CalendarRow) -> String {
match self.mode {
CalendarViewMode::Week => (cal_row.begin.iso_week().week()).to_string(),
CalendarViewMode::Month => (cal_row.begin.iso_week().week()).to_string(),
CalendarViewMode::Year => MONTH_NAMES[cal_row.begin.month0() as usize].to_string(),
}
@ -336,6 +342,7 @@ impl<'a> CalendarView<'a> {
fn get_sidebar_width(&self, renderer: &mut impl text::Renderer, bounds: Size) -> f32 {
let sidebar_width = match self.mode {
CalendarViewMode::Week => compute_week_num_width(renderer, bounds, self.margin, self.row_name_font_size.into()),
CalendarViewMode::Month => compute_week_num_width(renderer, bounds, self.margin, self.row_name_font_size.into()),
CalendarViewMode::Year => compute_month_name_width(renderer, bounds, self.margin, self.row_name_font_size.into()),
};