diff --git a/fitnesstrax/app/src/components/day.rs b/fitnesstrax/app/src/components/day.rs index 0b8791f..dbc115e 100644 --- a/fitnesstrax/app/src/components/day.rs +++ b/fitnesstrax/app/src/components/day.rs @@ -17,10 +17,13 @@ You should have received a copy of the GNU General Public License along with Fit // use chrono::NaiveDate; // use ft_core::TraxRecord; use crate::{ - components::{steps_editor, weight_field, ActionGroup, Steps, WeightLabel}, + components::{ + steps_editor, time_distance_summary, weight_field, ActionGroup, Steps, WeightLabel, + }, types::WeightFormatter, view_models::DayDetailViewModel, }; +use ft_core::TimeDistanceActivity; use glib::Object; use gtk::{prelude::*, subclass::prelude::*}; use std::cell::RefCell; @@ -97,8 +100,12 @@ impl DaySummary { label.set_label(&format!("{} steps", s)); } row.append(&label); - self.append(&row); + + let biking_summary = view_model.time_distance_summary(TimeDistanceActivity::BikeRide); + if let Some(label) = time_distance_summary(biking_summary.0, biking_summary.1) { + self.append(&label); + } } } diff --git a/fitnesstrax/app/src/components/mod.rs b/fitnesstrax/app/src/components/mod.rs index b6c0fe3..cdaa1b6 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::TimeDistanceView; +pub use time_distance::{time_distance_summary, TimeDistanceView}; 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 2721002..ae91b5b 100644 --- a/fitnesstrax/app/src/components/time_distance.rs +++ b/fitnesstrax/app/src/components/time_distance.rs @@ -17,11 +17,33 @@ You should have received a copy of the GNU General Public License along with Fit // use crate::components::{EditView, ParseError, TextEntry}; // 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; +pub fn time_distance_summary( + distance: si::Meter, + duration: si::Second, +) -> Option { + let text = match (distance > si::M, duration > si::S) { + (true, true) => Some(format!( + "{} kilometers of biking in {} minutes", + distance.value_unsafe / 1000., + duration.value_unsafe / 60. + )), + (true, false) => Some(format!( + "{} kilometers of biking", + distance.value_unsafe / 1000. + )), + (false, true) => Some(format!("{} seconds of biking", duration.value_unsafe / 60.)), + (false, false) => None, + }; + + text.map(|text| gtk::Label::new(Some(&text))) +} + #[derive(Default)] pub struct TimeDistanceViewPrivate { #[allow(unused)] diff --git a/fitnesstrax/app/src/view_models/day_detail.rs b/fitnesstrax/app/src/view_models/day_detail.rs index 0f651bd..f0975d7 100644 --- a/fitnesstrax/app/src/view_models/day_detail.rs +++ b/fitnesstrax/app/src/view_models/day_detail.rs @@ -36,16 +36,6 @@ enum RecordState { } impl RecordState { - #[allow(unused)] - fn id(&self) -> Option<&RecordId> { - match self { - RecordState::Original(ref r) => Some(&r.id), - RecordState::New(ref r) => None, - RecordState::Updated(ref r) => Some(&r.id), - RecordState::Deleted(ref r) => Some(&r.id), - } - } - fn exists(&self) -> bool { match self { RecordState::Original(_) => true, @@ -55,6 +45,16 @@ impl RecordState { } } + #[allow(unused)] + fn data(&self) -> Option<&Record> { + match self { + RecordState::Original(ref r) => Some(r), + RecordState::New(ref r) => None, + RecordState::Updated(ref r) => Some(r), + RecordState::Deleted(ref r) => Some(r), + } + } + fn set_value(&mut self, value: T) { *self = match self { RecordState::Original(r) => RecordState::Updated(Record {