From 75a019db801416d40a6cf69d9f60e0d8c355d453 Mon Sep 17 00:00:00 2001 From: Fabrizio Iannetti Date: Thu, 21 Dec 2023 17:36:53 +0100 Subject: [PATCH] start adding Week view Signed-off-by: Fabrizio Iannetti --- src/main.rs | 11 ++++++++++- src/ui/calendar.rs | 13 ++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index f45017a..225a356 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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 { let description = match self.mode { @@ -184,6 +187,12 @@ impl Application for CalendarApp { fn update(&mut self, message: Message) -> Command { 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); } diff --git a/src/ui/calendar.rs b/src/ui/calendar.rs index 56fd360..32ea0c5 100644 --- a/src/ui/calendar.rs +++ b/src/ui/calendar.rs @@ -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()), };