ferroui_controls/date_time_pickers/
picker_presenter_base.rs1use crate::primitives::{TemplatedControl, TemplatedControlImpl};
2use crate::ControlImpl;
3use ferroui_base::input::InputElementImpl;
4use ferroui_base::interactivity::InteractiveImpl;
5use ferroui_base::layout::LayoutableImpl;
6use ferroui_base::reactive::{Disposable, IDisposable};
7use ferroui_base::utilities::HandlerList;
8use ferroui_base::{ferro_class, ferro_class_info, ferro_impl_classes, FerroObjectImpl, StyledElementImpl, VisualImpl};
9use std::rc::Rc;
10
11#[repr(C)]
13pub struct PickerPresenterBase {
14 base: TemplatedControl,
15 confirmed: HandlerList<dyn Fn()>,
16 dismissed: HandlerList<dyn Fn()>,
17}
18
19ferro_class! {
20 PickerPresenterBase: TemplatedControl, virtuals PickerPresenterBaseImpl: TemplatedControlImpl {
21 fn on_confirmed(this);
23 fn on_dismiss(this);
25 }
26}
27
28ferro_class_info!(PickerPresenterBase {});
29
30ferro_impl_classes!(
31 PickerPresenterBase: FerroObjectImpl,
32 StyledElementImpl,
33 VisualImpl,
34 LayoutableImpl,
35 InteractiveImpl,
36 InputElementImpl,
37 ControlImpl,
38 TemplatedControlImpl
39);
40
41impl PickerPresenterBaseImpl for PickerPresenterBase {
42 fn on_confirmed(this: &Self) {
43 for (_, handler) in this.confirmed.snapshot().iter() {
44 handler();
45 }
46 }
47
48 fn on_dismiss(this: &Self) {
49 for (_, handler) in this.dismissed.snapshot().iter() {
50 handler();
51 }
52 }
53}
54
55impl PickerPresenterBase {
56 pub fn construct() -> Self {
58 Self { base: TemplatedControl::construct(), confirmed: HandlerList::new(), dismissed: HandlerList::new() }
59 }
60
61 pub fn confirmed(&self, handler: impl Fn() + 'static) -> Rc<dyn IDisposable> {
64 let token = self.confirmed.add(Rc::new(handler));
65 let weak = self.to_ref().downgrade();
66 Disposable::create(move || {
67 if let Some(this) = weak.upgrade() {
68 this.confirmed.remove(token);
69 }
70 })
71 }
72
73 pub fn dismissed(&self, handler: impl Fn() + 'static) -> Rc<dyn IDisposable> {
76 let token = self.dismissed.add(Rc::new(handler));
77 let weak = self.to_ref().downgrade();
78 Disposable::create(move || {
79 if let Some(this) = weak.upgrade() {
80 this.dismissed.remove(token);
81 }
82 })
83 }
84}