From 304008c67429acddaf41d4dc6976fe06e0c0583f Mon Sep 17 00:00:00 2001 From: Savanni D'Gerinel Date: Mon, 29 Jan 2024 09:18:36 -0500 Subject: [PATCH] The view model can no longer be initialized without an app --- fitnesstrax/app/src/components/day.rs | 10 ++ fitnesstrax/app/src/view_models/day_detail.rs | 111 +++++++++--------- fitnesstrax/app/src/views/day_detail_view.rs | 36 +++--- 3 files changed, 86 insertions(+), 71 deletions(-) diff --git a/fitnesstrax/app/src/components/day.rs b/fitnesstrax/app/src/components/day.rs index 15eb9ce..d8d547f 100644 --- a/fitnesstrax/app/src/components/day.rs +++ b/fitnesstrax/app/src/components/day.rs @@ -222,12 +222,21 @@ impl DayDetail { pub struct DayEditPrivate { on_finished: RefCell>, + workout_rows: RefCell, + view_model: RefCell>, } impl Default for DayEditPrivate { fn default() -> Self { Self { on_finished: RefCell::new(Box::new(|| {})), + workout_rows: RefCell::new( + gtk::Box::builder() + .orientation(gtk::Orientation::Vertical) + .hexpand(true) + .build(), + ), + view_model: RefCell::new(None), } } } @@ -257,6 +266,7 @@ impl DayEdit { s.set_hexpand(true); *s.imp().on_finished.borrow_mut() = Box::new(on_finished); + *s.imp().view_model.borrow_mut() = Some(view_model.clone()); s.append( &ActionGroup::builder() diff --git a/fitnesstrax/app/src/view_models/day_detail.rs b/fitnesstrax/app/src/view_models/day_detail.rs index cf8ac0e..0e9b5c9 100644 --- a/fitnesstrax/app/src/view_models/day_detail.rs +++ b/fitnesstrax/app/src/view_models/day_detail.rs @@ -75,12 +75,9 @@ impl Deref for RecordState { } } -#[derive(Default)] -struct DayDetailViewModelInner {} - -#[derive(Clone, Default)] +#[derive(Clone)] pub struct DayDetailViewModel { - app: Option, + app: App, pub date: chrono::NaiveDate, weight: Arc>>>, steps: Arc>>>, @@ -94,7 +91,7 @@ impl DayDetailViewModel { let (step_records, records): (Vec>, Vec>) = records.into_iter().partition(|r| r.data.is_steps()); Self { - app: Some(app), + app, date, weight: Arc::new(RwLock::new( weight_records @@ -168,62 +165,62 @@ impl DayDetailViewModel { glib::spawn_future({ let s = self.clone(); async move { - if let Some(app) = s.app { - let weight_record = s.weight.read().unwrap().clone(); - match weight_record { - Some(RecordState::New(weight)) => { - let _ = app.put_record(TraxRecord::Weight(weight)).await; - } - Some(RecordState::Original(_)) => {} - Some(RecordState::Updated(weight)) => { - let _ = app - .update_record(Record { - id: weight.id, - data: TraxRecord::Weight(weight.data), - }) - .await; - } - Some(RecordState::Deleted(_)) => {} - None => {} + let weight_record = s.weight.read().unwrap().clone(); + match weight_record { + Some(RecordState::New(data)) => { + let _ = s.app.put_record(TraxRecord::Weight(data)).await; } - - let steps_record = s.steps.read().unwrap().clone(); - match steps_record { - Some(RecordState::New(steps)) => { - let _ = app.put_record(TraxRecord::Steps(steps)).await; - } - Some(RecordState::Original(_)) => {} - Some(RecordState::Updated(steps)) => { - let _ = app - .update_record(Record { - id: steps.id, - data: TraxRecord::Steps(steps.data), - }) - .await; - } - Some(RecordState::Deleted(_)) => {} - None => {} + Some(RecordState::Original(_)) => {} + Some(RecordState::Updated(weight)) => { + let _ = s + .app + .update_record(Record { + id: weight.id, + data: TraxRecord::Weight(weight.data), + }) + .await; } + Some(RecordState::Deleted(_)) => {} + None => {} + } - let records = s - .records - .write() - .unwrap() - .drain() - .map(|(_, record)| record) - .collect::>>(); + let steps_record = s.steps.read().unwrap().clone(); + match steps_record { + Some(RecordState::New(data)) => { + let _ = s.app.put_record(TraxRecord::Steps(data)).await; + } + Some(RecordState::Original(_)) => {} + Some(RecordState::Updated(steps)) => { + let _ = s + .app + .update_record(Record { + id: steps.id, + data: TraxRecord::Steps(steps.data), + }) + .await; + } + Some(RecordState::Deleted(_)) => {} + None => {} + } - for record in records { - match record { - RecordState::New(data) => { - let _ = app.put_record(data).await; - } - RecordState::Original(_) => {} - RecordState::Updated(r) => { - let _ = app.update_record(r.clone()).await; - } - RecordState::Deleted(_) => unimplemented!(), + let records = s + .records + .write() + .unwrap() + .drain() + .map(|(_, record)| record) + .collect::>>(); + + for record in records { + match record { + RecordState::New(data) => { + let _ = s.app.put_record(data).await; } + RecordState::Original(_) => {} + RecordState::Updated(r) => { + let _ = s.app.update_record(r.clone()).await; + } + RecordState::Deleted(_) => unimplemented!(), } } } diff --git a/fitnesstrax/app/src/views/day_detail_view.rs b/fitnesstrax/app/src/views/day_detail_view.rs index ae213fe..0f9b19c 100644 --- a/fitnesstrax/app/src/views/day_detail_view.rs +++ b/fitnesstrax/app/src/views/day_detail_view.rs @@ -25,7 +25,7 @@ use std::cell::RefCell; #[derive(Default)] pub struct DayDetailViewPrivate { container: Singleton, - view_model: RefCell, + view_model: RefCell>, } #[glib::object_subclass] @@ -47,7 +47,7 @@ glib::wrapper! { impl DayDetailView { pub fn new(view_model: DayDetailViewModel) -> Self { let s: Self = Object::builder().build(); - *s.imp().view_model.borrow_mut() = view_model; + *s.imp().view_model.borrow_mut() = Some(view_model); s.append(&s.imp().container); @@ -57,20 +57,28 @@ impl DayDetailView { } fn view(&self) { - self.imp() - .container - .swap(&DayDetail::new(self.imp().view_model.borrow().clone(), { - let s = self.clone(); - move || s.edit() - })); + let view_model = self.imp().view_model.borrow(); + let view_model = view_model + .as_ref() + .expect("DayDetailView has not been initialized with a view_model") + .clone(); + + self.imp().container.swap(&DayDetail::new(view_model, { + let s = self.clone(); + move || s.edit() + })); } fn edit(&self) { - self.imp() - .container - .swap(&DayEdit::new(self.imp().view_model.borrow().clone(), { - let s = self.clone(); - move || s.view() - })); + let view_model = self.imp().view_model.borrow(); + let view_model = view_model + .as_ref() + .expect("DayDetailView has not been initialized with a view_model") + .clone(); + + self.imp().container.swap(&DayEdit::new(view_model, { + let s = self.clone(); + move || s.view() + })); } }