tuix_core/events/
builder.rs

1use crate::state::style::*;
2use crate::{Entity, EventHandler, State, Widget};
3
4use std::{cell::RefCell, marker::PhantomData};
5use std::rc::Rc;
6
7/// Contains an entity id and a mutable reference to state and can be used to set properties of a widget at build time
8pub struct Builder<'a,T> {
9    pub entity: Entity,
10    pub state: &'a mut State,
11    phantom: std::marker::PhantomData<T>,
12}
13
14impl<'a,T> Builder<'a,T> {
15
16    /// Creates a new Builder
17    pub(crate) fn new(state: &'a mut State, entity: Entity) -> Self {
18        Builder::<T> { entity, state, phantom: PhantomData}
19    }
20
21    /// Builds the widget into State
22    pub(crate) fn build(mut self, event_handler: T) -> Entity
23    where
24        T: EventHandler + 'static + Sized,
25    {
26        self.state
27            .event_handlers
28            .insert(self.entity, Box::new(event_handler));
29
30        self.entity
31    }
32
33    /// Returns a mutable reference to the State
34    pub fn state(&mut self) -> &mut State {
35        self.state
36    }
37
38    /// Returns the entity id contained within the builder
39    pub fn entity(&self) -> Entity {
40        self.entity
41    }
42
43    /// Sets the general callback for pressing a widget
44    pub fn on_press<F>(mut self, mut handler: F) -> Self
45    where 
46        T: Widget,
47        F: FnMut(&mut T, &mut State, Entity) + 'static,
48    {
49        self.state.callbacks.insert(self.entity, Box::new(move |callback, state, entity| {
50            if let Some(callback) = callback.downcast::<T>() {
51                (handler)(callback, state, entity);
52            } else {
53                println!("Failed");
54            }
55        }));
56
57        self
58    }
59
60    /// Adds a class name to the entity
61    pub fn class(mut self, class_name: &str) -> Self {
62        //self.state.style.insert_class(self.entity, class);
63        self.entity.class(self.state, class_name);
64
65        self
66    }
67
68    pub fn set_name(mut self, name: &str) -> Self {
69        self.state.style.name.insert(self.entity(), name.to_string());
70    
71        self
72    }
73
74    /// Sets the element name of the entity
75    pub fn set_element(mut self, element: &str) -> Self {
76        //self.state.style.insert_element(self.entity, element);
77
78        self.entity.set_element(self.state, element);
79
80        self
81    }
82
83    /// Sets the id of the entity
84    pub fn set_id(mut self, id: &str) -> Self {
85        //self.state.style.insert_id(self.entity, id);
86
87        todo!();
88        self
89    }
90
91    pub fn set_disabled(mut self, value: bool) -> Self {
92        self.entity().set_disabled(self.state, value);
93
94        self
95    }
96
97
98    /// Sets whether the entity can be hovered
99    pub fn set_hoverable(mut self, value: bool) -> Self {
100        self.state.data.set_hoverable(self.entity, value);
101
102        self
103    }
104
105    /// Sets whether the entity can be focused
106    pub fn set_focusable(mut self, value: bool) -> Self {
107        self.state.data.set_focusable(self.entity, value);
108
109        self
110    }
111
112    /// Sets the opacity of the entity
113    pub fn set_opacity(mut self, value: f32) -> Self {
114        self.state.style.opacity.insert(self.entity, Opacity(value));
115
116        self
117    }
118
119    /// Sets the checked state of the entity
120    pub fn set_checked(mut self, value: bool) -> Self {
121        self.entity().set_checked(self.state, value);
122
123        self
124    }
125
126    /// Sets the z-order of the entity
127    pub fn set_z_order(mut self, value: i32) -> Self {
128        self.state.style.z_order.insert(self.entity, value);
129
130        self
131    }
132
133    /// Sets the clip widget of the entity. The clip bounds of the entity are set to the bounds of the clip widget
134    pub fn set_clip_widget(mut self, value: Entity) -> Self {
135        self.state.style.clip_widget.insert(self.entity, value);
136
137        self
138    }
139
140    // Sets the text displayed within the entity
141    pub fn set_text(mut self, value: &str) -> Self {
142        self.state.style.text.insert(self.entity, value.to_owned());
143
144        self
145    }
146
147    pub fn set_font(mut self, value: &str) -> Self {
148        self.state.style.font.insert(self.entity, value.to_owned());
149
150        self
151    }
152
153    // Sets the tooltip associated with the entity
154    pub fn set_tooltip(mut self, value: &str) -> Self {
155        self.state
156            .style
157            .tooltip
158            .insert(self.entity, value.to_string());
159
160        self
161    }
162
163    // pub fn set_tooltip<F>(mut self, value: &str) -> Self 
164    // where F: FnOnce(&mut State, Entity)
165    // {
166    //     self.state
167    //         .style
168    //         .tooltip
169    //         .insert(self.entity, value.to_string());
170
171    //     self
172    // }
173
174    // Display
175    /// Sets the display type of the entity
176    pub fn set_display(mut self, value: Display) -> Self {
177        self.state.style.display.insert(self.entity, value);
178
179        self
180    }
181
182    pub fn set_visibility(mut self, value: Visibility) -> Self {
183        self.state.style.visibility.insert(self.entity, value);
184
185        self
186    }
187
188    pub fn set_overflow(mut self, value: Overflow) -> Self {
189        self.state.style.overflow.insert(self.entity, value);
190
191        self
192    }
193
194    // Background
195    pub fn set_background_color(mut self, value: Color) -> Self {
196        self.state.style.background_color.insert(self.entity, value);
197
198        self
199    }
200
201    pub fn set_background_image(mut self, value: Rc<()>) -> Self {
202        self.state
203            .style
204            .background_image
205            .insert(self.entity, value.clone());
206
207        self
208    }
209
210    pub fn set_background_gradient(mut self, value: LinearGradient) -> Self {
211        self.state
212            .style
213            .background_gradient
214            .insert(self.entity, value);
215
216        self
217    }
218
219    // Outer Shadow
220    pub fn set_outer_shadow_h_offset(mut self, value: Units) -> Self {
221        self.state
222            .style
223            .outer_shadow_h_offset
224            .insert(self.entity, value);
225
226        self
227    }
228
229    pub fn set_outer_shadow_v_offset(mut self, value: Units) -> Self {
230        self.state
231            .style
232            .outer_shadow_v_offset
233            .insert(self.entity, value);
234
235        self
236    }
237
238    pub fn set_outer_shadow_color(mut self, value: Color) -> Self {
239        self.state.style.outer_shadow_color.insert(self.entity, value);
240
241        self
242    }
243
244    pub fn set_outer_shadow_blur(mut self, value: Units) -> Self {
245        self.state.style.outer_shadow_blur.insert(self.entity, value);
246
247        self
248    }
249
250    // Inner Shadow
251    pub fn set_inner_shadow_h_offset(mut self, value: Units) -> Self {
252        self.state
253            .style
254            .inner_shadow_h_offset
255            .insert(self.entity, value);
256
257        self
258    }
259
260    pub fn set_inner_shadow_v_offset(mut self, value: Units) -> Self {
261        self.state
262            .style
263            .inner_shadow_v_offset
264            .insert(self.entity, value);
265
266        self
267    }
268
269    pub fn set_inner_shadow_color(mut self, value: Color) -> Self {
270        self.state.style.inner_shadow_color.insert(self.entity, value);
271
272        self
273    }
274
275    pub fn set_inner_shadow_blur(mut self, value: Units) -> Self {
276        self.state.style.inner_shadow_blur.insert(self.entity, value);
277
278        self
279    }
280
281    // Positioning
282
283    pub fn set_space(mut self, value: Units) -> Self {
284        self.state.style.left.insert(self.entity, value);
285        self.state.style.right.insert(self.entity, value);
286        self.state.style.top.insert(self.entity, value);
287        self.state.style.bottom.insert(self.entity, value);
288
289        self
290    }
291
292    pub fn set_left(mut self, value: Units) -> Self {
293        self.entity.set_left(self.state, value);
294
295        self
296    }
297
298    pub fn set_right(mut self, value: Units) -> Self {
299        self.entity.set_right(self.state, value);
300
301        self
302    }
303
304    pub fn set_top(mut self, value: Units) -> Self {
305        self.entity.set_top(self.state, value);
306        
307        self
308    }
309
310    pub fn set_bottom(mut self, value: Units) -> Self {
311        self.entity.set_bottom(self.state, value);
312        
313        self
314    }
315
316    // Size
317
318    pub fn set_width(mut self, value: Units) -> Self {
319        self.entity.set_width(self.state, value);
320
321        self
322    }
323
324    pub fn set_height(mut self, value: Units) -> Self {
325        self.entity.set_height(self.state, value);
326
327        self
328    }
329
330    // Size Constraints
331
332    pub fn set_min_width(mut self, value: Units) -> Self {
333        self.state.style.min_width.insert(self.entity, value);
334
335        self
336    }
337
338    pub fn set_max_width(mut self, value: Units) -> Self {
339        self.state.style.max_width.insert(self.entity, value);
340
341        self
342    }
343
344    pub fn set_min_height(mut self, value: Units) -> Self {
345        self.state.style.min_height.insert(self.entity, value);
346
347        self
348    }
349
350    pub fn set_max_height(mut self, value: Units) -> Self {
351        self.state.style.max_height.insert(self.entity, value);
352
353        self
354    }
355
356    pub fn set_min_left(mut self, value: Units) -> Self {
357        self.state.style.min_left.insert(self.entity, value);
358        self
359    }
360
361    pub fn set_min_right(mut self, value: Units) -> Self {
362        self.state.style.min_right.insert(self.entity, value);
363        self
364    }
365
366    pub fn set_min_top(mut self, value: Units) -> Self {
367        self.state.style.min_top.insert(self.entity, value);
368        self
369    }
370
371    pub fn set_min_bottom(mut self, value: Units) -> Self {
372        self.state.style.min_bottom.insert(self.entity, value);
373        self
374    }
375
376    pub fn set_max_left(mut self, value: Units) -> Self {
377        self.state.style.max_left.insert(self.entity, value);
378        self
379    }
380
381    pub fn set_max_right(mut self, value: Units) -> Self {
382        self.state.style.max_right.insert(self.entity, value);
383        self
384    }
385
386    pub fn set_max_top(mut self, value: Units) -> Self {
387        self.state.style.max_top.insert(self.entity, value);
388        self
389    }
390
391    pub fn set_max_bottom(mut self, value: Units) -> Self {
392        self.state.style.max_bottom.insert(self.entity, value);
393        self
394    }
395
396    // Border
397
398    pub fn set_border_color(mut self, value: Color) -> Self {
399        self.state.style.border_color.insert(self.entity, value);
400
401        self
402    }
403
404    pub fn set_border_width(mut self, value: Units) -> Self {
405        self.state.style.border_width.insert(self.entity, value);
406
407        self
408    }
409
410    pub fn set_border_corner_shape(mut self, value: BorderCornerShape) -> Self {
411        self.state.style.border_shape_top_left.insert(self.entity, value);
412        self.state.style.border_shape_top_right.insert(self.entity, value);
413        self.state.style.border_shape_bottom_left.insert(self.entity, value);
414        self.state.style.border_shape_bottom_right.insert(self.entity, value);
415
416        self
417    }
418
419    pub fn set_border_top_left_shape(mut self, value: BorderCornerShape) -> Self {
420        self.state.style.border_shape_top_left.insert(self.entity, value);
421
422        self
423    }
424
425    pub fn set_border_top_right_shape(mut self, value: BorderCornerShape) -> Self {
426        self.state.style.border_shape_top_right.insert(self.entity, value);
427
428        self
429    }
430
431    pub fn set_border_bottom_left_shape(mut self, value: BorderCornerShape) -> Self {
432        self.state.style.border_shape_bottom_left.insert(self.entity, value);
433
434        self
435    }
436
437    pub fn set_border_bottom_right_shape(mut self, value: BorderCornerShape) -> Self {
438        self.state.style.border_shape_bottom_right.insert(self.entity, value);
439
440        self
441    }
442
443    pub fn set_border_radius(mut self, value: Units) -> Self {
444        self.state
445            .style
446            .border_radius_top_left
447            .insert(self.entity, value);
448        self.state
449            .style
450            .border_radius_top_right
451            .insert(self.entity, value);
452        self.state
453            .style
454            .border_radius_bottom_left
455            .insert(self.entity, value);
456        self.state
457            .style
458            .border_radius_bottom_right
459            .insert(self.entity, value);
460
461        self
462    }
463
464    pub fn set_border_radius_top_left(mut self, value: Units) -> Self {
465        self.state
466            .style
467            .border_radius_top_left
468            .insert(self.entity, value);
469
470        self
471    }
472
473    pub fn set_border_radius_top_right(mut self, value: Units) -> Self {
474        self.state
475            .style
476            .border_radius_top_right
477            .insert(self.entity, value);
478
479        self
480    }
481
482    pub fn set_border_radius_bottom_left(mut self, value: Units) -> Self {
483        self.state
484            .style
485            .border_radius_bottom_left
486            .insert(self.entity, value);
487
488        self
489    }
490
491    pub fn set_border_radius_bottom_right(mut self, value: Units) -> Self {
492        self.state
493            .style
494            .border_radius_bottom_right
495            .insert(self.entity, value);
496
497        self
498    }
499
500    pub fn set_color(mut self, value: Color) -> Self {
501        self.state.style.font_color.insert(self.entity, value);
502
503        self
504    }
505
506    pub fn set_font_size(mut self, value: f32) -> Self {
507        self.state.style.font_size.insert(self.entity, value);
508
509        self
510    }
511
512    pub fn set_next_focus(mut self, value: Entity) -> Self {
513        if let Some(entity) = self.state.style.focus_order.get_mut(self.entity) {
514            entity.next = value;
515        } else {
516            self.state.style.focus_order.insert(
517                self.entity,
518                FocusOrder {
519                    next: value,
520                    ..Default::default()
521                },
522            );
523        }
524
525        self
526    }
527
528    pub fn set_prev_focus(mut self, value: Entity) -> Self {
529        if let Some(entity) = self.state.style.focus_order.get_mut(self.entity) {
530            entity.prev = value;
531        } else {
532            self.state.style.focus_order.insert(
533                self.entity,
534                FocusOrder {
535                    prev: value,
536                    ..Default::default()
537                },
538            );
539        }
540
541        self
542    }
543
544    pub fn set_focus(mut self, next: Entity, prev: Entity) -> Self {
545        if let Some(entity) = self.state.style.focus_order.get_mut(self.entity) {
546            entity.next = next;
547            entity.prev = prev;
548        } else {
549            self.state
550                .style
551                .focus_order
552                .insert(self.entity, FocusOrder { next, prev });
553        }
554
555        self
556    }
557
558    pub fn set_rotate(mut self, rotate: f32) -> Self {
559        self.state.style.rotate.insert(self.entity, rotate);
560
561        self
562    }
563
564    pub fn set_scale(mut self, scale: f32) -> Self {
565        self.state.style.scale.insert(self.entity, scale);
566
567        self
568    }
569
570    pub fn set_child_left(mut self, value: Units) -> Self {
571        self.state.style.child_left.insert(self.entity, value);
572        self
573    }
574
575    pub fn set_child_right(mut self, value: Units) -> Self {
576        self.state.style.child_right.insert(self.entity, value);
577        self
578    }
579
580    pub fn set_child_top(mut self, value: Units) -> Self {
581        self.state.style.child_top.insert(self.entity, value);
582        self
583    }
584
585    pub fn set_child_bottom(mut self, value: Units) -> Self {
586        self.state.style.child_bottom.insert(self.entity, value);
587        self
588    }
589
590    pub fn set_row_between(mut self, value: Units) -> Self {
591        self.state.style.row_between.insert(self.entity, value);
592        self
593    }
594
595
596    pub fn set_col_between(mut self, value: Units) -> Self {
597        self.state.style.col_between.insert(self.entity, value);
598        self
599    }
600
601
602    pub fn set_child_space(mut self, value: Units) -> Self {
603        self.state.style.child_left.insert(self.entity, value);
604        self.state.style.child_right.insert(self.entity, value);
605        self.state.style.child_top.insert(self.entity, value);
606        self.state.style.child_bottom.insert(self.entity, value);
607        self
608    }
609
610    pub fn set_position_type(mut self, value: PositionType) -> Self {
611        self.state.style.positioning_type.insert(self.entity, value);
612        self
613    }
614
615    pub fn set_layout_type(mut self, value: LayoutType) -> Self {
616        self.state.style.layout_type.insert(self.entity, value);
617        self
618    }
619
620    pub fn set_row_index(mut self, value: usize) -> Self {
621        self.state.style.row_index.insert(self.entity, value);
622
623        self
624    }
625
626    pub fn set_col_index(mut self, value: usize) -> Self {
627        self.state.style.col_index.insert(self.entity, value);
628
629        self
630    }
631
632    pub fn set_row_span(mut self, value: usize) -> Self {
633        self.state.style.row_span.insert(self.entity, value);
634
635        self
636    }
637
638    pub fn set_col_span(mut self, value: usize) -> Self {
639        self.state.style.col_span.insert(self.entity, value);
640
641        self
642    }
643
644    pub fn set_grid_rows(mut self, value: Vec<Units>) -> Self {
645        self.state.style.grid_rows.insert(self.entity(), value);
646
647        self
648    }
649
650    pub fn set_grid_cols(mut self, value: Vec<Units>) -> Self {
651        self.state.style.grid_cols.insert(self.entity(), value);
652
653        self
654    }
655}
656