Make the day summary use the view model
This commit is contained in:
parent
9461c387fe
commit
7ec48ded5d
|
@ -134,7 +134,7 @@ impl AppWindow {
|
|||
}
|
||||
|
||||
fn show_historical_view(&self, records: Vec<Record<TraxRecord>>) {
|
||||
let view = View::Historical(HistoricalView::new(records, {
|
||||
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);
|
||||
|
|
|
@ -20,14 +20,12 @@ use crate::{
|
|||
components::{steps_editor, weight_editor, ActionGroup, Steps, Weight},
|
||||
view_models::DayDetailViewModel,
|
||||
};
|
||||
use emseries::Record;
|
||||
use glib::Object;
|
||||
use gtk::{prelude::*, subclass::prelude::*};
|
||||
use std::cell::RefCell;
|
||||
|
||||
pub struct DaySummaryPrivate {
|
||||
date: gtk::Label,
|
||||
weight: RefCell<Option<gtk::Label>>,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
|
@ -41,10 +39,7 @@ impl ObjectSubclass for DaySummaryPrivate {
|
|||
.css_classes(["day-summary__date"])
|
||||
.halign(gtk::Align::Start)
|
||||
.build();
|
||||
Self {
|
||||
date,
|
||||
weight: RefCell::new(None),
|
||||
}
|
||||
Self { date }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -75,37 +70,34 @@ impl DaySummary {
|
|||
Self::default()
|
||||
}
|
||||
|
||||
pub fn set_data(&self, date: chrono::NaiveDate, records: Vec<Record<ft_core::TraxRecord>>) {
|
||||
pub fn set_data(&self, view_model: DayDetailViewModel) {
|
||||
self.imp()
|
||||
.date
|
||||
.set_text(&date.format("%Y-%m-%d").to_string());
|
||||
.set_text(&view_model.date.format("%Y-%m-%d").to_string());
|
||||
|
||||
if let Some(ref weight_label) = *self.imp().weight.borrow() {
|
||||
self.remove(weight_label);
|
||||
}
|
||||
let row = gtk::Box::builder().build();
|
||||
|
||||
if let Some(Record {
|
||||
data: ft_core::TraxRecord::Weight(weight_record),
|
||||
..
|
||||
}) = records.iter().find(|f| f.data.is_weight())
|
||||
{
|
||||
let label = gtk::Label::builder()
|
||||
.halign(gtk::Align::Start)
|
||||
.label(weight_record.weight.to_string())
|
||||
.css_classes(["day-summary__weight"])
|
||||
.build();
|
||||
self.append(&label);
|
||||
*self.imp().weight.borrow_mut() = Some(label);
|
||||
if let Some(w) = view_model.weight() {
|
||||
label.set_label(&w.to_string())
|
||||
}
|
||||
row.append(&label);
|
||||
|
||||
/*
|
||||
self.append(
|
||||
>k::Label::builder()
|
||||
self.append(&label);
|
||||
|
||||
let label = gtk::Label::builder()
|
||||
.halign(gtk::Align::Start)
|
||||
.label("15km of biking in 60 minutes")
|
||||
.build(),
|
||||
);
|
||||
*/
|
||||
.css_classes(["day-summary__weight"])
|
||||
.build();
|
||||
if let Some(s) = view_model.steps() {
|
||||
label.set_label(&format!("{} steps", s.to_string()));
|
||||
}
|
||||
row.append(&label);
|
||||
|
||||
self.append(&row);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -186,6 +186,24 @@ impl DayDetailViewModel {
|
|||
None => {}
|
||||
}
|
||||
|
||||
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 => {}
|
||||
}
|
||||
|
||||
let records = s
|
||||
.records
|
||||
.write()
|
||||
|
|
|
@ -14,7 +14,9 @@ General Public License for more details.
|
|||
You should have received a copy of the GNU General Public License along with FitnessTrax. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use crate::{components::DaySummary, types::DayInterval};
|
||||
use crate::{
|
||||
app::App, components::DaySummary, types::DayInterval, view_models::DayDetailViewModel,
|
||||
};
|
||||
use chrono::NaiveDate;
|
||||
use emseries::Record;
|
||||
use ft_core::TraxRecord;
|
||||
|
@ -26,7 +28,8 @@ use std::{cell::RefCell, collections::HashMap, rc::Rc};
|
|||
/// daily summaries, daily details, and will provide all functions the user may need for editing
|
||||
/// records.
|
||||
pub struct HistoricalViewPrivate {
|
||||
time_window: RefCell<DayInterval>,
|
||||
app: Rc<RefCell<Option<App>>>,
|
||||
time_window: Rc<RefCell<DayInterval>>,
|
||||
list_view: gtk::ListView,
|
||||
}
|
||||
|
||||
|
@ -45,7 +48,17 @@ impl ObjectSubclass for HistoricalViewPrivate {
|
|||
.set_child(Some(&DaySummary::new()));
|
||||
});
|
||||
|
||||
factory.connect_bind(move |_, list_item| {
|
||||
let s = Self {
|
||||
app: Rc::new(RefCell::new(None)),
|
||||
time_window: Rc::new(RefCell::new(DayInterval::default())),
|
||||
list_view: gtk::ListView::builder()
|
||||
.factory(&factory)
|
||||
.single_click_activate(true)
|
||||
.build(),
|
||||
};
|
||||
factory.connect_bind({
|
||||
let app = s.app.clone();
|
||||
move |_, list_item| {
|
||||
let records = list_item
|
||||
.downcast_ref::<gtk::ListItem>()
|
||||
.expect("should be a ListItem")
|
||||
|
@ -60,16 +73,17 @@ impl ObjectSubclass for HistoricalViewPrivate {
|
|||
.and_downcast::<DaySummary>()
|
||||
.expect("should be a DaySummary");
|
||||
|
||||
summary.set_data(records.date(), records.records());
|
||||
if let Some(app) = app.borrow().clone() {
|
||||
summary.set_data(DayDetailViewModel::new(
|
||||
records.date(),
|
||||
records.records(),
|
||||
app.clone(),
|
||||
));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Self {
|
||||
time_window: RefCell::new(DayInterval::default()),
|
||||
list_view: gtk::ListView::builder()
|
||||
.factory(&factory)
|
||||
.single_click_activate(true)
|
||||
.build(),
|
||||
}
|
||||
s
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,7 +96,11 @@ glib::wrapper! {
|
|||
}
|
||||
|
||||
impl HistoricalView {
|
||||
pub fn new<SelectFn>(records: Vec<Record<TraxRecord>>, on_select_day: Rc<SelectFn>) -> Self
|
||||
pub fn new<SelectFn>(
|
||||
app: App,
|
||||
records: Vec<Record<TraxRecord>>,
|
||||
on_select_day: Rc<SelectFn>,
|
||||
) -> Self
|
||||
where
|
||||
SelectFn: Fn(chrono::NaiveDate, Vec<Record<TraxRecord>>) + 'static,
|
||||
{
|
||||
|
@ -90,6 +108,8 @@ impl HistoricalView {
|
|||
s.set_orientation(gtk::Orientation::Vertical);
|
||||
s.set_css_classes(&["historical"]);
|
||||
|
||||
*s.imp().app.borrow_mut() = Some(app);
|
||||
|
||||
let grouped_records =
|
||||
GroupedRecords::new((*s.imp().time_window.borrow()).clone()).with_data(records);
|
||||
|
||||
|
|
Loading…
Reference in New Issue