ferroui_base/interactivity/
interactive_extensions.rs1use super::{IRoutedEventArgs, Interactive, RoutedEvent, RoutingStrategies};
4use crate::reactive::{Disposable, IDisposable, IObservable, Observable};
5use crate::Ref;
6use std::rc::Rc;
7
8impl Interactive {
9 pub fn add_disposable_handler<TEventArgs: IRoutedEventArgs>(
13 &self,
14 routed_event: &RoutedEvent<TEventArgs>,
15 handler: impl Fn(&Interactive, &TEventArgs) + 'static,
16 ) -> Rc<dyn IDisposable> {
17 self.add_disposable_handler_with(routed_event, handler, Self::DEFAULT_ROUTES, false)
18 }
19
20 pub fn add_disposable_handler_with<TEventArgs: IRoutedEventArgs>(
23 &self,
24 routed_event: &RoutedEvent<TEventArgs>,
25 handler: impl Fn(&Interactive, &TEventArgs) + 'static,
26 routes: RoutingStrategies,
27 handled_events_too: bool,
28 ) -> Rc<dyn IDisposable> {
29 let token = self.add_handler_with(routed_event, handler, routes, handled_events_too);
30 let instance = self.to_ref().downgrade();
36 let routed_event = routed_event.as_routed_event();
37
38 Disposable::create(move || {
39 if let Some(instance) = instance.upgrade() {
40 instance.remove_handler(&routed_event, token);
41 }
42 })
43 }
44
45 pub fn get_interactive_parent(&self) -> Option<Ref<Interactive>> {
48 self.interactive_parent()
49 }
50
51 pub fn get_observable<TEventArgs: IRoutedEventArgs + Clone>(
56 &self,
57 routed_event: &RoutedEvent<TEventArgs>,
58 ) -> Rc<dyn IObservable<TEventArgs>> {
59 self.get_observable_with(routed_event, Self::DEFAULT_ROUTES, false)
60 }
61
62 pub fn get_observable_with<TEventArgs: IRoutedEventArgs + Clone>(
69 &self,
70 routed_event: &RoutedEvent<TEventArgs>,
71 routes: RoutingStrategies,
72 handled_events_too: bool,
73 ) -> Rc<dyn IObservable<TEventArgs>> {
74 let o = self.to_ref();
75 let routed_event = *routed_event;
76
77 Observable::create(move |observer| {
78 o.add_disposable_handler_with(
79 &routed_event,
80 move |_, e: &TEventArgs| observer.on_next(e.clone()),
81 routes,
82 handled_events_too,
83 )
84 })
85 }
86}