71 lines
1.6 KiB
Rust
71 lines
1.6 KiB
Rust
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()
|
|
));
|
|
}
|
|
}
|