Binding

Trait Binding 

Source
pub trait Binding: Clone + IsA<Object> {
    type Target;

    // Required methods
    fn get(&self) -> Self::Target;
    fn set(&self, value: Self::Target);

    // Provided methods
    fn property_name() -> &'static str { ... }
    fn guard(&self) -> BindingGuard<Self> { ... }
}
Expand description

A glib::Object with one primary property.

Required Associated Types§

Source

type Target

The type of the primary property.

Required Methods§

Source

fn get(&self) -> Self::Target

Get the value of the primary property.

Source

fn set(&self, value: Self::Target)

Set the value of the primary property.

Provided Methods§

Source

fn property_name() -> &'static str

The name of the primary property.

Source

fn guard(&self) -> BindingGuard<Self>

Get a new BindingGuard from the object.

Once dropped, the BindingGuard will automatically update the value of the primary property.

Examples found in repository?
relm4/examples/data_binding.rs (line 80)
79    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
80        let mut value = self.value.guard();
81        println!("Value: {}", *value);
82
83        let mut margin_left = self.left_margin.guard();
84
85        match msg {
86            Msg::Increment => {
87                *value = false;
88                *margin_left += 1.7;
89                self.counter = self.counter.wrapping_add(1);
90            }
91            Msg::Decrement => {
92                *value = true;
93                self.counter = self.counter.wrapping_sub(1);
94            }
95        }
96
97        *self.text.guard() = format!("Counter: {}", self.counter);
98    }
More examples
Hide additional examples
relm4/examples/typed_list_view_async.rs (line 96)
84    fn bind(&mut self, widgets: &mut Self::Widgets, _root: &mut Self::Root) {
85        println!("Unbind {}", self.value);
86        let Widgets {
87            label,
88            label2,
89            button,
90        } = widgets;
91
92        let future_binding = self.binding.clone();
93        self.handle = Some(relm4::spawn_local(async move {
94            loop {
95                tokio::time::sleep(Duration::from_secs(1)).await;
96                let mut guard = future_binding.guard();
97                *guard = guard.wrapping_add(1);
98            }
99        }));
100
101        label.set_label(&format!("Value: {} ", self.value));
102        label2.add_write_only_binding(&self.binding, "label");
103        button.set_active(self.value.is_multiple_of(2));
104    }
105
106    fn unbind(&mut self, _widgets: &mut Self::Widgets, _root: &mut Self::Root) {
107        self.handle
108            .take()
109            .unwrap()
110            .into_source_id()
111            .unwrap()
112            .remove();
113        *self.binding.guard() = 0;
114    }
relm4/examples/typed_column_view.rs (line 186)
170    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
171        match msg {
172            Msg::Append => {
173                // Add 10 items
174                for _ in 0..10 {
175                    self.counter = self.counter.wrapping_add(1);
176                    self.view_wrapper.append(MyListItem::new(self.counter));
177                }
178
179                self.view_wrapper
180                    .iter()
181                    .for_each(|row| println!("item {}", row.borrow().value));
182
183                // Count up the first item
184                let first_item = self.view_wrapper.get(0).unwrap();
185                let first_binding = &mut first_item.borrow_mut().binding;
186                let mut guard = first_binding.guard();
187                *guard += 1;
188            }
189            Msg::Remove => {
190                // Remove the second item
191                self.view_wrapper.remove(1);
192            }
193            Msg::OnlyShowEven(show_only_even) => {
194                // Disable or enable the first filter
195                self.view_wrapper.set_filter_status(0, show_only_even);
196            }
197        }
198    }
relm4/examples/typed_grid_view.rs (line 179)
163    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
164        match msg {
165            Msg::Append => {
166                // Add 10 items
167                for _ in 0..10 {
168                    self.counter = self.counter.wrapping_add(1);
169                    self.grid_view_wrapper.append(MyGridItem::new(self.counter));
170                }
171
172                self.grid_view_wrapper
173                    .iter()
174                    .for_each(|row| println!("item {}", row.borrow().value));
175
176                // Count up the first item
177                let first_item = self.grid_view_wrapper.get(0).unwrap();
178                let first_binding = &mut first_item.borrow_mut().binding;
179                let mut guard = first_binding.guard();
180                *guard += 1;
181            }
182            Msg::Remove => {
183                // Remove the second item
184                self.grid_view_wrapper.remove(1);
185            }
186            Msg::OnlyShowEven(show_only_even) => {
187                // Disable or enable the first filter
188                self.grid_view_wrapper.set_filter_status(0, show_only_even);
189            }
190        }
191    }
relm4/examples/typed_list_view.rs (line 172)
156    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
157        match msg {
158            Msg::Append => {
159                // Add 10 items
160                for _ in 0..10 {
161                    self.counter = self.counter.wrapping_add(1);
162                    self.list_view_wrapper.append(MyListItem::new(self.counter));
163                }
164
165                self.list_view_wrapper
166                    .iter()
167                    .for_each(|row| println!("item {}", row.borrow().value));
168
169                // Count up the first item
170                let first_item = self.list_view_wrapper.get(0).unwrap();
171                let first_binding = &mut first_item.borrow_mut().binding;
172                let mut guard = first_binding.guard();
173                *guard += 1;
174            }
175            Msg::Remove => {
176                // Remove the second item
177                self.list_view_wrapper.remove(1);
178            }
179            Msg::OnlyShowEven(show_only_even) => {
180                // Disable or enable the first filter
181                self.list_view_wrapper.set_filter_status(0, show_only_even);
182            }
183        }
184    }

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§