1#[doc(hidden)]
2#[macro_export]
3macro_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]
193macro_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;