From 8f53bc4de6cc0a5a6d1d248e3bc73f6a3fe6a63a Mon Sep 17 00:00:00 2001 From: Savanni D'Gerinel Date: Tue, 23 Jan 2024 08:46:35 -0500 Subject: [PATCH] Implement the Edit Cancel button --- fitnesstrax/app/src/components/day.rs | 89 ++++++++++--------- fitnesstrax/app/src/view_models/day_detail.rs | 73 ++++++++------- 2 files changed, 90 insertions(+), 72 deletions(-) diff --git a/fitnesstrax/app/src/components/day.rs b/fitnesstrax/app/src/components/day.rs index e18cc18..2494a62 100644 --- a/fitnesstrax/app/src/components/day.rs +++ b/fitnesstrax/app/src/components/day.rs @@ -231,48 +231,9 @@ impl DayEdit { *s.imp().on_finished.borrow_mut() = Box::new(on_finished); - s.append( - &ActionGroup::builder() - .primary_action("Save", { - let s = s.clone(); - let view_model = view_model.clone(); - move || { - view_model.save(); - s.finish(); - } - }) - .secondary_action("Cancel", { - let s = s.clone(); - let view_model = view_model.clone(); - move || { - view_model.revert(); - s.finish(); - } - }) - .build(), - ); + s.append(&control_buttons(&s, &view_model)); - let top_row = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .build(); - top_row.append( - &weight_editor(view_model.weight(), { - let view_model = view_model.clone(); - move |w| { - view_model.set_weight(w); - } - }) - .widget(), - ); - - top_row.append( - &steps_editor(view_model.steps(), { - let view_model = view_model.clone(); - move |s| view_model.set_steps(s) - }) - .widget(), - ); - s.append(&top_row); + s.append(&weight_and_steps_row(&view_model)); s } @@ -281,3 +242,49 @@ impl DayEdit { (self.imp().on_finished.borrow())() } } + +fn control_buttons(s: &DayEdit, view_model: &DayDetailViewModel) -> ActionGroup { + ActionGroup::builder() + .primary_action("Save", { + let s = s.clone(); + let view_model = view_model.clone(); + move || { + view_model.save(); + s.finish(); + } + }) + .secondary_action("Cancel", { + let s = s.clone(); + let view_model = view_model.clone(); + move || { + view_model.revert(); + s.finish(); + } + }) + .build() +} + +fn weight_and_steps_row(view_model: &DayDetailViewModel) -> gtk::Box { + let row = gtk::Box::builder() + .orientation(gtk::Orientation::Horizontal) + .build(); + row.append( + &weight_editor(view_model.weight(), { + let view_model = view_model.clone(); + move |w| { + view_model.set_weight(w); + } + }) + .widget(), + ); + + row.append( + &steps_editor(view_model.steps(), { + let view_model = view_model.clone(); + move |s| view_model.set_steps(s) + }) + .widget(), + ); + + row +} diff --git a/fitnesstrax/app/src/view_models/day_detail.rs b/fitnesstrax/app/src/view_models/day_detail.rs index 8f7769a..e69cb85 100644 --- a/fitnesstrax/app/src/view_models/day_detail.rs +++ b/fitnesstrax/app/src/view_models/day_detail.rs @@ -95,43 +95,24 @@ pub struct DayDetailViewModel { weight: Arc>>>, steps: Arc>>>, records: Arc>>>, + + original_records: Vec>, } impl DayDetailViewModel { pub fn new(date: chrono::NaiveDate, records: Vec>, app: App) -> Self { - let (weight_records, records): (Vec>, Vec>) = - records.into_iter().partition(|r| r.data.is_weight()); - let (step_records, records): (Vec>, Vec>) = - records.into_iter().partition(|r| r.data.is_steps()); - Self { + let s = Self { app: Some(app), date, - weight: Arc::new(RwLock::new( - weight_records - .first() - .and_then(|r| match r.data { - TraxRecord::Weight(ref w) => Some((r.id.clone(), w.clone())), - _ => None, - }) - .map(|(id, w)| RecordState::Original(Record { id, data: w })), - )), - steps: Arc::new(RwLock::new( - step_records - .first() - .and_then(|r| match r.data { - TraxRecord::Steps(ref w) => Some((r.id.clone(), w.clone())), - _ => None, - }) - .map(|(id, w)| RecordState::Original(Record { id, data: w })), - )), - records: Arc::new(RwLock::new( - records - .into_iter() - .map(|r| (r.id.clone(), RecordState::Original(r))) - .collect::>>(), - )), - } + weight: Arc::new(RwLock::new(None)), + steps: Arc::new(RwLock::new(None)), + records: Arc::new(RwLock::new(HashMap::new())), + + original_records: records, + }; + s.populate_records(); + s } pub fn weight(&self) -> Option> { @@ -273,7 +254,37 @@ impl DayDetailViewModel { } pub fn revert(&self) { - unimplemented!(); + self.populate_records(); + } + + fn populate_records(&self) { + let records = self.original_records.clone(); + + let (weight_records, records): (Vec>, Vec>) = + records.into_iter().partition(|r| r.data.is_weight()); + let (step_records, records): (Vec>, Vec>) = + records.into_iter().partition(|r| r.data.is_steps()); + + *self.weight.write().unwrap() = weight_records + .first() + .and_then(|r| match r.data { + TraxRecord::Weight(ref w) => Some((r.id.clone(), w.clone())), + _ => None, + }) + .map(|(id, w)| RecordState::Original(Record { id, data: w })); + + *self.steps.write().unwrap() = step_records + .first() + .and_then(|r| match r.data { + TraxRecord::Steps(ref w) => Some((r.id.clone(), w.clone())), + _ => None, + }) + .map(|(id, w)| RecordState::Original(Record { id, data: w })); + + *self.records.write().unwrap() = records + .into_iter() + .map(|r| (r.id.clone(), RecordState::Original(r))) + .collect::>>(); } }