From 2ac527bcbced2084072f636271d7c7d183f55d34 Mon Sep 17 00:00:00 2001 From: Byson94 Date: Wed, 29 Oct 2025 16:16:58 +0530 Subject: [PATCH] feat: mvoe from widget binding to notify_local --- .../ewwii/src/widgets/widget_definitions.rs | 385 ++++++++---------- 1 file changed, 161 insertions(+), 224 deletions(-) diff --git a/crates/ewwii/src/widgets/widget_definitions.rs b/crates/ewwii/src/widgets/widget_definitions.rs index 22bb937..6cd1a49 100644 --- a/crates/ewwii/src/widgets/widget_definitions.rs +++ b/crates/ewwii/src/widgets/widget_definitions.rs @@ -56,29 +56,6 @@ macro_rules! connect_signal_handler { }}; } -macro_rules! bind_property_once { - ($widget:ident, if $cond:expr, $bind_expr:expr) => {{ - const KEY: &str = std::concat!("bind-property:", std::line!()); - unsafe { - if !$cond { - return; - } - - if let Some(old_binding) = $widget.data::(KEY) { - old_binding.as_ref().unbind(); - } - - let new_binding: gtk4::glib::Binding = $bind_expr; - - $widget.set_data::(KEY, new_binding); - } - }}; - - ($widget:ident, $bind_expr:expr) => {{ - bind_property_once!($widget, if true, $bind_expr) - }}; -} - pub type UpdateFn = Box; pub struct WidgetEntry { @@ -990,20 +967,16 @@ pub(super) fn build_event_box( "spacing", |p, k| get_i32_prop(p, k, None), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "spacing") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = &obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_spacing(i); + } + }) ); }, |value| gtk_widget.set_spacing(value), @@ -1014,20 +987,16 @@ pub(super) fn build_event_box( "space_evenly", |p, k| get_bool_prop(p, k, None), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "homogeneous") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = &obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_homogeneous(i); + } + }) ); }, |value| gtk_widget.set_homogeneous(value), @@ -1136,20 +1105,16 @@ pub(crate) fn build_gtk_flowbox( "space_evenly", |p, k| get_bool_prop(p, k, None), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "homogeneous") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + return gtk_widget.set_homogeneous(i); + } + }) ); }, |value| gtk_widget.set_homogeneous(value), @@ -1230,12 +1195,14 @@ pub(super) fn build_gtk_stack( "selected", |p, k| get_i32_prop(p, k, None), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "visible_child_name") - .flags(glib::BindingFlags::SYNC_CREATE) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + widget.set_visible_child_name(&value); + }) ); }, |value| widget.set_visible_child_name(&value.to_string()), @@ -1545,20 +1512,16 @@ pub(super) fn build_gtk_progress( "flipped", |p, k| get_bool_prop(p, k, Some(false)), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "inverted") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + widget.set_inverted(i); + } + }) ); }, |value| widget.set_inverted(value), @@ -1569,20 +1532,16 @@ pub(super) fn build_gtk_progress( "value", |p, k| get_f64_prop(p, k, None), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "fraction") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + widget.set_fraction(i / 100f64); + } + }) ); }, |value| widget.set_fraction(value / 100f64), @@ -1990,12 +1949,14 @@ pub(super) fn build_gtk_button( "label", |p, k| get_string_prop(p, k, None), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "label") - .flags(glib::BindingFlags::SYNC_CREATE) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + widget.set_label(&value); + }) ); }, |value| widget.set_label(&value), @@ -2382,12 +2343,14 @@ pub(super) fn build_gtk_expander( "name", |p, k| get_string_prop(p, k, None), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "label") - .flags(glib::BindingFlags::SYNC_CREATE) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + widget.set_label(Some(&value)); + }) ); }, |value| widget.set_label(Some(&value)), @@ -2398,20 +2361,16 @@ pub(super) fn build_gtk_expander( "expanded", |p, k| get_bool_prop(p, k, None), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "expanded") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + widget.set_expanded(i); + } + }) ); }, |value| widget.set_expanded(value), @@ -2486,20 +2445,16 @@ pub(super) fn build_gtk_revealer( "reveal", |p, k| get_bool_prop(p, k, None), |signal| { - bind_property_once!( - widget, - signal.data - .bind_property("value", widget, "reveal_child") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let widget = widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + widget.set_reveal_child(i); + } + }) ); }, |value| widget.set_reveal_child(value), @@ -3071,20 +3026,16 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "vexpand", |p, k| get_bool_prop(p, k, Some(false)), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "vexpand") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_vexpand(i); + } + }) ); }, |value| gtk_widget.set_vexpand(value), @@ -3095,21 +3046,17 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "hexpand", |p, k| get_bool_prop(p, k, Some(false)), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "hexpand") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() - ); + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_hexpand(i); + } + }) + ); }, |value| gtk_widget.set_hexpand(value), ); @@ -3166,20 +3113,16 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "active", |p, k| get_bool_prop(p, k, Some(true)), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "sensitive") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_sensitive(i); + } + }) ); }, |value| gtk_widget.set_sensitive(value), @@ -3190,13 +3133,14 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "tooltip", |p, k| get_string_prop(p, k, None), |signal| { - bind_property_once!( - gtk_widget, - signal - .data - .bind_property("value", gtk_widget, "tooltip_text") - .flags(glib::BindingFlags::SYNC_CREATE) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + gtk_widget.set_tooltip_text(Some(&value)); + }) ); }, |value| gtk_widget.set_tooltip_text(Some(&value)), @@ -3207,20 +3151,16 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "can_target", |p, k| get_bool_prop(p, k, None), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "can_target") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_can_target(i); + } + }) ); }, |value| gtk_widget.set_can_target(value), @@ -3231,20 +3171,16 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "focusable", |p, k| get_bool_prop(p, k, Some(true)), |signal| { - bind_property_once!( - gtk_widget, - signal.data - .bind_property("value", gtk_widget, "focusable") - .flags(glib::BindingFlags::SYNC_CREATE) - .transform_to(|_, value: &glib::Value| { - if let Ok(s) = value.get::() { - if let Ok(i) = s.parse::() { - return Some(i.to_value()); - } - } - None - }) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + if let Ok(i) = value.parse::() { + gtk_widget.set_focusable(i); + } + }) ); }, |value| gtk_widget.set_focusable(value), @@ -3255,13 +3191,14 @@ pub(super) fn resolve_rhai_widget_attrs(gtk_widget: >k4::Widget, props: &Map) "widget_name", |p, k| get_string_prop(p, k, None), |signal| { - bind_property_once!( - gtk_widget, - signal - .data - .bind_property("value", gtk_widget, "widget_name") - .flags(glib::BindingFlags::SYNC_CREATE) - .build() + let gtk_widget = gtk_widget.clone(); + let signal_widget = signal.data; + connect_signal_handler!( + signal_widget, + signal_widget.connect_notify_local(Some("value"), move |obj, _| { + let value = obj.property::("value"); + gtk_widget.set_widget_name(&value); + }) ); }, |value| gtk_widget.set_widget_name(&value),