From 96c42016805fe90c0b4863ec006246845bef87b6 Mon Sep 17 00:00:00 2001 From: Savanni D'Gerinel Date: Tue, 23 Jan 2024 08:28:39 -0500 Subject: [PATCH] Render time distance details in the day detail view --- fitnesstrax/app/src/components/day.rs | 51 +----- fitnesstrax/app/src/components/mod.rs | 2 +- .../app/src/components/time_distance.rs | 149 +++++++----------- 3 files changed, 67 insertions(+), 135 deletions(-) diff --git a/fitnesstrax/app/src/components/day.rs b/fitnesstrax/app/src/components/day.rs index dbc115e..09d03cf 100644 --- a/fitnesstrax/app/src/components/day.rs +++ b/fitnesstrax/app/src/components/day.rs @@ -28,6 +28,8 @@ use glib::Object; use gtk::{prelude::*, subclass::prelude::*}; use std::cell::RefCell; +use super::time_distance_detail; + pub struct DaySummaryPrivate { date: gtk::Label, } @@ -178,51 +180,10 @@ impl DayDetail { s.append(&top_row); - /* - records.into_iter().for_each(|record| { - let record_view = match record { - Record { - data: ft_core::TraxRecord::BikeRide(record), - .. - } => Some( - TimeDistanceView::new(ft_core::RecordType::BikeRide, record) - .upcast::(), - ), - Record { - data: ft_core::TraxRecord::Row(record), - .. - } => Some( - TimeDistanceView::new(ft_core::RecordType::Row, record).upcast::(), - ), - Record { - data: ft_core::TraxRecord::Run(record), - .. - } => Some( - TimeDistanceView::new(ft_core::RecordType::Row, record).upcast::(), - ), - Record { - data: ft_core::TraxRecord::Swim(record), - .. - } => Some( - TimeDistanceView::new(ft_core::RecordType::Row, record).upcast::(), - ), - Record { - data: ft_core::TraxRecord::Walk(record), - .. - } => Some( - TimeDistanceView::new(ft_core::RecordType::Row, record).upcast::(), - ), - _ => None, - }; - - if let Some(record_view) = record_view { - record_view.add_css_class("day-detail"); - record_view.set_halign(gtk::Align::Start); - - s.append(&record_view); - } - }); - */ + let records = view_model.time_distance_records(); + for emseries::Record { data, .. } in records { + s.append(&time_distance_detail(data)); + } s } diff --git a/fitnesstrax/app/src/components/mod.rs b/fitnesstrax/app/src/components/mod.rs index cdaa1b6..792db09 100644 --- a/fitnesstrax/app/src/components/mod.rs +++ b/fitnesstrax/app/src/components/mod.rs @@ -30,7 +30,7 @@ mod text_entry; pub use text_entry::{weight_field, TextEntry}; mod time_distance; -pub use time_distance::{time_distance_summary, TimeDistanceView}; +pub use time_distance::{time_distance_detail, time_distance_summary}; mod weight; pub use weight::WeightLabel; diff --git a/fitnesstrax/app/src/components/time_distance.rs b/fitnesstrax/app/src/components/time_distance.rs index ae91b5b..1ff3ba2 100644 --- a/fitnesstrax/app/src/components/time_distance.rs +++ b/fitnesstrax/app/src/components/time_distance.rs @@ -18,10 +18,7 @@ You should have received a copy of the GNU General Public License along with Fit // use chrono::{Local, NaiveDate}; // use dimensioned::si; use dimensioned::si; -use ft_core::TimeDistance; -use glib::Object; -use gtk::{prelude::*, subclass::prelude::*}; -use std::cell::RefCell; +use gtk::prelude::*; pub fn time_distance_summary( distance: si::Meter, @@ -44,89 +41,63 @@ pub fn time_distance_summary( text.map(|text| gtk::Label::new(Some(&text))) } -#[derive(Default)] -pub struct TimeDistanceViewPrivate { - #[allow(unused)] - record: RefCell>, -} - -#[glib::object_subclass] -impl ObjectSubclass for TimeDistanceViewPrivate { - const NAME: &'static str = "TimeDistanceView"; - type Type = TimeDistanceView; - type ParentType = gtk::Box; -} - -impl ObjectImpl for TimeDistanceViewPrivate {} -impl WidgetImpl for TimeDistanceViewPrivate {} -impl BoxImpl for TimeDistanceViewPrivate {} - -glib::wrapper! { - pub struct TimeDistanceView(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable; -} - -impl TimeDistanceView { - pub fn new(record: TimeDistance) -> Self { - let s: Self = Object::builder().build(); - s.set_orientation(gtk::Orientation::Vertical); - s.set_hexpand(true); - - let first_row = gtk::Box::builder().homogeneous(true).build(); - - first_row.append( - >k::Label::builder() - .halign(gtk::Align::Start) - .label(record.datetime.format("%H:%M").to_string()) - .build(), - ); - - /* - first_row.append( - >k::Label::builder() - .halign(gtk::Align::Start) - .label(format!("{:?}", type_)) - .build(), - ); - */ - - first_row.append( - >k::Label::builder() - .halign(gtk::Align::Start) - .label( - record - .distance - .map(|dist| format!("{}", dist)) - .unwrap_or("".to_owned()), - ) - .build(), - ); - - first_row.append( - >k::Label::builder() - .halign(gtk::Align::Start) - .label( - record - .duration - .map(|duration| format!("{}", duration)) - .unwrap_or("".to_owned()), - ) - .build(), - ); - - s.append(&first_row); - - s.append( - >k::Label::builder() - .halign(gtk::Align::Start) - .label( - record - .comments - .map(|comments| comments.to_string()) - .unwrap_or("".to_owned()), - ) - .build(), - ); - - s - } +pub fn time_distance_detail(record: ft_core::TimeDistance) -> gtk::Box { + let layout = gtk::Box::builder() + .orientation(gtk::Orientation::Vertical) + .hexpand(true) + .build(); + let first_row = gtk::Box::builder().homogeneous(true).build(); + + first_row.append( + >k::Label::builder() + .halign(gtk::Align::Start) + .label(record.datetime.format("%H:%M").to_string()) + .build(), + ); + + first_row.append( + >k::Label::builder() + .halign(gtk::Align::Start) + .label(format!("{:?}", record.activity)) + .build(), + ); + + first_row.append( + >k::Label::builder() + .halign(gtk::Align::Start) + .label( + record + .distance + .map(|dist| format!("{}", dist)) + .unwrap_or("".to_owned()), + ) + .build(), + ); + + first_row.append( + >k::Label::builder() + .halign(gtk::Align::Start) + .label( + record + .duration + .map(|duration| format!("{}", duration)) + .unwrap_or("".to_owned()), + ) + .build(), + ); + + layout.append(&first_row); + + layout.append( + >k::Label::builder() + .halign(gtk::Align::Start) + .label( + record + .comments + .map(|comments| comments.to_string()) + .unwrap_or("".to_owned()), + ) + .build(), + ); + layout }