Skip to main content

ferroui_base/input/
drag_event_args.rs

1use super::{DragDropEffects, IDataTransfer, IKeyModifiersEventArgs, KeyModifiers};
2use crate::interactivity::{Interactive, RoutedEvent, RoutedEventArgs};
3use crate::{ferro_routed_event_args, Point, Ref, Visual};
4use std::cell::Cell;
5use std::rc::Rc;
6
7/// Provides data for the drag-and-drop events.
8#[derive(Clone)]
9pub struct DragEventArgs {
10    base: RoutedEventArgs,
11    target: Ref<Interactive>,
12    target_location: Point,
13    drag_effects: Rc<Cell<DragDropEffects>>,
14    data_transfer: Rc<dyn IDataTransfer>,
15    key_modifiers: KeyModifiers,
16}
17
18ferro_routed_event_args!(DragEventArgs: RoutedEventArgs);
19
20impl DragEventArgs {
21    /// Creates drag event args. `target_location` is the location of the
22    /// pointer in the coordinates of `target`.
23    pub fn new(
24        routed_event: Option<&RoutedEvent<DragEventArgs>>,
25        data_transfer: Rc<dyn IDataTransfer>,
26        target: Ref<Interactive>,
27        target_location: Point,
28        key_modifiers: KeyModifiers,
29    ) -> Self {
30        let base = RoutedEventArgs::new();
31        base.set_routed_event(routed_event);
32        Self {
33            base,
34            target,
35            target_location,
36            drag_effects: Rc::new(Cell::new(DragDropEffects::NONE)),
37            data_transfer,
38            key_modifiers,
39        }
40    }
41
42    /// The effects of the operation. A handler sets them to what the
43    /// target accepts.
44    #[inline]
45    pub fn drag_effects(&self) -> DragDropEffects {
46        self.drag_effects.get()
47    }
48
49    /// Sets the effects of the operation.
50    #[inline]
51    pub fn set_drag_effects(&self, value: DragDropEffects) {
52        self.drag_effects.set(value)
53    }
54
55    /// The data being dragged.
56    #[inline]
57    pub fn data_transfer(&self) -> &Rc<dyn IDataTransfer> {
58        &self.data_transfer
59    }
60
61    /// The key modifiers held down during the event.
62    #[inline]
63    pub fn key_modifiers(&self) -> KeyModifiers {
64        self.key_modifiers
65    }
66
67    /// Gets the position of the pointer relative to a visual.
68    pub fn get_position(&self, relative_to: &Visual) -> Point {
69        self.target.translate_point(self.target_location, relative_to).unwrap_or(Point::new(0.0, 0.0))
70    }
71}
72
73impl IKeyModifiersEventArgs for DragEventArgs {
74    fn key_modifiers(&self) -> KeyModifiers {
75        self.key_modifiers
76    }
77}