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
14fn 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 }
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 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 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 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 self.entity()
90 }
91
92 fn get_parent(self, state: &mut State) -> Option<Entity> {
94 self.entity().parent(&state.tree)
95 }
96
97 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 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 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 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 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 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 self.entity()
181 }
182
183 fn set_element(self, state: &mut State, value: &str) -> Entity {
185
186 state.style.elements.insert(self.entity(), value.to_string());
187
188 self.entity()
191 }
192
193 fn set_id(self, state: &mut State, value: &str) -> Entity {
194 todo!();
195
196 self.entity()
197 }
198
199 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 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 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 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 self.entity()
254 }
255
256 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 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::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::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::Redraw).target(Entity::root()));
294
295 self.entity()
296 }
297
298 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 self.entity()
321 }
322
323 fn set_left(self, state: &mut State, value: Units) -> Entity {
324 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 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 self.entity()
366 }
367
368 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 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 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 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 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 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 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 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 self.entity()
455 }
456
457 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 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 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 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 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 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 self.entity()
525 }
526
527 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 self
950 }
951
952}
953
954impl<T: AsEntity> PropSet for T {
955 }
964
965pub 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 fn get_overflow(&self, state: &mut State) -> Overflow;
1454
1455 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 fn get_background_color(&self, state: &mut State) -> Color {
1469 state.style.background_color.get(self.entity()).cloned().unwrap_or_default()
1470 }
1471
1472 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 fn get_width(&self, state: &mut State) -> Units;
1480 fn get_height(&self, state: &mut State) -> Units;
1481
1482 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 fn get_border_width(&self, state: &mut State) -> Units;
1490
1491 fn get_tooltip(&self, state: &mut State) -> String;
1493
1494 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 fn get_display(&self, state: &mut State) -> Display {
1556 state.style.display.get(*self).cloned().unwrap_or_default()
1557 }
1558
1559 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 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 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 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 fn get_tooltip(&self, state: &mut State) -> String {
1631 state.style.tooltip.get(*self).cloned().unwrap_or_default()
1632 }
1633
1634 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}