Filter the historical list according to a date picker #194
|
@ -20,13 +20,6 @@ use glib::Object;
|
||||||
use gtk::{prelude::*, subclass::prelude::*};
|
use gtk::{prelude::*, subclass::prelude::*};
|
||||||
use std::{cell::RefCell, rc::Rc};
|
use std::{cell::RefCell, rc::Rc};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
enum Part {
|
|
||||||
Year,
|
|
||||||
Month,
|
|
||||||
Day,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct DateFieldPrivate {
|
pub struct DateFieldPrivate {
|
||||||
date: Rc<RefCell<chrono::NaiveDate>>,
|
date: Rc<RefCell<chrono::NaiveDate>>,
|
||||||
year: TextEntry<i32>,
|
year: TextEntry<i32>,
|
||||||
|
@ -140,7 +133,7 @@ impl DateField {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn date(&self) -> chrono::NaiveDate {
|
pub fn date(&self) -> chrono::NaiveDate {
|
||||||
self.imp().date.borrow().clone()
|
*self.imp().date.borrow()
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
pub fn is_valid(&self) -> bool {
|
pub fn is_valid(&self) -> bool {
|
||||||
|
|
|
@ -15,15 +15,13 @@ You should have received a copy of the GNU General Public License along with Fit
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app::App,
|
components::{DateField},
|
||||||
components::{DateField, DaySummary},
|
|
||||||
types::DayInterval,
|
types::DayInterval,
|
||||||
view_models::DayDetailViewModel,
|
|
||||||
};
|
};
|
||||||
use chrono::{Duration, Local, Months};
|
use chrono::{Duration, Local, Months};
|
||||||
use glib::Object;
|
use glib::Object;
|
||||||
use gtk::{prelude::*, subclass::prelude::*};
|
use gtk::{prelude::*, subclass::prelude::*};
|
||||||
use std::{cell::RefCell, rc::Rc};
|
use std::{cell::RefCell};
|
||||||
|
|
||||||
type OnSearch = dyn Fn(DayInterval) + 'static;
|
type OnSearch = dyn Fn(DayInterval) + 'static;
|
||||||
|
|
||||||
|
@ -58,8 +56,31 @@ glib::wrapper! {
|
||||||
pub struct DateRangePicker(ObjectSubclass<DateRangePickerPrivate>) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable;
|
pub struct DateRangePicker(ObjectSubclass<DateRangePickerPrivate>) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl DateRangePicker {
|
impl DateRangePicker {
|
||||||
pub fn new() -> Self {
|
pub fn connect_on_search<OnSearch>(&self, f: OnSearch)
|
||||||
|
where
|
||||||
|
OnSearch: Fn(DayInterval) + 'static,
|
||||||
|
{
|
||||||
|
*self.imp().on_search.borrow_mut() = Box::new(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_interval(&self, start: chrono::NaiveDate, end: chrono::NaiveDate) {
|
||||||
|
self.imp().start.set_date(start);
|
||||||
|
self.imp().end.set_date(end);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn interval(&self) -> DayInterval {
|
||||||
|
DayInterval {
|
||||||
|
start: self.imp().start.date(),
|
||||||
|
end: self.imp().end.date(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl Default for DateRangePicker {
|
||||||
|
fn default() -> Self {
|
||||||
let s: Self = Object::builder().build();
|
let s: Self = Object::builder().build();
|
||||||
s.set_orientation(gtk::Orientation::Vertical);
|
s.set_orientation(gtk::Orientation::Vertical);
|
||||||
|
|
||||||
|
@ -146,23 +167,4 @@ impl DateRangePicker {
|
||||||
|
|
||||||
s
|
s
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn connect_on_search<OnSearch>(&self, f: OnSearch)
|
|
||||||
where
|
|
||||||
OnSearch: Fn(DayInterval) + 'static,
|
|
||||||
{
|
|
||||||
*self.imp().on_search.borrow_mut() = Box::new(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_interval(&self, start: chrono::NaiveDate, end: chrono::NaiveDate) {
|
|
||||||
self.imp().start.set_date(start);
|
|
||||||
self.imp().end.set_date(end);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn interval(&self) -> DayInterval {
|
|
||||||
DayInterval {
|
|
||||||
start: self.imp().start.date(),
|
|
||||||
end: self.imp().end.date(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,10 +109,6 @@ impl<T: Clone + std::fmt::Debug + 'static> TextEntry<T> {
|
||||||
self.widget.add_css_class(class_);
|
self.widget.add_css_class(class_);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_css_class(&self, class_: &str) {
|
|
||||||
self.widget.remove_css_class(class_);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn widget(&self) -> gtk::Widget {
|
pub fn widget(&self) -> gtk::Widget {
|
||||||
self.widget.clone().upcast::<gtk::Widget>()
|
self.widget.clone().upcast::<gtk::Widget>()
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,6 @@ use std::{cell::RefCell, rc::Rc};
|
||||||
/// records.
|
/// records.
|
||||||
pub struct HistoricalViewPrivate {
|
pub struct HistoricalViewPrivate {
|
||||||
app: Rc<RefCell<Option<App>>>,
|
app: Rc<RefCell<Option<App>>>,
|
||||||
time_window: Rc<RefCell<DayInterval>>,
|
|
||||||
list_view: gtk::ListView,
|
list_view: gtk::ListView,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +49,6 @@ impl ObjectSubclass for HistoricalViewPrivate {
|
||||||
|
|
||||||
let s = Self {
|
let s = Self {
|
||||||
app: Rc::new(RefCell::new(None)),
|
app: Rc::new(RefCell::new(None)),
|
||||||
time_window: Rc::new(RefCell::new(DayInterval::default())),
|
|
||||||
list_view: gtk::ListView::builder()
|
list_view: gtk::ListView::builder()
|
||||||
.factory(&factory)
|
.factory(&factory)
|
||||||
.single_click_activate(true)
|
.single_click_activate(true)
|
||||||
|
@ -108,7 +106,7 @@ impl HistoricalView {
|
||||||
|
|
||||||
*s.imp().app.borrow_mut() = Some(app);
|
*s.imp().app.borrow_mut() = Some(app);
|
||||||
|
|
||||||
let date_range_picker = DateRangePicker::new();
|
let date_range_picker = DateRangePicker::default();
|
||||||
date_range_picker.connect_on_search({
|
date_range_picker.connect_on_search({
|
||||||
let s = s.clone();
|
let s = s.clone();
|
||||||
move |interval| s.set_interval(interval)
|
move |interval| s.set_interval(interval)
|
||||||
|
|
Loading…
Reference in New Issue