fltk/macros/
group.rs

1#[doc(hidden)]
2#[macro_export]
3/// Implements GroupExt
4macro_rules! impl_group_ext {
5    ($name: ident, $flname: ident) => {
6        impl IntoIterator for $name {
7            type Item = $crate::widget::Widget;
8            type IntoIter = std::vec::IntoIter<Self::Item>;
9
10            fn into_iter(self) -> Self::IntoIter {
11                let mut v: Vec<$crate::widget::Widget> = vec![];
12                for i in 0..self.children() {
13                    v.push(self.child(i).unwrap());
14                }
15                v.into_iter()
16            }
17        }
18
19        paste::paste! {
20            unsafe impl GroupExt for $name {
21                fn begin(&self) {
22                    unsafe { [<$flname _begin>](self.inner.widget() as _) }
23                }
24
25                fn end(&self) {
26                    unsafe { [<$flname _end>](self.inner.widget() as _) }
27                }
28
29                fn clear(&mut self) {
30                    unsafe {
31                        [<$flname _clear>](self.inner.widget() as _);
32                    }
33                }
34
35                unsafe fn unsafe_clear(&mut self) { unsafe {
36                    [<$flname _clear>](self.inner.widget() as _);
37                }}
38
39                fn children(&self) -> i32 {
40                    unsafe {
41                        [<$flname _children>](self.inner.widget() as _) as i32
42                    }
43                }
44
45                fn child(&self, idx: i32) -> Option<$crate::widget::Widget> {
46                    unsafe {
47                        if idx >= self.children() || idx < 0 {
48                            return None;
49                        }
50                        let child_widget = [<$flname _child>](self.inner.widget() as _, idx as i32);
51                        if child_widget.is_null() {
52                            None
53                        } else {
54                            Some($crate::widget::Widget::from_widget_ptr(
55                                child_widget as *mut fltk_sys::widget::Fl_Widget,
56                            ))
57                        }
58                    }
59                }
60
61                fn find<W: WidgetExt>(&self, widget: &W) -> i32 {
62                    unsafe {
63                        [<$flname _find>](self.inner.widget() as _, widget.as_widget_ptr() as *mut _)
64                            as i32
65                    }
66                }
67
68                fn add<W: WidgetExt>(&mut self, widget: &W) {
69                    unsafe {
70                        [<$flname _add>](self.inner.widget() as _, widget.as_widget_ptr() as *mut _)
71                    }
72                }
73
74                fn insert<W: WidgetExt>(&mut self, widget: &W, index: i32) {
75                    unsafe {
76                        let index = if index < 0 {
77                            0
78                        } else {
79                            index
80                        };
81                        [<$flname _insert>](
82                            self.inner.widget() as _,
83                            widget.as_widget_ptr() as *mut _,
84                            index as i32,
85                        )
86                    }
87                }
88
89                fn remove<W: WidgetExt>(&mut self, widget: &W) {
90                    unsafe {
91                        [<$flname _remove>](self.inner.widget() as _, widget.as_widget_ptr() as *mut _)
92                    }
93                }
94
95                fn remove_by_index(&mut self, idx: i32) {
96                    unsafe {
97                        assert!(idx < self.children());
98                        [<$flname _remove_by_index>](self.inner.widget() as _, idx as i32);
99                    }
100                }
101
102                fn resizable<W: WidgetExt>(&self, widget: &W) {
103                    unsafe {
104                        [<$flname _resizable>](self.inner.widget() as _, widget.as_widget_ptr() as *mut _)
105                    }
106                }
107
108                fn make_resizable(&mut self, val: bool) {
109                    let ptr = if val {
110                        self.inner.widget() as _
111                    } else {
112                        std::ptr::null_mut()
113                    };
114                    unsafe { [<$flname _resizable>](self.inner.widget() as _, ptr as *mut _) }
115                }
116
117                fn add_resizable<W: WidgetExt>(&mut self, widget: &W) {
118                    self.resizable(widget);
119                    self.add(widget);
120                }
121
122                fn set_clip_children(&mut self, flag: bool) {
123                    unsafe { [<$flname _set_clip_children>](self.inner.widget() as _, i32::from(flag)) }
124                }
125
126                fn clip_children(&self) -> bool {
127                    unsafe { [<$flname _clip_children>](self.inner.widget() as _) != 0 }
128                }
129
130                fn draw_child<W: WidgetExt>(&self, w: &mut W) {
131                    unsafe {
132                        $crate::app::open_display();
133                        [<$flname _draw_child>](self.inner.widget() as _, w.as_widget_ptr() as _)
134                    }
135                }
136
137                fn update_child<W: WidgetExt>(&self, w: &mut W) {
138                    unsafe {
139                        $crate::app::open_display();
140                        [<$flname _update_child>](self.inner.widget() as _, w.as_widget_ptr() as _)
141                    }
142                }
143
144                fn draw_outside_label<W: WidgetExt>(&self, w: &mut W) {
145                    unsafe {
146                        $crate::app::open_display();
147                        [<$flname _draw_outside_label>](
148                            self.inner.widget() as _,
149                            w.as_widget_ptr() as _,
150                        )
151                    }
152                }
153
154                fn draw_children(&mut self) {
155                    unsafe {
156                        $crate::app::open_display();
157                        [<$flname _draw_children>](self.inner.widget() as _)
158                    }
159                }
160
161                fn init_sizes(&mut self) {
162                    unsafe {
163                        [<$flname _init_sizes>](self.inner.widget() as _)
164                    }
165                }
166
167                fn bounds(&self) -> Vec<(i32, i32, i32, i32)> {
168                    let children = self.children();
169                    let mut vec = vec![];
170                    for i in 0..children {
171                        let child = self.child(i).unwrap();
172                        let x = child.x();
173                        let y = child.y();
174                        let r = child.w() + x;
175                        let b = child.h() + y;
176                        vec.push((x, y, r, b));
177                    }
178                    vec
179                }
180
181                unsafe fn as_group(&self) -> $crate::group::Group { unsafe {
182                    $crate::group::Group::from_widget_ptr(self.inner.widget() as _)
183                }}
184            }
185        }
186    };
187}
188
189pub use impl_group_ext;
190
191#[doc(hidden)]
192#[macro_export]
193/// Implements GroupExt via a member
194macro_rules! impl_group_ext_via {
195    ($widget:ty, $member:tt) => {
196        unsafe impl GroupExt for $widget {
197            fn begin(&self) {
198                self.$member.begin()
199            }
200
201            fn end(&self) {
202                self.$member.end()
203            }
204
205            fn clear(&mut self) {
206                self.$member.clear()
207            }
208
209            unsafe fn unsafe_clear(&mut self) {
210                self.$member.unsafe_clear()
211            }
212
213            fn children(&self) -> i32 {
214                self.$member.children()
215            }
216
217            fn child(&self, idx: i32) -> Option<$crate::widget::Widget> {
218                self.$member.child(idx)
219            }
220
221            fn find<W: WidgetExt>(&self, widget: &W) -> i32 {
222                self.$member.find(widget)
223            }
224
225            fn add<W: WidgetExt>(&mut self, widget: &W) {
226                self.$member.add(widget)
227            }
228
229            fn insert<W: WidgetExt>(&mut self, widget: &W, index: i32) {
230                self.$member.insert(widget, index)
231            }
232
233            fn remove<W: WidgetExt>(&mut self, widget: &W) {
234                self.$member.remove(widget)
235            }
236
237            fn remove_by_index(&mut self, idx: i32) {
238                self.$member.remove_by_index(idx)
239            }
240
241            fn resizable<W: WidgetExt>(&self, widget: &W) {
242                self.$member.resizable(widget)
243            }
244
245            fn make_resizable(&mut self, val: bool) {
246                self.$member.make_resizable(val)
247            }
248
249            fn add_resizable<W: WidgetExt>(&mut self, widget: &W) {
250                self.$member.add_resizable(widget)
251            }
252
253            fn set_clip_children(&mut self, flag: bool) {
254                self.$member.set_clip_children(flag)
255            }
256
257            fn clip_children(&self) -> bool {
258                self.$member.clip_children()
259            }
260
261            fn draw_child<W: WidgetExt>(&self, w: &mut W) {
262                self.$member.draw_child(w)
263            }
264
265            fn update_child<W: WidgetExt>(&self, w: &mut W) {
266                self.$member.update_child(w)
267            }
268
269            fn draw_outside_label<W: WidgetExt>(&self, w: &mut W) {
270                self.$member.draw_outside_label(w)
271            }
272
273            fn draw_children(&mut self) {
274                self.$member.draw_children()
275            }
276
277            fn init_sizes(&mut self) {
278                self.$member.init_sizes()
279            }
280
281            fn bounds(&self) -> Vec<(i32, i32, i32, i32)> {
282                self.$member.bounds()
283            }
284
285            unsafe fn as_group(&self) -> $crate::group::Group {
286                self.$member.into_group()
287            }
288        }
289    };
290}
291
292pub use impl_group_ext_via;