diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..3e131c4 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,12 @@ +use crate::calendar::CalendarViewMode as ViewMode; + +#[derive(Debug, Clone, Copy)] +pub enum Message { + NextWeek, + PrevWeek, + NextMonth, + PrevMonth, + NextYear, + PrevYear, + ViewModeSelected(ViewMode), +} diff --git a/src/main.rs b/src/main.rs index ed67f76..5583ee5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,15 @@ //! Simple calendar applications. +mod app; mod ui; mod model; -use iced::widget::button; -use ui::calendar; +use ui::{calendar, controls::Controls}; +use app::Message; use model::{ events::EventsCollection, ical_bridge::load_calendar, }; -use chrono::{Datelike, NaiveDate, Months, Utc}; +use chrono::{Datelike, NaiveDate, Months, Utc, Days}; use calendar::{CalendarParams, CalendarView }; use calendar::CalendarViewMode as ViewMode; use std::path; @@ -16,18 +17,13 @@ use clap::Parser; use log::info; use simplelog::{SimpleLogger, Config}; use iced::{ - alignment, Alignment, Command, Element, Length, widget::{ Column, - Row, Container, - Button, - Text, - pick_list, }, }; @@ -68,35 +64,11 @@ fn set_up_logger() { #[derive(Default)] struct CalendarApp { - month: NaiveDate, + view_date: NaiveDate, controls: Controls, events: EventsCollection, } -#[derive(Debug, Clone, Copy)] -enum Message { - NextWeek, - PrevWeek, - NextMonth, - PrevMonth, - NextYear, - PrevYear, - ViewModeSelected(ViewMode), -} - -//#[derive(Default)] -struct Controls { - mode: Option, -} - -impl Default for Controls { - fn default() -> Controls { - Controls { - mode : Some(ViewMode::Year) - } - } -} - impl std::fmt::Display for ViewMode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -111,74 +83,11 @@ impl std::fmt::Display for ViewMode { } } -impl Controls { - 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 { - Some(ViewMode::Month) => month_name, - _ => "" - }; - Row::new() - .align_items(Alignment::Center) - .padding(5) - .spacing(10) - .push( - pick_list( - &Controls::MODES[..], - self.mode, - Message::ViewModeSelected, - ).placeholder("mode") - ) - .push( - Button::new(Text::new("<")) - .on_press(self.get_msg_prev()) - .style(button::secondary), - ) - .push( - Button::new(Text::new(">")) - .on_press(self.get_msg_next()) - .style(button::secondary), - ) - .push( - Text::new(description) - .width(Length::Fill) - .horizontal_alignment(alignment::Horizontal::Left) - .size(40), - ) - .push( - Text::new(year.to_string()) - .width(Length::Fill) - .horizontal_alignment(alignment::Horizontal::Right) - .size(40), - ) - .into() - } - - fn get_msg_next(&self) -> Message { - match self.mode { - Some(ViewMode::Week) => Message::NextWeek, - Some(ViewMode::Month) => Message::NextMonth, - Some(ViewMode::Year) => Message::NextYear, - None => todo!(), - } - } - - fn get_msg_prev(&self) -> Message { - match self.mode { - Some(ViewMode::Week) => Message::PrevWeek, - Some(ViewMode::Month) => Message::PrevMonth, - Some(ViewMode::Year) => Message::PrevYear, - None => todo!(), - } - } -} - impl CalendarApp { fn with_files(calendar_paths: std::vec::Vec) -> Self { - let month = Utc::now().date_naive(); + let view_date = Utc::now().date_naive(); let mut app = CalendarApp { - month, + view_date, events: EventsCollection::new(), ..CalendarApp::default() }; @@ -191,22 +100,22 @@ impl CalendarApp { fn update(&mut self, message: Message) -> Command { match message { Message::PrevWeek => { - self.month = self.month; // TODO + self.view_date = self.view_date - Days::new(7); } Message::NextWeek => { - self.month = self.month; // TODO + self.view_date = self.view_date + Days::new(7); } Message::PrevMonth => { - self.month = self.month - Months::new(1); + self.view_date = self.view_date - Months::new(1); } Message::NextMonth => { - self.month = self.month + Months::new(1); + self.view_date = self.view_date + Months::new(1); } Message::PrevYear => { - self.month = self.month - Months::new(12); + self.view_date = self.view_date - Months::new(12); } Message::NextYear => { - self.month = self.month + Months::new(12); + self.view_date = self.view_date + Months::new(12); } Message::ViewModeSelected(mode) => { self.controls.mode = Some(mode); @@ -218,24 +127,10 @@ impl CalendarApp { fn view(&self) -> Element { #[cfg(feature = "tracing")] tracepoints::calendar::view_entry(); - const MONTH_NAMES: [&str;12] = [ - "gennaio", - "febbraio", - "marzo", - "aprile", - "maggio", - "giugno", - "luglio", - "agosto", - "settembre", - "ottobre", - "novembre", - "dicembre", - ]; let content = Column::new() .align_items(Alignment::Center) - .push(self.controls.view(MONTH_NAMES[self.month.month0() as usize], self.month.year())) - .push(CalendarView::new(self.controls.mode.unwrap_or(ViewMode::Year), &CalendarParams::new(), self.month, &self.events)) + .push(self.controls.view(self.view_date, self.view_date.year())) + .push(CalendarView::new(self.controls.mode.unwrap_or(ViewMode::Year), &CalendarParams::new(), self.view_date, &self.events)) ; let container = Container::new(content) diff --git a/src/ui.rs b/src/ui.rs index 1addce5..37968cb 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,3 +1,4 @@ -pub mod calendar; pub mod basics; +pub mod calendar; +pub mod controls; mod row; diff --git a/src/ui/controls.rs b/src/ui/controls.rs new file mode 100644 index 0000000..538e5ea --- /dev/null +++ b/src/ui/controls.rs @@ -0,0 +1,108 @@ +use crate::{ + app::Message, + calendar::CalendarViewMode as ViewMode +}; +use chrono::{NaiveDate, Datelike}; +use iced::{ + alignment, + Alignment, + Element, + Length, + widget::{ + button, + Row, + Button, + Text, + pick_list, + }, +}; + +//#[derive(Default)] +pub struct Controls { + pub mode: Option, +} + +impl Default for Controls { + fn default() -> Controls { + Controls { + mode : Some(ViewMode::Year) + } + } +} + +impl Controls { + const MODES : [ViewMode; 3] = [ViewMode::Week, ViewMode::Month, ViewMode::Year]; + const MONTH_NAMES: [&'static str;12] = [ + "gennaio", + "febbraio", + "marzo", + "aprile", + "maggio", + "giugno", + "luglio", + "agosto", + "settembre", + "ottobre", + "novembre", + "dicembre", + ]; + + pub fn view<'a>(&'a self, view_date: NaiveDate, year: i32) -> Element { + let description = match self.mode { + Some(ViewMode::Month) => Controls::MONTH_NAMES[view_date.month0() as usize], + _ => "" + }; + Row::new() + .align_items(Alignment::Center) + .padding(5) + .spacing(10) + .push( + pick_list( + &Controls::MODES[..], + self.mode, + Message::ViewModeSelected, + ).placeholder("mode") + ) + .push( + Button::new(Text::new("<")) + .on_press(self.get_msg_prev()) + .style(button::secondary), + ) + .push( + Button::new(Text::new(">")) + .on_press(self.get_msg_next()) + .style(button::secondary), + ) + .push( + Text::new(description) + .width(Length::Fill) + .horizontal_alignment(alignment::Horizontal::Left) + .size(40), + ) + .push( + Text::new(year.to_string()) + .width(Length::Fill) + .horizontal_alignment(alignment::Horizontal::Right) + .size(40), + ) + .into() + } + + fn get_msg_next(&self) -> Message { + match self.mode { + Some(ViewMode::Week) => Message::NextWeek, + Some(ViewMode::Month) => Message::NextMonth, + Some(ViewMode::Year) => Message::NextYear, + None => todo!(), + } + } + + fn get_msg_prev(&self) -> Message { + match self.mode { + Some(ViewMode::Week) => Message::PrevWeek, + Some(ViewMode::Month) => Message::PrevMonth, + Some(ViewMode::Year) => Message::PrevYear, + None => todo!(), + } + } +}