ferroui_base/input/
focus_changing_event_args.rs1use super::{IKeyModifiersEventArgs, InputElement, KeyModifiers, NavigationMethod};
2use crate::interactivity::{RoutedEvent, RoutedEventArgs};
3use crate::{ferro_routed_event_args, Ref};
4use std::cell::{Cell, RefCell};
5use std::rc::Rc;
6
7#[derive(Clone)]
10pub struct FocusChangingEventArgs {
11 base: RoutedEventArgs,
12 new_focused_element: Rc<RefCell<Option<Ref<InputElement>>>>,
13 canceled: Rc<Cell<bool>>,
14 pub(crate) can_cancel_or_redirect_focus: bool,
15
16 pub old_focused_element: Option<Ref<InputElement>>,
18
19 pub navigation_method: NavigationMethod,
21
22 pub key_modifiers: KeyModifiers,
24}
25
26ferro_routed_event_args!(FocusChangingEventArgs: RoutedEventArgs);
27
28impl FocusChangingEventArgs {
29 pub fn new<T: ?Sized>(routed_event: &RoutedEvent<T>) -> Self {
31 Self {
32 base: RoutedEventArgs::with_event(routed_event),
33 new_focused_element: Rc::new(RefCell::new(None)),
34 canceled: Rc::new(Cell::new(false)),
35 can_cancel_or_redirect_focus: false,
36 old_focused_element: None,
37 navigation_method: NavigationMethod::Unspecified,
38 key_modifiers: KeyModifiers::NONE,
39 }
40 }
41
42 pub fn new_focused_element(&self) -> Option<Ref<InputElement>> {
44 self.new_focused_element.borrow().clone()
45 }
46
47 pub(crate) fn set_new_focused_element(&self, value: Option<Ref<InputElement>>) {
48 let old = self.new_focused_element.replace(value);
49 drop(old);
50 }
51
52 pub fn canceled(&self) -> bool {
54 self.canceled.get()
55 }
56
57 pub fn try_cancel(&self) -> bool {
60 self.canceled.set(self.can_cancel_or_redirect_focus);
61 self.canceled.get()
62 }
63
64 pub fn try_set_new_focused_element(&self, input_element: Option<&Ref<InputElement>>) -> bool {
68 if self.can_cancel_or_redirect_focus {
69 self.set_new_focused_element(input_element.cloned());
70 }
71
72 input_element == self.new_focused_element.borrow().as_ref()
73 }
74}
75
76impl IKeyModifiersEventArgs for FocusChangingEventArgs {
77 fn key_modifiers(&self) -> KeyModifiers {
78 self.key_modifiers
79 }
80}