Skip to main content

ferroui_controls/pull_to_refresh/
refresh_requested_event_args.rs

1use super::RefreshCompletionDeferral;
2use ferroui_base::ferro_routed_event_args;
3use ferroui_base::interactivity::{RoutedEvent, RoutedEventArgs};
4use std::rc::Rc;
5
6/// Provides event data for RefreshRequested events.
7#[derive(Clone)]
8pub struct RefreshRequestedEventArgs {
9    base: RoutedEventArgs,
10    refresh_completion_deferral: Rc<RefreshCompletionDeferral>,
11}
12
13ferro_routed_event_args!(RefreshRequestedEventArgs: RoutedEventArgs);
14
15impl RefreshRequestedEventArgs {
16    /// Creates args whose deferral runs `deferred_action` once completed.
17    pub fn new<T: ?Sized>(deferred_action: impl Fn() + 'static, routed_event: Option<&RoutedEvent<T>>) -> Self {
18        Self::with_deferral(RefreshCompletionDeferral::new(deferred_action), routed_event)
19    }
20
21    /// Creates args that share an existing deferral.
22    pub fn with_deferral<T: ?Sized>(
23        completion_deferral: Rc<RefreshCompletionDeferral>,
24        routed_event: Option<&RoutedEvent<T>>,
25    ) -> Self {
26        let base = match routed_event {
27            Some(routed_event) => RoutedEventArgs::with_event(routed_event),
28            None => RoutedEventArgs::new(),
29        };
30        Self { base, refresh_completion_deferral: completion_deferral }
31    }
32
33    /// Gets a deferral object for managing the work done in the
34    /// RefreshRequested event handler.
35    pub fn get_deferral(&self) -> Rc<RefreshCompletionDeferral> {
36        self.refresh_completion_deferral.get()
37    }
38
39    pub(crate) fn increment_count(&self) {
40        drop(self.refresh_completion_deferral.get());
41    }
42
43    pub(crate) fn decrement_count(&self) {
44        self.refresh_completion_deferral.complete();
45    }
46}