aboutsummaryrefslogtreecommitdiff
path: root/src/gui/update.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/update.rs')
-rw-r--r--src/gui/update.rs51
1 files changed, 35 insertions, 16 deletions
diff --git a/src/gui/update.rs b/src/gui/update.rs
index 91102bf..c8dfa6d 100644
--- a/src/gui/update.rs
+++ b/src/gui/update.rs
@@ -1,5 +1,6 @@
use async_channel::{Receiver, Sender};
-use chrono::NaiveDate;
+use chrono::{Duration, NaiveDate};
+use gtk4::prelude::GridExt;
use std::collections::HashSet;
use crate::{
@@ -19,36 +20,45 @@ pub enum Msg {
AddEvent { new: Event },
UpdateEvent { old: Event, new: Event },
DeleteEvent { event: Event },
+ SelectPreviousWeek,
+ SelectNextWeek,
}
pub async fn event_handler(rx: Receiver<Msg>, mut app: App) {
while let Ok(msg) = rx.recv().await {
match msg {
- Msg::ShowAddForm { date } => {
- form::show(&app, event::init(date), true).await;
- }
- Msg::ShowUpdateForm { event } => {
- form::show(&app, event, false).await;
- }
+ Msg::ShowAddForm { date } => form::show(&app, event::init(date), true).await,
+ Msg::ShowUpdateForm { event } => form::show(&app, event, false).await,
Msg::AddEvent { new } => {
let refresh_dates = add(&mut app, &new);
refresh(&app, &refresh_dates)
}
Msg::UpdateEvent { old, new } => {
- let refresh_dates_1 = remove(&mut app, &old);
- let refresh_dates_2 = add(&mut app, &new);
- refresh(
- &app,
- &refresh_dates_1
- .union(&refresh_dates_2)
- .copied()
- .collect::<HashSet<NaiveDate>>(),
- )
+ let mut refresh_dates = remove(&mut app, &old);
+ refresh_dates.extend(add(&mut app, &new));
+ refresh(&app, &refresh_dates);
}
Msg::DeleteEvent { event } => {
let refresh_dates = remove(&mut app, &event);
refresh(&app, &refresh_dates)
}
+ Msg::SelectPreviousWeek => {
+ app.grid.remove_row(4);
+ app.grid.insert_row(1);
+ app.start_date -= Duration::days(7);
+ app.end_date -= Duration::days(7);
+ refresh(&app, &HashSet::from_iter(week_from(app.start_date)));
+ }
+ Msg::SelectNextWeek => {
+ app.grid.remove_row(1);
+ app.grid.insert_row(4);
+ app.start_date += Duration::days(7);
+ app.end_date += Duration::days(7);
+ refresh(
+ &app,
+ &HashSet::from_iter(week_from(app.end_date - Duration::days(6))),
+ );
+ }
}
}
}
@@ -110,3 +120,12 @@ fn refresh(app: &App, dates: &HashSet<NaiveDate>) {
calendar::refresh_date(app, *date, &repetitions)
}
}
+
+/// Seven days vector from the given date.
+fn week_from(date: NaiveDate) -> Vec<NaiveDate> {
+ let mut res = vec![date];
+ for i in 1..=6 {
+ res.push(date + Duration::days(i))
+ }
+ res
+}