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 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
38impl_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
50impl_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
57impl_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(>k::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);