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.rs83
1 files changed, 75 insertions, 8 deletions
diff --git a/src/gui/update.rs b/src/gui/update.rs
index 372fb24..bd4e7a9 100644
--- a/src/gui/update.rs
+++ b/src/gui/update.rs
@@ -3,6 +3,7 @@ use chrono::{Duration, NaiveDate};
use gtk4::prelude::GridExt;
use std::collections::HashSet;
use std::iter::FromIterator;
+use uuid::Uuid;
use crate::{
db,
@@ -21,15 +22,19 @@ pub enum Msg {
date: NaiveDate,
},
ShowRepetitionDialog {
+ event_id: Uuid,
date: NaiveDate,
- event: Event,
},
ShowUpdateForm {
- event: Event,
+ event_id: Uuid,
},
ShowUpdateRepetitionForm {
+ event_id: Uuid,
+ date: NaiveDate,
+ },
+ ShowUpdateFromOccurence {
+ event_id: Uuid,
date: NaiveDate,
- event: Event,
},
AddEvent {
new: Event,
@@ -44,6 +49,11 @@ pub enum Msg {
date: NaiveDate,
new: Event,
},
+ UpdateRepeatedFrom {
+ old: Event,
+ updated: Event,
+ new: Event,
+ },
DeleteEvent {
event: Event,
},
@@ -60,12 +70,62 @@ 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, form::Target::New { date }).await,
- Msg::ShowRepetitionDialog { date, event } => {
- form::repetition_dialog(&app, date, event).await
+ Msg::ShowRepetitionDialog { date, event_id } => {
+ match app.recurring_events.iter().position(|e| e.id == event_id) {
+ Some(index) => {
+ form::repetition_dialog(&app, date, &app.recurring_events[index]).await
+ }
+ None => eprintln!("Event not found with id: {}", event_id),
+ }
}
- Msg::ShowUpdateForm { event } => form::show(&app, form::Target::Update { event }).await,
- Msg::ShowUpdateRepetitionForm { date, event } => {
- form::show(&app, form::Target::UpdateRepetition { event, date }).await
+ Msg::ShowUpdateForm { event_id } => {
+ match app.recurring_events.iter().position(|e| e.id == event_id) {
+ Some(index) => {
+ form::show(
+ &app,
+ form::Target::Update {
+ event: app.recurring_events[index].clone(),
+ },
+ )
+ .await
+ }
+ None => match app.events.iter().position(|e| e.id == event_id) {
+ Some(index) => {
+ form::show(
+ &app,
+ form::Target::Update {
+ event: app.events[index].clone(),
+ },
+ )
+ .await
+ }
+ None => eprintln!("Event not found with id: {}", event_id),
+ },
+ }
+ }
+ Msg::ShowUpdateRepetitionForm { event_id, date } => {
+ match app.recurring_events.iter().position(|e| e.id == event_id) {
+ Some(index) => {
+ form::show(
+ &app,
+ form::Target::UpdateRepetition {
+ date,
+ event: app.recurring_events[index].clone(),
+ },
+ )
+ .await
+ }
+ None => eprintln!("Event not found with id: {}", event_id),
+ }
+ }
+ Msg::ShowUpdateFromOccurence { event_id, date } => {
+ match app.recurring_events.iter().position(|e| e.id == event_id) {
+ Some(index) => {
+ let event = app.recurring_events[index].clone();
+ form::show(&app, form::Target::UpdateFromOccurence { date, event }).await
+ }
+ None => eprintln!("Event not found with id: {}", event_id),
+ }
}
Msg::AddEvent { new } => {
let refresh_dates = add(&mut app, &new);
@@ -87,6 +147,12 @@ pub async fn event_handler(rx: Receiver<Msg>, mut app: App) {
refresh_dates.insert(date);
refresh(&app, &refresh_dates)
}
+ Msg::UpdateRepeatedFrom { old, updated, new } => {
+ let mut refresh_dates = remove(&mut app, &old);
+ refresh_dates.extend(add(&mut app, &updated));
+ 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)
@@ -158,6 +224,7 @@ fn remove(app: &mut App, event: &Event) -> HashSet<NaiveDate> {
}
/// Remove event repetition
+/// TODO: Completely remove the event if it’s the last remaining occurence
fn remove_occurence(app: &mut App, event: &Event, occurence: usize) {
match app.recurring_events.iter().position(|e| e.id == event.id) {
Some(index) => {