1use crate::state::style::*;
2use crate::{Entity, EventHandler, State, Widget};
3
4use std::{cell::RefCell, marker::PhantomData};
5use std::rc::Rc;
6
7pub 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 pub(crate) fn new(state: &'a mut State, entity: Entity) -> Self {
18 Builder::<T> { entity, state, phantom: PhantomData}
19 }
20
21 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 pub fn state(&mut self) -> &mut State {
35 self.state
36 }
37
38 pub fn entity(&self) -> Entity {
40 self.entity
41 }
42
43 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 pub fn class(mut self, class_name: &str) -> Self {
62 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 pub fn set_element(mut self, element: &str) -> Self {
76 self.entity.set_element(self.state, element);
79
80 self
81 }
82
83 pub fn set_id(mut self, id: &str) -> Self {
85 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 pub fn set_hoverable(mut self, value: bool) -> Self {
100 self.state.data.set_hoverable(self.entity, value);
101
102 self
103 }
104
105 pub fn set_focusable(mut self, value: bool) -> Self {
107 self.state.data.set_focusable(self.entity, value);
108
109 self
110 }
111
112 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 pub fn set_checked(mut self, value: bool) -> Self {
121 self.entity().set_checked(self.state, value);
122
123 self
124 }
125
126 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 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 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 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_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 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 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 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 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 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 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 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