From 35cc74578e969bae4812afd2ff041eba3746142d Mon Sep 17 00:00:00 2001 From: Joris Date: Sat, 19 Mar 2022 22:03:58 +0100 Subject: Allow to repeat an event until a specific date Also provide a shortcut to modify a repetead event from a specific occurence. This set the end repetition date under the hood and create a new repeated event. --- src/gui/update.rs | 83 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 8 deletions(-) (limited to 'src/gui/update.rs') 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, 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, 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 { } /// 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) => { -- cgit v1.2.3