Skip to main content

ferroui_controls/date_time_pickers/
picker_presenter_base.rs

1use 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/// Defines the base class for the date and time picker presenters.
12#[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        /// Raises the `Confirmed` event.
22        fn on_confirmed(this);
23        /// Raises the `Dismissed` event.
24        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    /// Creates the class data; see [`ferroui_base::FerroObject::construct`].
57    pub fn construct() -> Self {
58        Self { base: TemplatedControl::construct(), confirmed: HandlerList::new(), dismissed: HandlerList::new() }
59    }
60
61    /// Raised when the selection of the presenter is confirmed. Disposing
62    /// the returned handle removes the handler.
63    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    /// Raised when the presenter is dismissed. Disposing the returned handle
74    /// removes the handler.
75    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}