use chrono::Datelike; use glib::Object; use gtk::{prelude::*, subclass::prelude::*}; use ifc::IFC; use std::{cell::RefCell, rc::Rc}; pub struct DatePrivate { date: Rc<RefCell<IFC>>, label: Rc<RefCell<gtk::Label>>, } impl Default for DatePrivate { fn default() -> Self { let date = chrono::Local::now().date_naive(); let year = date.year(); let date = date.with_year(year + 10000).unwrap(); Self { date: Rc::new(RefCell::new(IFC::from(date))), label: Rc::new(RefCell::new(gtk::Label::new(None))), } } } #[glib::object_subclass] impl ObjectSubclass for DatePrivate { const NAME: &'static str = "Date"; type Type = Date; type ParentType = gtk::Box; } impl ObjectImpl for DatePrivate {} impl WidgetImpl for DatePrivate {} impl BoxImpl for DatePrivate {} glib::wrapper! { pub struct Date(ObjectSubclass<DatePrivate>) @extends gtk::Box, gtk::Widget; } impl Default for Date { fn default() -> Self { let s: Self = Object::builder().build(); s.set_margin_bottom(8); s.set_margin_top(8); s.set_margin_start(8); s.set_margin_end(8); s.append(&*s.imp().label.borrow()); s.redraw(); s } } impl Date { pub fn update_date(&self, date: IFC) { *self.imp().date.borrow_mut() = date; self.redraw(); } fn redraw(&self) { let date = self.imp().date.borrow().clone(); self.imp().label.borrow_mut().set_text(&format!( "{:?}, {:?} {}, {}", date.weekday(), date.month(), date.day(), date.year() )); } }