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§
Required Methods§
Provided Methods§
Sourcefn property_name() -> &'static str
fn property_name() -> &'static str
The name of the primary property.
Sourcefn guard(&self) -> BindingGuard<Self>
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
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.