tuix_core/state/style/
prop.rs

1use morphorm::GeometryChanged;
2use crate::{Message, State, Widget};
3use crate::{entity::Entity, Builder, EventHandler, Propagation};
4use crate::{state::style::*, AsEntity, Pos};
5
6use crate::{Event, WindowEvent};
7
8use crate::state::tree::*;
9
10use morphorm::{Cache, LayoutType, PositionType, Units};
11
12use std::rc::Rc;
13
14// Flag that the posx of the widget may need to update
15fn flag_geo_change(state: &mut State, entity: Entity) {
16    if let Some(parent) = entity.parent(&state.tree) {
17        if let Some(geo_changed) = state.data.geometry_changed.get_mut(parent.index_unchecked()) {
18            geo_changed.set(GeometryChanged::CHANGE_POSX, true);
19        }         
20    }
21
22    // if let Some(geo_changed) = state.data.geometry_changed.get_mut(entity.index_unchecked()) {
23    //     geo_changed.set(GeometryChanged::CHANGE_POSX, true);
24    // }
25
26}
27
28fn needs_redraw(state: &mut State, entity: Entity) {
29    if let Some(geo_changed) = state.data.geometry_changed.get_mut(entity.index_unchecked()) {
30        geo_changed.set(GeometryChanged::POSX_CHANGED, true);
31    }
32}
33
34pub trait PropSet: AsEntity + Sized {
35
36    /// Helper method for sending an event to self with default propagation
37    fn emit(&self, state: &mut State, message: impl Message) -> Entity
38    where
39        Self: 'static,
40    {
41        state.insert_event(Event::new(message).target(self.entity()).origin(self.entity()).propagate(Propagation::Up));
42
43        self.entity()
44    }
45
46    /// Helper method for sending an event to target with default propagation
47    fn emit_to(&self, state: &mut State, target: Entity, message: impl Message) -> Entity {
48        state.insert_event(Event::new(message).target(target).origin(self.entity()).propagate(Propagation::Direct));
49
50        self.entity()
51    }
52
53    fn add_listener<F,W>(&self, state: &mut State, listener: F) -> Entity
54    where 
55        W: Widget, 
56        F: 'static + Fn(&mut W, &mut State, Entity, &mut Event)
57    {  
58        state.listeners.insert(self.entity(), Box::new(move |event_handler, state, entity, event|{
59            if let Some(widget) = event_handler.downcast::<W>() {
60                (listener)(widget, state, entity, event);
61            }
62        }));
63
64        self.entity()
65    }
66
67    fn set_name(self, state: &mut State, name: &str) -> Entity {
68        state.style.name.insert(self.entity(), name.to_string());
69
70        self.entity()
71    }
72
73    /// Add a class name to an entity
74    fn class(self, state: &mut State, class_name: &str) -> Entity {
75        if let Some(class_list) = state.style.classes.get_mut(self.entity()) {
76            class_list.insert(class_name.to_string());
77        } else {
78            let mut class_list = HashSet::new();
79            class_list.insert(class_name.to_string());
80            state.style.classes.insert(self.entity(), class_list);
81        }
82
83        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
84        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
85        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
86
87        ////flag_geo_change(state, self.entity());
88
89        self.entity()
90    }
91
92    // TODO move to PropGet
93    fn get_parent(self, state: &mut State) -> Option<Entity> {
94        self.entity().parent(&state.tree)
95    }
96
97    // Pseudoclass
98
99    fn set_disabled(self, state: &mut State, value: bool) -> Entity {
100        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self.entity()) {
101            pseudo_classes.set(PseudoClasses::DISABLED, value);
102        }
103
104        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
105        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
106        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
107
108        ////flag_geo_change(state, self.entity());
109
110        self.entity()
111    }
112
113    fn set_checked(self, state: &mut State, value: bool) -> Entity {
114        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self.entity()) {
115            pseudo_classes.set(PseudoClasses::CHECKED, value);
116        }
117
118        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
119        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
120        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
121
122        ////flag_geo_change(state, self.entity());
123
124        self.entity()
125    }
126
127    fn set_over(self, state: &mut State, value: bool) -> Entity {
128        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self.entity()) {
129            pseudo_classes.set(PseudoClasses::OVER, value);
130        }
131
132        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
133        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
134        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
135
136        ////flag_geo_change(state, self.entity());
137
138        self.entity()
139    }
140
141    fn set_active(self, state: &mut State, value: bool) -> Entity {
142        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self.entity()) {
143            pseudo_classes.set(PseudoClasses::ACTIVE, value);
144        }
145
146        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
147        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
148        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
149
150        //flag_geo_change(state, self.entity());
151
152        self.entity()
153    }
154
155    fn set_hover(self, state: &mut State, value: bool) -> Entity {
156        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self.entity()) {
157            pseudo_classes.set(PseudoClasses::HOVER, value);
158        }
159
160        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
161        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
162        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
163
164        //flag_geo_change(state, self.entity());
165
166        self.entity()
167    }
168
169    fn set_focus(self, state: &mut State, value: bool) -> Entity {
170        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self.entity()) {
171            pseudo_classes.set(PseudoClasses::FOCUS, value);
172        }
173
174        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
175        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
176        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
177
178        //flag_geo_change(state, self.entity());
179
180        self.entity()
181    }
182
183    // Style
184    fn set_element(self, state: &mut State, value: &str) -> Entity {
185
186        state.style.elements.insert(self.entity(), value.to_string());
187
188        //flag_geo_change(state, self.entity());
189
190        self.entity()
191    }
192
193    fn set_id(self, state: &mut State, value: &str) -> Entity {
194        todo!();
195
196        self.entity()
197    }
198
199    // Visibility
200    fn set_visibility(self, state: &mut State, value: Visibility) -> Entity {
201        state.style.visibility.insert(self.entity(), value);
202
203        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
204        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
205        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
206
207        //flag_geo_change(state, self.entity());
208
209        self.entity()
210    }
211
212    fn set_hoverable(self, state: &mut State, value: bool) -> Entity {
213        state.data.set_hoverable(self.entity(), value);
214
215        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
216        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
217        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
218
219        self.entity()
220    }
221
222    fn set_focusable(self, state: &mut State, value: bool) -> Entity {
223        state.data.set_focusable(self.entity(), value);
224
225        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
226        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
227        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
228
229        self.entity()
230    }
231
232    // Overflow
233    fn set_overflow(self, state: &mut State, value: Overflow) -> Entity {
234        state.style.overflow.insert(self.entity(), value);
235
236        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
237        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
238        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
239
240        self.entity()
241    }
242
243    // Display
244    fn set_display(self, state: &mut State, value: Display) -> Entity {
245        state.style.display.insert(self.entity(), value);
246
247        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
248        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
249        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
250
251        //flag_geo_change(state, self.entity());
252
253        self.entity()
254    }
255
256    //Opacity
257    fn set_opacity(self, state: &mut State, value: f32) -> Entity {
258        state.style.opacity.insert(self.entity(), Opacity(value));
259
260        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
261        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
262        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
263
264        self.entity()
265    }
266
267    // Rotate
268    fn set_rotate(self, state: &mut State, value: f32) -> Entity {
269        state.style.rotate.insert(self.entity(), value);
270
271        //state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
272        //state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
273        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
274
275        self.entity()
276    }
277
278    fn set_translate(self, state: &mut State, value: (f32, f32)) -> Entity {
279        state.style.translate.insert(self.entity(), value);
280
281        //state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
282        //state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
283        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
284
285        self.entity()
286    }
287
288    fn set_scale(self, state: &mut State, value: f32) -> Entity {
289        state.style.scale.insert(self.entity(), value);
290
291        //state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
292        //state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
293        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
294
295        self.entity()
296    }
297
298    // Position
299    fn set_position_type(self, state: &mut State, value: PositionType) -> Entity {
300        state.style.positioning_type.insert(self.entity(), value);
301
302        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
303        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
304
305
306
307        self.entity()
308    }
309
310    fn set_space(self, state: &mut State, value: Units) -> Entity {
311        state.style.left.insert(self.entity(), value);
312        state.style.right.insert(self.entity(), value);
313        state.style.top.insert(self.entity(), value);
314        state.style.bottom.insert(self.entity(), value);
315
316        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
317        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
318
319        //flag_geo_change(state, self.entity());
320        self.entity()
321    } 
322
323    fn set_left(self, state: &mut State, value: Units) -> Entity {
324        //println!("Set Left {} {} {:?}", self.entity(), state.style.elements.get(self.entity()).cloned().unwrap_or_default(), value);
325        state.style.left.insert(self.entity(), value);
326
327        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
328        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
329
330        flag_geo_change(state, self.entity());
331
332        self.entity()
333    }
334
335    fn set_right(self, state: &mut State, value: Units) -> Entity {
336        state.style.right.insert(self.entity(), value);
337
338        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
339        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
340
341        //flag_geo_change(state, self.entity());
342
343        self.entity()
344    }
345
346    fn set_top(self, state: &mut State, value: Units) -> Entity {
347        state.style.top.insert(self.entity(), value);
348
349        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
350        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
351
352        flag_geo_change(state, self.entity());
353
354        self.entity()
355    }
356
357    fn set_bottom(self, state: &mut State, value: Units) -> Entity {
358        state.style.bottom.insert(self.entity(), value);
359
360        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
361        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
362
363        //flag_geo_change(state, self.entity());
364
365        self.entity()
366    }
367
368    // Position Constraints
369    fn set_min_left(self, state: &mut State, value: Units) -> Entity {
370        state.style.min_left.insert(self.entity(), value);
371
372        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
373        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
374
375        //flag_geo_change(state, self.entity());
376
377        self.entity()
378    }
379
380    fn set_max_left(self, state: &mut State, value: Units) -> Entity {
381        state.style.max_left.insert(self.entity(), value);
382
383        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
384        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
385
386        //flag_geo_change(state, self.entity());
387
388        self.entity()
389    }
390
391    fn set_min_right(self, state: &mut State, value: Units) -> Entity {
392        state.style.min_right.insert(self.entity(), value);
393
394        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
395        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
396
397        //flag_geo_change(state, self.entity());
398
399        self.entity()
400    }
401
402    fn set_max_right(self, state: &mut State, value: Units) -> Entity {
403        state.style.max_right.insert(self.entity(), value);
404
405        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
406        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
407
408        //flag_geo_change(state, self.entity());
409
410        self.entity()
411    }
412
413    fn set_min_top(self, state: &mut State, value: Units) -> Entity {
414        state.style.min_top.insert(self.entity(), value);
415
416        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
417        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
418
419        //flag_geo_change(state, self.entity());
420
421        self.entity()
422    }
423
424    fn set_max_top(self, state: &mut State, value: Units) -> Entity {
425        state.style.max_top.insert(self.entity(), value);
426
427        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
428        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
429
430        //flag_geo_change(state, self.entity());
431
432        self.entity()
433    }
434
435    fn set_min_bottom(self, state: &mut State, value: Units) -> Entity {
436        state.style.min_bottom.insert(self.entity(), value);
437
438        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
439        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
440
441        //flag_geo_change(state, self.entity());
442
443        self.entity()
444    }
445
446    fn set_max_bottom(self, state: &mut State, value: Units) -> Entity {
447        state.style.max_bottom.insert(self.entity(), value);
448
449        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
450        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
451
452        //flag_geo_change(state, self.entity());
453
454        self.entity()
455    }
456
457    // Size
458    fn set_width(self, state: &mut State, value: Units) -> Entity {
459        
460        state.style.width.insert(self.entity(), value);
461
462        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
463        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
464
465        flag_geo_change(state, self.entity());
466
467        self.entity()
468    }
469
470    fn set_height(self, state: &mut State, value: Units) -> Entity {
471        //println!("Set Height: {} {:?}", self.entity(), value);
472        state.style.height.insert(self.entity(), value);
473
474        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
475        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
476
477        flag_geo_change(state, self.entity());
478
479        self.entity()
480    }
481
482    // Size Constraints
483    fn set_min_width(self, state: &mut State, value: Units) -> Entity {
484        state.style.min_width.insert(self.entity(), value);
485
486        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
487        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
488
489        //flag_geo_change(state, self.entity());
490
491        self.entity()
492    }
493
494    fn set_max_width(self, state: &mut State, value: Units) -> Entity {
495        state.style.max_width.insert(self.entity(), value);
496
497        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
498        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
499
500        //flag_geo_change(state, self.entity());
501
502        self.entity()
503    }
504
505    fn set_min_height(self, state: &mut State, value: Units) -> Entity {
506        state.style.min_height.insert(self.entity(), value);
507
508        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
509        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
510
511        //flag_geo_change(state, self.entity());
512
513        self.entity()
514    }
515
516    fn set_max_height(self, state: &mut State, value: Units) -> Entity {
517        state.style.max_height.insert(self.entity(), value);
518
519        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
520        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
521
522        //flag_geo_change(state, self.entity());
523
524        self.entity()
525    }
526
527    // Text
528    fn set_text(self, state: &mut State, text: &str) -> Entity {
529        state.style.text.insert(self.entity(), text.to_owned());
530
531        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
532
533        self.entity()
534    }
535
536    // Text Font
537    fn set_font(self, state: &mut State, font: &str) -> Entity {
538        state.style.font.insert(self.entity(), font.to_owned());
539
540        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
541
542        self.entity()
543    }
544
545    fn set_font_size(self, state: &mut State, value: f32) -> Entity {
546        state.style.font_size.insert(self.entity(), value);
547
548        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
549
550        self.entity()
551    }
552
553    fn set_color(self, state: &mut State, value: Color) -> Entity {
554        state.style.font_color.insert(self.entity(), value);
555
556        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
557
558        self.entity()
559    }
560
561    // Tooltip
562    fn set_tooltip(self, state: &mut State, text: &str) -> Entity {
563        state.style.tooltip.insert(self.entity(), text.to_owned());
564
565        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
566
567        self.entity()
568    }
569
570    // Background
571    fn set_background_color(self, state: &mut State, value: Color) -> Entity {
572        state.style.background_color.insert(self.entity(), value);
573
574        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
575
576        needs_redraw(state, self.entity());
577
578        self.entity()
579    }
580
581    fn set_background_image(self, state: &mut State, value: Rc<()>) -> Entity {
582        state.style.background_image.insert(self.entity(), value);
583
584        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
585
586        self.entity()
587    }
588
589    // Border
590    fn set_border_width(self, state: &mut State, value: Units) -> Entity {
591        state.style.border_width.insert(self.entity(), value);
592
593        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
594
595        self.entity()
596    }
597
598    fn set_border_color(self, state: &mut State, value: Color) -> Entity {
599        state.style.border_color.insert(self.entity(), value);
600
601        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
602
603        self.entity()
604    }
605
606    fn set_border_corner_shape(self, state: &mut State, value: BorderCornerShape) -> Entity {
607        state.style.border_shape_top_left.insert(self.entity(), value);
608        state.style.border_shape_top_right.insert(self.entity(), value);
609        state.style.border_shape_bottom_left.insert(self.entity(), value);
610        state.style.border_shape_bottom_right.insert(self.entity(), value);
611
612        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
613
614        self.entity()
615    }
616
617    fn set_border_top_left_shape(self, state: &mut State, value: BorderCornerShape) -> Entity {
618        state.style.border_shape_top_left.insert(self.entity(), value);
619
620        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
621
622        self.entity()
623    }
624
625    fn set_border_top_right_shape(self, state: &mut State, value: BorderCornerShape) -> Entity {
626        state.style.border_shape_top_right.insert(self.entity(), value);
627
628        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
629
630        self.entity()
631    }
632
633    fn set_border_bottom_left_shape(self, state: &mut State, value: BorderCornerShape) -> Entity {
634        state.style.border_shape_bottom_left.insert(self.entity(), value);
635
636        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
637
638        self.entity()
639    }
640
641    fn set_border_bottom_right_shape(self, state: &mut State, value: BorderCornerShape) -> Entity {
642        state.style.border_shape_bottom_right.insert(self.entity(), value);
643
644        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
645
646        self.entity()
647    }
648
649
650    // Border Radius
651    fn set_border_radius(self, state: &mut State, value: Units) -> Entity {
652        state.style.border_radius_top_left.insert(self.entity(), value);
653        state.style.border_radius_top_right.insert(self.entity(), value);
654        state.style.border_radius_bottom_left.insert(self.entity(), value);
655        state.style.border_radius_bottom_right.insert(self.entity(), value);
656
657        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
658
659        self.entity()
660    }
661
662
663    fn set_border_radius_top_left(self, state: &mut State, value: Units) -> Entity {
664        state.style.border_radius_top_left.insert(self.entity(), value);
665
666        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
667
668        self.entity()
669    }
670
671    fn set_border_radius_top_right(self, state: &mut State, value: Units) -> Entity {
672        state.style.border_radius_top_right.insert(self.entity(), value);
673
674        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
675
676        self.entity()
677    }
678
679    fn set_border_radius_bottom_left(self, state: &mut State, value: Units) -> Entity {
680        state.style.border_radius_bottom_left.insert(self.entity(), value);
681
682        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
683
684        self.entity()
685    }
686
687    fn set_border_radius_bottom_right(self, state: &mut State, value: Units) -> Entity {
688        state.style.border_radius_bottom_right.insert(self.entity(), value);
689
690        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
691
692        self.entity()
693    }
694
695    // Outer Shadow
696    fn set_outer_shadow_h_offset(mut self, state: &mut State, value: Units) -> Self {
697        state
698            .style
699            .outer_shadow_h_offset
700            .insert(self.entity(), value);
701
702        self
703    }
704
705    fn set_outer_shadow_v_offset(mut self, state: &mut State, value: Units) -> Self {
706        state
707            .style
708            .outer_shadow_v_offset
709            .insert(self.entity(), value);
710
711        self
712    }
713
714    fn set_outer_shadow_color(mut self, state: &mut State, value: Color) -> Self {
715        state.style.outer_shadow_color.insert(self.entity(), value);
716
717        self
718    }
719
720    fn set_outer_shadow_blur(mut self, state: &mut State, value: Units) -> Self {
721        state.style.outer_shadow_blur.insert(self.entity(), value);
722
723        self
724    }
725
726    // Clipping
727    fn set_clip_widget(self, state: &mut State, value: Entity) -> Entity {
728        state.style.clip_widget.insert(self.entity(), value);
729
730        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
731
732        self.entity()
733    }
734
735    fn set_z_order(self, state: &mut State, value: i32) -> Entity {
736        state.style.z_order.insert(self.entity(), value);
737
738        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
739
740        self.entity()
741    }
742
743    fn set_next_focus(self, state: &mut State, value: Entity) -> Entity {
744        if let Some(entity) = state.style.focus_order.get_mut(self.entity()) {
745            entity.next = value;
746        } else {
747            state.style.focus_order.insert(
748                self.entity(),
749                FocusOrder {
750                    next: value,
751                    ..Default::default()
752                },
753            );
754        }
755
756        self.entity()
757    }
758
759    fn set_prev_focus(self, state: &mut State, value: Entity) -> Entity {
760        if let Some(focus_order) = state.style.focus_order.get_mut(self.entity()) {
761            focus_order.prev = value;
762        } else {
763            state.style.focus_order.insert(
764                self.entity(),
765                FocusOrder {
766                    prev: value,
767                    ..Default::default()
768                },
769            );
770        }
771
772        self.entity()
773    }
774
775    fn set_focus_order(self, state: &mut State, prev: Entity, next: Entity) -> Entity {
776        if let Some(focus_order) = state.style.focus_order.get_mut(self.entity()) {
777            focus_order.prev = prev;
778            focus_order.next = next;
779        } else {
780            state.style.focus_order.insert(
781                self.entity(),
782                FocusOrder {
783                    prev,
784                    next,
785                },
786            );
787        }
788
789        self.entity()
790    }
791
792
793    //fn mutate<F: FnMut(Builder<Self>) -> Builder<Self>>(self, state: &mut State, builder: F) -> Self;
794
795    fn set_layout_type(&self, state: &mut State, value: LayoutType) -> Entity {
796        state.style.layout_type.insert(self.entity(), value);
797
798        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
799        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
800
801        //flag_geo_change(state, self.entity());
802
803        self.entity()
804    }
805
806    fn set_child_space(&self, state: &mut State, value: Units) -> Entity {
807        state.style.child_left.insert(self.entity(), value);
808        state.style.child_right.insert(self.entity(), value);
809        state.style.child_top.insert(self.entity(), value);
810        state.style.child_bottom.insert(self.entity(), value);
811
812        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
813        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
814
815        //flag_geo_change(state, self.entity());
816
817        self.entity()
818    }
819
820    fn set_child_left(&self, state: &mut State, value: Units) -> Entity {
821        state.style.child_left.insert(self.entity(), value);
822
823        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
824        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
825
826        //flag_geo_change(state, self.entity());
827
828        self.entity()
829    }
830
831    fn set_row_between(&self, state: &mut State, value: Units) -> Entity {
832        state.style.row_between.insert(self.entity(), value);
833
834        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
835        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
836
837        //flag_geo_change(state, self.entity());
838
839        self.entity()
840    }
841
842    fn set_col_between(&self, state: &mut State, value: Units) -> Entity {
843        state.style.col_between.insert(self.entity(), value);
844
845        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
846        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
847
848        //flag_geo_change(state, self.entity());
849
850        self.entity()
851    }
852
853    fn set_child_right(&self, state: &mut State, value: Units) -> Entity {
854        state.style.child_right.insert(self.entity(), value);
855
856        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
857        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
858
859        //flag_geo_change(state, self.entity());
860
861        self.entity()
862    }
863
864    fn set_child_top(&self, state: &mut State, value: Units) -> Entity {
865        state.style.child_top.insert(self.entity(), value);
866
867        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
868        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
869
870        //flag_geo_change(state, self.entity());
871
872        self.entity()
873    }
874
875    fn set_child_bottom(&self, state: &mut State, value: Units) -> Entity {
876        state.style.child_bottom.insert(self.entity(), value);
877
878        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
879        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
880
881        //flag_geo_change(state, self.entity());
882
883        self.entity()
884    }
885
886    fn set_grid_rows(&self, state: &mut State, value: Vec<Units>) -> Entity {
887        state.style.grid_rows.insert(self.entity(), value);
888
889        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
890        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
891
892        //flag_geo_change(state, self.entity());
893
894        self.entity()
895    }
896
897    fn set_grid_cols(&self, state: &mut State, value: Vec<Units>) -> Entity {
898        state.style.grid_cols.insert(self.entity(), value);
899
900        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
901        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
902
903        //flag_geo_change(state, self.entity());
904
905        self.entity()
906    }
907
908    fn set_row_index(&self, state: &mut State, value: usize) -> Entity {
909        state.style.row_index.insert(self.entity(), value);
910
911        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
912        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
913
914        //flag_geo_change(state, self.entity());
915
916        self.entity()
917    }
918
919    fn set_col_index(&self, state: &mut State, value: usize) -> Entity {
920        state.style.col_index.insert(self.entity(), value);
921
922        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
923        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
924
925        //flag_geo_change(state, self.entity());
926
927        self.entity()
928    }
929
930    fn set_row_span(&self, state: &mut State, value: usize) -> Entity {
931        state.style.row_span.insert(self.entity(), value);
932
933        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
934        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
935
936        //flag_geo_change(state, self.entity());
937
938        self.entity()
939    }
940
941    fn set_col_span(mut self, state: &mut State, value: usize) -> Self {
942        state.style.col_span.insert(self.entity(), value);
943
944        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
945        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
946        
947        //flag_geo_change(state, self.entity());
948
949        self
950    }
951
952}
953
954impl<T: AsEntity> PropSet for T {
955    // fn mutate<F>(self, state: &mut State, mut builder: F) -> Self
956    // where
957    //     F: FnMut(Builder<Self>) -> Builder<Self>,
958    // {
959    //     builder(Builder::new(state, self));
960
961    //     self
962    // }
963}
964
965/*
966impl PropSet for Entity {
967
968    fn mutate<F>(self, state: &mut State, mut builder: F) -> Self
969    where
970        F: FnMut(Builder<Self>) -> Builder<Self>,
971    {
972        builder(Builder::new(state, self));
973
974        self
975    }
976
977    fn class(self, state: &mut State, class_name: &str) -> Self {
978        state.style.insert_class(self, class_name);
979
980        self
981    }
982
983    fn get_parent(self, state: &mut State) -> Option<Entity> {
984        self.parent(&state.tree)
985    }
986
987    // PseudoClass
988    fn set_enabled(self, state: &mut State, value: bool) -> Self {
989        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
990            pseudo_classes.set_enabled(value);
991            pseudo_classes.set_disabled(!value);
992        }
993
994        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
995
996        self
997    }
998
999    fn set_disabled(self, state: &mut State, value: bool) -> Self {
1000        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1001            pseudo_classes.set_disabled(value);
1002            pseudo_classes.set_enabled(!value);
1003        }
1004
1005        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1006
1007        self
1008    }
1009
1010    fn set_checked(self, state: &mut State, value: bool) -> Self {
1011        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1012            pseudo_classes.set_checked(value);
1013        }
1014
1015        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1016        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1017        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1018
1019        self
1020    }
1021
1022    fn set_over(self, state: &mut State, value: bool) -> Self {
1023        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1024            pseudo_classes.set_over(value);
1025        }
1026
1027        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1028
1029        self
1030    }
1031
1032    fn set_active(self, state: &mut State, value: bool) -> Self {
1033        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1034            pseudo_classes.set_active(value);
1035        }
1036
1037        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1038
1039        self
1040    }
1041
1042    fn set_hover(self, state: &mut State, value: bool) -> Self {
1043        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1044            pseudo_classes.set_hover(value);
1045        }
1046
1047        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1048
1049        self
1050    }
1051
1052    fn set_focus(self, state: &mut State, value: bool) -> Self {
1053        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1054            pseudo_classes.set_focus(value);
1055        }
1056
1057        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1058
1059        self
1060    }
1061
1062    // Style
1063    fn set_element(self, state: &mut State, value: &str) -> Self {
1064        state.style.insert_element(self, value);
1065
1066        self
1067    }
1068
1069    fn set_id(self, state: &mut State, value: &str) -> Self {
1070        state.style.insert_id(self, value);
1071
1072        self
1073    }
1074
1075    fn set_class(self, state: &mut State, value: &str) -> Self {
1076        state.style.insert_class(self, value);
1077
1078        self
1079    }
1080
1081    // Visibility
1082    fn set_visibility(self, state: &mut State, value: Visibility) -> Self {
1083        state.style.visibility.insert(self, value);
1084
1085        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1086        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1087
1088        self
1089    }
1090
1091    fn set_hoverable(self, state: &mut State, value: bool) -> Self {
1092        state.data.set_hoverable(self, value);
1093
1094        self
1095    }
1096
1097    fn set_focusable(self, state: &mut State, value: bool) -> Self {
1098        state.data.set_focusable(self, value);
1099
1100        self
1101    }
1102
1103    // Overflow
1104    fn set_overflow(self, state: &mut State, value: Overflow) -> Self {
1105        state.style.overflow.insert(self, value);
1106
1107        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1108        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1109
1110        self
1111    }
1112
1113    // Display
1114    fn set_display(self, state: &mut State, value: Display) -> Self {
1115        state.style.display.insert(self, value);
1116
1117        state.insert_event(Event::new(WindowEvent::Restyle).target(Entity::root()));
1118        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1119        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1120
1121        self
1122    }
1123
1124    //Opacity
1125    fn set_opacity(self, state: &mut State, value: f32) -> Self {
1126        state.style.opacity.insert(self, Opacity(value));
1127
1128        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1129        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1130
1131        self
1132    }
1133
1134    // Rotate
1135    fn set_rotate(self, state: &mut State, value: f32) -> Self {
1136        state.style.rotate.insert(self, value);
1137
1138        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1139        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1140
1141        self
1142    }
1143
1144    fn set_left(self, state: &mut State, value: Units) -> Self {
1145        state.style.left.insert(self, value);
1146
1147        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1148        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1149
1150        self
1151    }
1152
1153    fn set_right(self, state: &mut State, value: Units) -> Self {
1154        state.style.right.insert(self, value);
1155
1156        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1157        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1158
1159        self
1160    }
1161
1162    fn set_top(self, state: &mut State, value: Units) -> Self {
1163        state.style.top.insert(self, value);
1164
1165        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1166        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1167
1168        self
1169    }
1170
1171    fn set_bottom(self, state: &mut State, value: Units) -> Self {
1172        state.style.bottom.insert(self, value);
1173
1174        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1175        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1176
1177        self
1178    }
1179
1180    // Size
1181    fn set_width(self, state: &mut State, value: Units) -> Self {
1182        state.style.width.insert(self, value);
1183
1184        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1185        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1186
1187        self
1188    }
1189
1190    fn set_height(self, state: &mut State, value: Units) -> Self {
1191        state.style.height.insert(self, value);
1192
1193        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1194        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1195
1196        self
1197    }
1198
1199    // Size Constraints
1200    fn set_min_width(self, state: &mut State, value: Units) -> Self {
1201        state.style.min_width.insert(self, value);
1202
1203        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1204        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1205
1206        self
1207    }
1208
1209    fn set_max_width(self, state: &mut State, value: Units) -> Self {
1210        state.style.max_width.insert(self, value);
1211
1212        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1213        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1214
1215        self
1216    }
1217
1218    fn set_min_height(self, state: &mut State, value: Units) -> Self {
1219        state.style.min_height.insert(self, value);
1220
1221        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1222        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1223
1224        self
1225    }
1226
1227    fn set_max_height(self, state: &mut State, value: Units) -> Self {
1228        state.style.max_height.insert(self, value);
1229
1230        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1231        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1232
1233        self
1234    }
1235
1236    // Tooltip
1237    fn set_tooltip(self, state: &mut State, value: &str) -> Self {
1238        state.style.tooltip.insert(self, value.to_owned());
1239
1240        self
1241    }
1242
1243    // Text
1244    fn set_text(self, state: &mut State, value: &str) -> Self {
1245        state.style.text.insert(self, value.to_owned());
1246
1247        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1248
1249        self
1250    }
1251
1252    // Text Font
1253    fn set_font(self, state: &mut State, value: &str) -> Self {
1254        state.style.font.insert(self, value.to_owned());
1255
1256        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1257        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1258
1259        self
1260    }
1261
1262    fn set_font_size(self, state: &mut State, value: f32) -> Self {
1263        state.style.font_size.insert(self, value);
1264
1265        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1266        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1267
1268        self
1269    }
1270
1271    fn set_color(self, state: &mut State, value: Color) -> Self {
1272        state.style.font_color.insert(self, value);
1273
1274        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1275
1276        self
1277    }
1278
1279    // Background
1280    fn set_background_color(self, state: &mut State, value: Color) -> Self {
1281        state.style.background_color.insert(self, value);
1282
1283        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1284
1285        self
1286    }
1287
1288    fn set_background_image(self, state: &mut State, value: std::rc::Rc<()>) -> Self {
1289        state.style.background_image.insert(self, value);
1290
1291        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1292
1293        self
1294    }
1295
1296    // Border
1297    fn set_border_width(self, state: &mut State, value: Units) -> Self {
1298        state.style.border_width.insert(self, value);
1299
1300        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1301        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1302
1303        self
1304    }
1305
1306    fn set_border_color(self, state: &mut State, value: Color) -> Self {
1307        state.style.border_color.insert(self, value);
1308
1309        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1310
1311        self
1312    }
1313
1314    // Border Radius
1315    fn set_border_radius(self, state: &mut State, value: Units) -> Self {
1316        state.style.border_radius_top_left.insert(self, value);
1317        state.style.border_radius_top_right.insert(self, value);
1318        state.style.border_radius_bottom_left.insert(self, value);
1319        state.style.border_radius_bottom_right.insert(self, value);
1320
1321        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1322
1323        self
1324    }
1325
1326    fn set_border_radius_top_left(self, state: &mut State, value: Units) -> Self {
1327        state.style.border_radius_top_left.insert(self, value);
1328
1329        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1330
1331        self
1332    }
1333
1334    fn set_border_radius_top_right(self, state: &mut State, value: Units) -> Self {
1335        state.style.border_radius_top_right.insert(self, value);
1336
1337        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1338
1339        self
1340    }
1341
1342    fn set_border_radius_bottom_left(self, state: &mut State, value: Units) -> Self {
1343        state.style.border_radius_bottom_left.insert(self, value);
1344
1345        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1346
1347        self
1348    }
1349
1350    fn set_border_radius_bottom_right(self, state: &mut State, value: Units) -> Self {
1351        state.style.border_radius_bottom_right.insert(self, value);
1352
1353        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1354
1355        self
1356    }
1357
1358    // Clipping
1359    fn set_clip_widget(self, state: &mut State, value: Entity) -> Self {
1360        state.style.clip_widget.insert(self, value);
1361
1362        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1363        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1364
1365        self
1366    }
1367
1368    fn set_z_order(self, state: &mut State, value: i32) -> Self {
1369        state.style.z_order.insert(self, value);
1370
1371        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1372        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1373
1374        self
1375    }
1376
1377    fn set_next_focus(self, state: &mut State, value: Entity) -> Self {
1378        if let Some(data) = state.style.focus_order.get_mut(self) {
1379            data.next = value;
1380        } else {
1381            state.style.focus_order.insert(
1382                self,
1383                FocusOrder {
1384                    next: value,
1385                    ..Default::default()
1386                },
1387            );
1388        }
1389
1390        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1391        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1392
1393        self
1394    }
1395
1396    fn set_prev_focus(self, state: &mut State, value: Entity) -> Self {
1397        if let Some(data) = state.style.focus_order.get_mut(self) {
1398            data.prev = value;
1399        } else {
1400            state.style.focus_order.insert(
1401                self,
1402                FocusOrder {
1403                    prev: value,
1404                    ..Default::default()
1405                },
1406            );
1407        }
1408
1409        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1410        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1411
1412        self
1413    }
1414
1415    fn set_focus_order(self, state: &mut State, next: Entity, prev: Entity) -> Self {
1416        if let Some(data) = state.style.focus_order.get_mut(self) {
1417            data.next = next;
1418            data.prev = prev;
1419        } else {
1420            state
1421                .style
1422                .focus_order
1423                .insert(self, FocusOrder { next, prev });
1424        }
1425
1426        state.insert_event(Event::new(WindowEvent::Relayout).target(Entity::root()));
1427        state.insert_event(Event::new(WindowEvent::Redraw).target(Entity::root()));
1428
1429        self
1430    }
1431}
1432*/
1433pub trait PropGet: AsEntity {
1434
1435
1436    fn name(&self, state: &mut State) -> String {
1437        state.style.name.get(self.entity()).cloned().unwrap_or_default()
1438    }
1439
1440    fn element(&self, state: &mut State) -> String {
1441        state.style.elements.get(self.entity()).cloned().unwrap_or_default()
1442    }
1443
1444    fn is_disabled(self, state: &mut State) -> bool;
1445    fn is_checked(self, state: &mut State) -> bool;
1446    fn is_over(self, state: &mut State) -> bool;
1447    fn is_active(self, state: &mut State) -> bool;
1448    fn is_focused(self, state: &mut State) -> bool;
1449    fn is_selected(self, state: &mut State) -> bool;
1450    fn is_hovered(self, state: &mut State) -> bool;
1451
1452    //
1453    fn get_overflow(&self, state: &mut State) -> Overflow;
1454
1455    // Display
1456    fn get_display(&self, state: &mut State) -> Display;
1457
1458    fn get_layout_type(&self, state: &mut State) -> LayoutType {
1459        state
1460            .style
1461            .layout_type
1462            .get(self.entity())
1463            .cloned()
1464            .unwrap_or_default()
1465    }
1466
1467    // Background Color
1468    fn get_background_color(&self, state: &mut State) -> Color {
1469        state.style.background_color.get(self.entity()).cloned().unwrap_or_default()
1470    }
1471
1472    // Position
1473    fn get_left(&self, state: &mut State) -> Units;
1474    fn get_right(&self, state: &mut State) -> Units;
1475    fn get_top(&self, state: &mut State) -> Units;
1476    fn get_bottom(&self, state: &mut State) -> Units;
1477
1478    // Size
1479    fn get_width(&self, state: &mut State) -> Units;
1480    fn get_height(&self, state: &mut State) -> Units;
1481
1482    // Size Constraints
1483    fn get_min_width(&self, state: &mut State) -> Units;
1484    fn get_max_width(&self, state: &mut State) -> Units;
1485    fn get_min_height(&self, state: &mut State) -> Units;
1486    fn get_max_height(&self, state: &mut State) -> Units;
1487
1488    // Border
1489    fn get_border_width(&self, state: &mut State) -> Units;
1490
1491    // Tooltip
1492    fn get_tooltip(&self, state: &mut State) -> String;
1493
1494    // Text
1495    fn get_text(&self, state: &mut State) -> String;
1496    fn get_font(&self, state: &mut State) -> String;
1497}
1498
1499impl PropGet for Entity {
1500    fn is_disabled(self, state: &mut State) -> bool {
1501        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1502            pseudo_classes.contains(PseudoClasses::DISABLED)
1503        } else {
1504            false
1505        }
1506    }
1507    fn is_hovered(self, state: &mut State) -> bool {
1508        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1509            pseudo_classes.contains(PseudoClasses::HOVER)
1510        } else {
1511            false
1512        }
1513    }
1514    fn is_selected(self, state: &mut State) -> bool {
1515        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1516            pseudo_classes.contains(PseudoClasses::SELECTED)
1517        } else {
1518            false
1519        }
1520    }
1521    fn is_checked(self, state: &mut State) -> bool {
1522        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1523            pseudo_classes.contains(PseudoClasses::CHECKED)
1524        } else {
1525            false
1526        }
1527    }
1528    fn is_over(self, state: &mut State) -> bool {
1529        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1530            pseudo_classes.contains(PseudoClasses::OVER)
1531        } else {
1532            false
1533        }
1534    }
1535    fn is_active(self, state: &mut State) -> bool {
1536        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1537            pseudo_classes.contains(PseudoClasses::ACTIVE)
1538        } else {
1539            false
1540        }
1541    }
1542    fn is_focused(self, state: &mut State) -> bool {
1543        if let Some(pseudo_classes) = state.style.pseudo_classes.get_mut(self) {
1544            pseudo_classes.contains(PseudoClasses::FOCUS)
1545        } else {
1546            false
1547        }
1548    }
1549
1550    fn get_overflow(&self, state: &mut State) -> Overflow {
1551        state.style.overflow.get(*self).cloned().unwrap_or_default()
1552    }
1553
1554    // Display
1555    fn get_display(&self, state: &mut State) -> Display {
1556        state.style.display.get(*self).cloned().unwrap_or_default()
1557    }
1558
1559    // Position
1560    fn get_left(&self, state: &mut State) -> Units {
1561        state.style.left.get(*self).cloned().unwrap_or_default()
1562    }
1563    fn get_right(&self, state: &mut State) -> Units {
1564        state.style.right.get(*self).cloned().unwrap_or_default()
1565    }
1566    fn get_top(&self, state: &mut State) -> Units {
1567        state.style.top.get(*self).cloned().unwrap_or_default()
1568    }
1569    fn get_bottom(&self, state: &mut State) -> Units {
1570        state.style.bottom.get(*self).cloned().unwrap_or_default()
1571    }
1572
1573    // Size
1574    fn get_width(&self, state: &mut State) -> Units {
1575        state.style.width.get(*self).cloned().unwrap_or_default()
1576    }
1577
1578    fn get_height(&self, state: &mut State) -> Units {
1579        state.style.height.get(*self).cloned().unwrap_or_default()
1580    }
1581
1582    // Size Constraints
1583    fn get_min_width(&self, state: &mut State) -> Units {
1584        state
1585            .style
1586            .min_width
1587            .get(*self)
1588            .cloned()
1589            .unwrap_or_default()
1590    }
1591
1592    fn get_max_width(&self, state: &mut State) -> Units {
1593        state
1594            .style
1595            .max_width
1596            .get(*self)
1597            .cloned()
1598            .unwrap_or_default()
1599    }
1600
1601    fn get_min_height(&self, state: &mut State) -> Units {
1602        state
1603            .style
1604            .min_height
1605            .get(*self)
1606            .cloned()
1607            .unwrap_or_default()
1608    }
1609
1610    fn get_max_height(&self, state: &mut State) -> Units {
1611        state
1612            .style
1613            .max_height
1614            .get(*self)
1615            .cloned()
1616            .unwrap_or_default()
1617    }
1618
1619    // Border
1620    fn get_border_width(&self, state: &mut State) -> Units {
1621        state
1622            .style
1623            .border_width
1624            .get(*self)
1625            .cloned()
1626            .unwrap_or_default()
1627    }
1628
1629    // Tooltip
1630    fn get_tooltip(&self, state: &mut State) -> String {
1631        state.style.tooltip.get(*self).cloned().unwrap_or_default()
1632    }
1633
1634    // Text
1635    fn get_text(&self, state: &mut State) -> String {
1636        state.style.text.get(*self).cloned().unwrap_or_default()
1637    }
1638
1639    fn get_font(&self, state: &mut State) -> String {
1640        state.style.font.get(*self).cloned().unwrap_or_default()
1641    }
1642}