relm4/binding/
widgets.rs

1use crate::RelmObjectExt;
2
3use super::{Binding, ConnectBinding};
4
5macro_rules! impl_connect_binding {
6    ($ty:ty, $target:ty, $primary_prop:literal, $mod:ident) => {
7        impl_connect_binding!($ty, $target, $primary_prop, $mod, gtk::glib::Object::new());
8    };
9    ($ty:ty, $target:ty, $primary_prop:literal, $mod:ident, $test_init:expr) => {
10        #[doc = "Create a data binding to the primary property `"]
11        #[doc = $primary_prop]
12        #[doc = "` with type [`"]
13        #[doc = stringify!($target)]
14        #[doc = "`]."]
15        impl ConnectBinding for $ty {
16            type Target = $target;
17
18            fn bind<B: Binding<Target = Self::Target>>(&self, binding: &B) {
19                self.add_binding(binding, $primary_prop);
20            }
21        }
22
23        #[cfg(test)]
24        mod $mod {
25            use gtk::prelude::ObjectExt;
26
27            #[gtk::test]
28            /// Test whether the property name and type are correct.
29            fn test() {
30                let obj: $ty = $test_init;
31                let data: $target = Default::default();
32                obj.set_property($primary_prop, data);
33            }
34        }
35    };
36}
37
38// bool bindings
39impl_connect_binding!(gtk::CheckButton, bool, "active", check_button);
40impl_connect_binding!(gtk::ToggleButton, bool, "active", toggle_button);
41impl_connect_binding!(gtk::Switch, bool, "active", switch);
42impl_connect_binding!(gtk::Spinner, bool, "spinning", spinner);
43impl_connect_binding!(gtk::Popover, bool, "visible", popover);
44impl_connect_binding!(gtk::Revealer, bool, "reveal-child", revealer);
45#[cfg(all(feature = "libadwaita", feature = "gnome_45"))]
46impl_connect_binding!(adw::SwitchRow, bool, "active", switch_row);
47#[cfg(feature = "libadwaita")]
48impl_connect_binding!(adw::ExpanderRow, bool, "expanded", expander_row);
49
50// f64 bindings
51impl_connect_binding!(gtk::SpinButton, f64, "value", spin_button);
52impl_connect_binding!(gtk::Adjustment, f64, "value", adjustment);
53impl_connect_binding!(gtk::ScaleButton, f64, "value", scale_button);
54#[cfg(all(feature = "libadwaita", feature = "gnome_45"))]
55impl_connect_binding!(adw::SpinRow, f64, "value", spin_row);
56
57// String bindings
58impl_connect_binding!(gtk::Label, String, "label", label);
59impl_connect_binding!(gtk::Button, String, "label", button);
60impl_connect_binding!(gtk::LinkButton, String, "uri", link_button);
61impl_connect_binding!(gtk::MenuButton, String, "label", menu_button);
62impl_connect_binding!(gtk::Image, String, "icon-name", image);
63impl_connect_binding!(gtk::StackPage, String, "name", stack_page, {
64    let stack = gtk::Stack::default();
65    stack.add_child(&gtk::Label::default())
66});
67#[cfg(feature = "libadwaita")]
68impl_connect_binding!(adw::SplitButton, String, "label", split_button);
69#[cfg(feature = "libadwaita")]
70impl_connect_binding!(adw::ButtonContent, String, "label", button_content);
71#[cfg(feature = "libadwaita")]
72impl_connect_binding!(adw::PreferencesRow, String, "title", preferences_row);
73#[cfg(feature = "libadwaita")]
74impl_connect_binding!(adw::ActionRow, String, "title", action_row);
75#[cfg(all(feature = "libadwaita", feature = "gnome_47"))]
76impl_connect_binding!(adw::ButtonRow, String, "title", button_row);
77#[cfg(feature = "libadwaita")]
78impl_connect_binding!(adw::WindowTitle, String, "title", window_title);
79#[cfg(all(feature = "libadwaita", feature = "gnome_44"))]
80impl_connect_binding!(adw::Banner, String, "title", banner);