From de83f1fb69e0a98779b8141b8004d31b7ce4ad56 Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Sat, 17 Oct 2020 20:41:33 +0200 Subject: [PATCH] Add calendar widget --- src/widgets/widget_definitions.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/widgets/widget_definitions.rs b/src/widgets/widget_definitions.rs index 7366b13..cae302a 100644 --- a/src/widgets/widget_definitions.rs +++ b/src/widgets/widget_definitions.rs @@ -25,6 +25,7 @@ pub(super) fn widget_to_gtk_widget(bargs: &mut BuilderArgs) -> Result build_gtk_aspect_frame(bargs)?.upcast(), "literal" => build_gtk_literal(bargs)?.upcast(), "input" => build_gtk_input(bargs)?.upcast(), + "calendar" => build_gtk_calendar(bargs)?.upcast(), _ => return Ok(None), }; Ok(Some(gtk_widget)) @@ -242,6 +243,35 @@ fn build_gtk_literal(bargs: &mut BuilderArgs) -> Result { Ok(gtk_widget) } +fn build_gtk_calendar(bargs: &mut BuilderArgs) -> Result { + let gtk_widget = gtk::Calendar::new(); + let on_click_handler_id: Rc>> = Rc::new(RefCell::new(None)); + resolve_block!(bargs, gtk_widget, { + prop(day: as_f64) { gtk_widget.set_property_day(day as i32) }, + prop(month: as_f64) { gtk_widget.set_property_day(month as i32) }, + prop(year: as_f64) { gtk_widget.set_property_day(year as i32) }, + prop(show_details: as_bool) { gtk_widget.set_property_show_details(show_details) }, + prop(show_heading: as_bool) { gtk_widget.set_property_show_details(show_heading) }, + prop(show_day_names: as_bool) { gtk_widget.set_property_show_day_names(show_day_names) }, + prop(show_week_numbers: as_bool) { gtk_widget.set_property_show_week_numbers(show_week_numbers) }, + prop(show_heading: as_bool) { gtk_widget.set_property_show_heading(show_heading) }, + prop(onclick: as_string) { + let old_id = on_click_handler_id.replace(Some( + gtk_widget.connect_day_selected(move |w| { + run_command( + &onclick, + format!("{}.{}.{}", w.get_property_day(), w.get_property_month(), w.get_property_year()) + ) + }) + )); + old_id.map(|id| gtk_widget.disconnect(id)); + } + + }); + + Ok(gtk_widget) +} + fn build_gtk_aspect_frame(_bargs: &mut BuilderArgs) -> Result { let gtk_widget = gtk::AspectFrame::new(None, 0.5, 0.5, 1.0, true); Ok(gtk_widget)