ferroui_base/input/
context_requested_event_args.rs1use super::{HoldingRoutedEventArgs, InputElement, PointerEventArgs, PointerType};
2use crate::interactivity::RoutedEventArgs;
3use crate::{ferro_routed_event_args, Point, Rect, Visual, WeakRef};
4use std::cell::RefCell;
5use std::rc::Rc;
6
7#[derive(Clone)]
9pub struct ContextRequestedEventArgs {
10 base: RoutedEventArgs,
11 pointer_event_args: Option<PointerEventArgs>,
12 is_holding: bool,
13 placement_rect: Rc<RefCell<Option<(WeakRef<Visual>, Rect)>>>,
14}
15
16ferro_routed_event_args!(ContextRequestedEventArgs: RoutedEventArgs);
17
18impl Default for ContextRequestedEventArgs {
19 fn default() -> Self {
20 Self::new()
21 }
22}
23
24impl ContextRequestedEventArgs {
25 pub fn new() -> Self {
28 Self {
29 base: RoutedEventArgs::with_event(InputElement::context_requested_event()),
30 pointer_event_args: None,
31 is_holding: false,
32 placement_rect: Rc::new(RefCell::new(None)),
33 }
34 }
35
36 pub fn from_pointer_event_args(pointer_event_args: &PointerEventArgs) -> Self {
38 Self { pointer_event_args: Some(pointer_event_args.clone()), ..Self::new() }
39 }
40
41 pub fn from_context_requested_event_args(context_requested_event_args: &ContextRequestedEventArgs) -> Self {
43 Self {
44 pointer_event_args: context_requested_event_args.pointer_event_args.clone(),
45 placement_rect: context_requested_event_args.placement_rect.clone(),
46 ..Self::new()
47 }
48 }
49
50 pub(crate) fn from_holding(hold_routed_event_args: &HoldingRoutedEventArgs) -> Self {
51 Self {
52 pointer_event_args: Some(hold_routed_event_args.pointer_event_args().clone()),
53 is_holding: true,
54 ..Self::new()
55 }
56 }
57
58 pub fn try_get_position(&self, relative_to: Option<&InputElement>) -> Option<Point> {
64 self.pointer_event_args.as_ref().map(|e| e.get_position(relative_to.map(|element| &****element)))
65 }
66
67 pub fn set_placement_rect(&self, relative_to: &Visual, rect: Rect) {
73 *self.placement_rect.borrow_mut() = Some((relative_to.to_ref().downgrade(), rect));
74 }
75
76 pub fn try_get_placement_rect(&self, relative_to: &Visual) -> Option<Rect> {
80 let (owner, rect) = self.placement_rect.borrow().clone()?;
81 let owner = owner.upgrade()?;
82 owner.transform_to_visual(relative_to).map(|transform| rect.transform_to_aabb(transform))
83 }
84
85 pub fn clear_placement_rect(&self) {
87 self.placement_rect.borrow_mut().take();
88 }
89
90 pub fn is_holding(&self) -> bool {
94 self.is_holding
95 }
96
97 #[allow(dead_code)]
98 pub fn pointer_type(&self) -> Option<PointerType> {
99 self.pointer_event_args.as_ref().map(|e| e.pointer().type_())
100 }
101}