Thoroughly fill out the day detail view model along with proper automated testing #179

Merged
savanni merged 7 commits from fitnesstrax/improved-view-model into main 2024-02-07 15:08:50 +00:00
3 changed files with 36 additions and 34 deletions
Showing only changes of commit c1e797f3ae - Show all commits

View File

@ -136,20 +136,19 @@ impl AppWindow {
fn show_historical_view(&self, records: Vec<Record<TraxRecord>>) { fn show_historical_view(&self, records: Vec<Record<TraxRecord>>) {
let view = View::Historical(HistoricalView::new(self.app.clone(), records, { let view = View::Historical(HistoricalView::new(self.app.clone(), records, {
let s = self.clone(); let s = self.clone();
Rc::new(move |date, records| { Rc::new(move |date, _records| {
let layout = gtk::Box::new(gtk::Orientation::Vertical, 0); let s = s.clone();
layout.append(&adw::HeaderBar::new()); glib::spawn_future_local(async move {
// layout.append(&DayDetailView::new(date, records, s.app.clone())); let layout = gtk::Box::new(gtk::Orientation::Vertical, 0);
layout.append(&DayDetailView::new(DayDetailViewModel::new( layout.append(&adw::HeaderBar::new());
date, let view_model = DayDetailViewModel::new(date, s.app.clone()).await;
records, layout.append(&DayDetailView::new(view_model));
s.app.clone(), let page = &adw::NavigationPage::builder()
))); .title(date.format("%Y-%m-%d").to_string())
let page = &adw::NavigationPage::builder() .child(&layout)
.title(date.format("%Y-%m-%d").to_string()) .build();
.child(&layout) s.navigation.push(page);
.build(); });
s.navigation.push(page);
}) })
})); }));
self.swap_main(view); self.swap_main(view);

View File

@ -85,7 +85,9 @@ pub struct DayDetailViewModel {
} }
impl DayDetailViewModel { impl DayDetailViewModel {
pub fn new(date: chrono::NaiveDate, records: Vec<Record<TraxRecord>>, 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<Record<TraxRecord>>, Vec<Record<TraxRecord>>) = let (weight_records, records): (Vec<Record<TraxRecord>>, Vec<Record<TraxRecord>>) =
records.into_iter().partition(|r| r.data.is_weight()); records.into_iter().partition(|r| r.data.is_weight());
let (step_records, records): (Vec<Record<TraxRecord>>, Vec<Record<TraxRecord>>) = let (step_records, records): (Vec<Record<TraxRecord>>, Vec<Record<TraxRecord>>) =

View File

@ -59,27 +59,28 @@ impl ObjectSubclass for HistoricalViewPrivate {
factory.connect_bind({ factory.connect_bind({
let app = s.app.clone(); let app = s.app.clone();
move |_, list_item| { move |_, list_item| {
let records = list_item let app = app.clone();
.downcast_ref::<gtk::ListItem>() let list_item = list_item.clone();
.expect("should be a ListItem") glib::spawn_future_local(async move {
.item() let records = list_item
.and_downcast::<DayRecords>() .downcast_ref::<gtk::ListItem>()
.expect("should be a DaySummary"); .expect("should be a ListItem")
.item()
.and_downcast::<DayRecords>()
.expect("should be a DaySummary");
let summary = list_item let summary = list_item
.downcast_ref::<gtk::ListItem>() .downcast_ref::<gtk::ListItem>()
.expect("should be a ListItem") .expect("should be a ListItem")
.child() .child()
.and_downcast::<DaySummary>() .and_downcast::<DaySummary>()
.expect("should be a DaySummary"); .expect("should be a DaySummary");
if let Some(app) = app.borrow().clone() { if let Some(app) = app.borrow().clone() {
summary.set_data(DayDetailViewModel::new( let view_model = DayDetailViewModel::new(records.date(), app.clone()).await;
records.date(), summary.set_data(view_model);
records.records(), }
app.clone(), });
));
}
} }
}); });