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

View File

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