From c1e797f3aeae40677f4512748accb2f0061148d5 Mon Sep 17 00:00:00 2001 From: Savanni D'Gerinel Date: Thu, 1 Feb 2024 09:27:40 -0500 Subject: [PATCH] DayDetailViewModel now ignores records and directly retrieves data from App This is preparatory work. Having the view model directly retrieve data both adds a degree of symmetry (it both gets data from and sends data to the app) and makes it possible for the view model to refresh itself when needing to revert data or after saving data. --- fitnesstrax/app/src/app_window.rs | 27 +++++++------ fitnesstrax/app/src/view_models/day_detail.rs | 4 +- fitnesstrax/app/src/views/historical_view.rs | 39 ++++++++++--------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/fitnesstrax/app/src/app_window.rs b/fitnesstrax/app/src/app_window.rs index 75f6dbb..c473062 100644 --- a/fitnesstrax/app/src/app_window.rs +++ b/fitnesstrax/app/src/app_window.rs @@ -136,20 +136,19 @@ impl AppWindow { fn show_historical_view(&self, records: Vec>) { let view = View::Historical(HistoricalView::new(self.app.clone(), records, { let s = self.clone(); - Rc::new(move |date, records| { - let layout = gtk::Box::new(gtk::Orientation::Vertical, 0); - layout.append(&adw::HeaderBar::new()); - // layout.append(&DayDetailView::new(date, records, s.app.clone())); - layout.append(&DayDetailView::new(DayDetailViewModel::new( - date, - records, - s.app.clone(), - ))); - let page = &adw::NavigationPage::builder() - .title(date.format("%Y-%m-%d").to_string()) - .child(&layout) - .build(); - s.navigation.push(page); + Rc::new(move |date, _records| { + let s = s.clone(); + glib::spawn_future_local(async move { + let layout = gtk::Box::new(gtk::Orientation::Vertical, 0); + layout.append(&adw::HeaderBar::new()); + let view_model = DayDetailViewModel::new(date, s.app.clone()).await; + layout.append(&DayDetailView::new(view_model)); + let page = &adw::NavigationPage::builder() + .title(date.format("%Y-%m-%d").to_string()) + .child(&layout) + .build(); + s.navigation.push(page); + }); }) })); self.swap_main(view); diff --git a/fitnesstrax/app/src/view_models/day_detail.rs b/fitnesstrax/app/src/view_models/day_detail.rs index 0e9b5c9..fa5c39d 100644 --- a/fitnesstrax/app/src/view_models/day_detail.rs +++ b/fitnesstrax/app/src/view_models/day_detail.rs @@ -85,7 +85,9 @@ pub struct DayDetailViewModel { } impl DayDetailViewModel { - pub fn new(date: chrono::NaiveDate, records: Vec>, app: App) -> Self { + pub async fn new(date: chrono::NaiveDate, app: App) -> Self { + let records = app.records(date, date).await.unwrap(); + let (weight_records, records): (Vec>, Vec>) = records.into_iter().partition(|r| r.data.is_weight()); let (step_records, records): (Vec>, Vec>) = diff --git a/fitnesstrax/app/src/views/historical_view.rs b/fitnesstrax/app/src/views/historical_view.rs index 2e80e40..537481e 100644 --- a/fitnesstrax/app/src/views/historical_view.rs +++ b/fitnesstrax/app/src/views/historical_view.rs @@ -59,27 +59,28 @@ impl ObjectSubclass for HistoricalViewPrivate { factory.connect_bind({ let app = s.app.clone(); move |_, list_item| { - let records = list_item - .downcast_ref::() - .expect("should be a ListItem") - .item() - .and_downcast::() - .expect("should be a DaySummary"); + let app = app.clone(); + let list_item = list_item.clone(); + glib::spawn_future_local(async move { + let records = list_item + .downcast_ref::() + .expect("should be a ListItem") + .item() + .and_downcast::() + .expect("should be a DaySummary"); - let summary = list_item - .downcast_ref::() - .expect("should be a ListItem") - .child() - .and_downcast::() - .expect("should be a DaySummary"); + let summary = list_item + .downcast_ref::() + .expect("should be a ListItem") + .child() + .and_downcast::() + .expect("should be a DaySummary"); - if let Some(app) = app.borrow().clone() { - summary.set_data(DayDetailViewModel::new( - records.date(), - records.records(), - app.clone(), - )); - } + if let Some(app) = app.borrow().clone() { + let view_model = DayDetailViewModel::new(records.date(), app.clone()).await; + summary.set_data(view_model); + } + }); } });