diff --git a/examples/calendar/src/main.rs b/examples/calendar/src/main.rs index a0e59be1..1b20f356 100644 --- a/examples/calendar/src/main.rs +++ b/examples/calendar/src/main.rs @@ -18,9 +18,7 @@ fn main() -> Result<(), Box> { /// Messages that are used specifically by our [`App`]. #[derive(Clone, Debug)] pub enum Message { - PrevMonth, - NextMonth, - DaySelected(u32), + DateSelected(NaiveDate), } /// The [`App`] stores application-specific state. @@ -68,17 +66,13 @@ impl cosmic::Application for App { /// Handle application events here. fn update(&mut self, message: Self::Message) -> Command { match message { - Message::DaySelected(day) => { - cosmic::widget::calendar::set_day(&mut self.date_selected, day); - } - Message::PrevMonth => { - cosmic::widget::calendar::set_prev_month(&mut self.date_selected); - } - Message::NextMonth => { - cosmic::widget::calendar::set_next_month(&mut self.date_selected); + Message::DateSelected(date) => { + self.date_selected = date; } } + println!("Date selected: {:?}", self.date_selected); + Command::none() } @@ -86,12 +80,8 @@ impl cosmic::Application for App { fn view(&self) -> Element { let mut content = cosmic::widget::column().spacing(12); - let calendar = cosmic::widget::calendar( - &self.date_selected, - Message::PrevMonth, - Message::NextMonth, - |day| Message::DaySelected(day), - ); + let calendar = + cosmic::widget::calendar(&self.date_selected, |date| Message::DateSelected(date)); content = content.push(calendar); diff --git a/src/widget/calendar.rs b/src/widget/calendar.rs index 8b76c630..96d23e51 100644 --- a/src/widget/calendar.rs +++ b/src/widget/calendar.rs @@ -10,19 +10,15 @@ use iced::alignment::{Horizontal, Vertical}; pub fn calendar( selected: &NaiveDate, - on_prev_month: M, - on_next_month: M, - on_select: impl Fn(u32) -> M + 'static, + on_select: impl Fn(NaiveDate) -> M + 'static, ) -> Calendar { Calendar { selected, - on_prev_month, - on_next_month, on_select: Box::new(on_select), } } -pub fn set_day(date_selected: &mut NaiveDate, day: u32) { +pub fn set_day(date_selected: NaiveDate, day: u32) -> NaiveDate { let current = date_selected.day(); let new_date = match current.cmp(&day) { @@ -34,27 +30,27 @@ pub fn set_day(date_selected: &mut NaiveDate, day: u32) { }; if let Some(new) = new_date { - *date_selected = new; + new + } else { + date_selected } } -pub fn set_prev_month(date_selected: &mut NaiveDate) { - *date_selected = date_selected +pub fn set_prev_month(date_selected: NaiveDate) -> NaiveDate { + date_selected .checked_sub_months(Months::new(1)) - .expect("valid naivedate"); + .expect("valid naivedate") } -pub fn set_next_month(date_selected: &mut NaiveDate) { - *date_selected = date_selected +pub fn set_next_month(date_selected: NaiveDate) -> NaiveDate { + date_selected .checked_add_months(Months::new(1)) - .expect("valid naivedate"); + .expect("valid naivedate") } pub struct Calendar<'a, M> { selected: &'a NaiveDate, - on_prev_month: M, - on_next_month: M, - on_select: Box M>, + on_select: Box M>, } impl<'a, Message> From> for crate::Element<'a, Message> @@ -69,12 +65,12 @@ where .push( button::icon(icon::from_name("go-previous-symbolic")) .padding([0, 12]) - .on_press(this.on_prev_month), + .on_press((this.on_select)(set_prev_month(this.selected.clone()))), ) .push( button::icon(icon::from_name("go-next-symbolic")) .padding([0, 12]) - .on_press(this.on_next_month), + .on_press((this.on_select)(set_next_month(this.selected.clone()))), ); // Calender @@ -111,7 +107,7 @@ where let is_day = date.day() == this.selected.day() && is_month; calendar_grid = - calendar_grid.push(date_button(date.day(), is_month, is_day, &this.on_select)); + calendar_grid.push(date_button(date, is_month, is_day, &this.on_select)); } let content_list = column::with_children(vec![ @@ -133,19 +129,19 @@ where } fn date_button( - day: u32, + date: NaiveDate, is_month: bool, is_day: bool, - on_select: &dyn Fn(u32) -> Message, + on_select: &dyn Fn(NaiveDate) -> Message, ) -> crate::widget::Button<'static, Message, crate::Theme, crate::Renderer> { let style = if is_day { - crate::widget::button::Style::Suggested + button::Style::Suggested } else { - crate::widget::button::Style::Text + button::Style::Text }; let button = button( - text(format!("{day}")) + text(format!("{}", date.day())) .horizontal_alignment(Horizontal::Center) .vertical_alignment(Vertical::Center), ) @@ -154,7 +150,7 @@ fn date_button( .width(Length::Fixed(36.0)); if is_month { - button.on_press((on_select)(day)) + button.on_press((on_select)(set_day(date, date.day()))) } else { button }