ferroui_base/input/
drag_event_args.rs1use 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#[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 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 #[inline]
45 pub fn drag_effects(&self) -> DragDropEffects {
46 self.drag_effects.get()
47 }
48
49 #[inline]
51 pub fn set_drag_effects(&self, value: DragDropEffects) {
52 self.drag_effects.set(value)
53 }
54
55 #[inline]
57 pub fn data_transfer(&self) -> &Rc<dyn IDataTransfer> {
58 &self.data_transfer
59 }
60
61 #[inline]
63 pub fn key_modifiers(&self) -> KeyModifiers {
64 self.key_modifiers
65 }
66
67 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}