freya_core/events/
name.rs

1#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
2pub enum EventName {
3    // Platform Mouse
4    MouseUp,
5    MouseDown,
6    MouseMove,
7
8    // Platform Mouse or Touch
9    PointerPress,
10    PointerDown,
11    PointerEnter,
12    PointerLeave,
13
14    // Platform Keyboard
15    KeyDown,
16    KeyUp,
17
18    // Platform Touch
19    TouchCancel,
20    TouchStart,
21    TouchMove,
22    TouchEnd,
23
24    GlobalMouseMove,
25    GlobalMouseUp,
26    GlobalMouseDown,
27
28    GlobalKeyDown,
29    GlobalKeyUp,
30
31    GlobalFileHover,
32    GlobalFileHoverCancelled,
33
34    CaptureGlobalMouseMove,
35    CaptureGlobalMouseUp,
36
37    Wheel,
38
39    Sized,
40
41    FileDrop,
42
43    ImePreedit,
44}
45
46use std::collections::HashSet;
47
48impl PartialOrd for EventName {
49    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
50        Some(self.cmp(other))
51    }
52}
53
54impl Ord for EventName {
55    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
56        match self {
57            // Capture events have max priority
58            e if e.is_capture() => std::cmp::Ordering::Less,
59            // Left events have more priority over non-left
60            e if e.is_left() => std::cmp::Ordering::Less,
61            e => {
62                if e == other {
63                    std::cmp::Ordering::Equal
64                } else {
65                    std::cmp::Ordering::Greater
66                }
67            }
68        }
69    }
70}
71
72impl EventName {
73    /// Check if this even captures others or not
74    pub fn is_capture(&self) -> bool {
75        matches!(
76            &self,
77            Self::CaptureGlobalMouseMove | Self::CaptureGlobalMouseUp
78        )
79    }
80
81    pub fn is_left(&self) -> bool {
82        matches!(&self, Self::PointerLeave)
83    }
84
85    pub fn is_down(&self) -> bool {
86        matches!(self, Self::PointerDown)
87    }
88
89    pub fn is_press(&self) -> bool {
90        matches!(self, Self::PointerPress)
91    }
92}
93
94impl ragnarok::NameOfEvent for EventName {
95    fn get_global_events(&self) -> HashSet<Self> {
96        match self {
97            Self::MouseUp => HashSet::from([Self::GlobalMouseUp, Self::CaptureGlobalMouseUp]),
98            Self::MouseDown => HashSet::from([Self::GlobalMouseDown]),
99            Self::MouseMove => HashSet::from([Self::GlobalMouseMove, Self::CaptureGlobalMouseMove]),
100
101            Self::KeyDown => HashSet::from([Self::GlobalKeyDown]),
102            Self::KeyUp => HashSet::from([Self::GlobalKeyUp]),
103
104            Self::GlobalFileHover => HashSet::from([Self::GlobalFileHover]),
105            Self::GlobalFileHoverCancelled => HashSet::from([Self::GlobalFileHoverCancelled]),
106            _ => HashSet::new(),
107        }
108    }
109
110    fn get_derived_events(&self) -> HashSet<Self> {
111        let mut events = HashSet::new();
112
113        events.insert(*self);
114
115        match self {
116            Self::MouseMove | Self::TouchMove => {
117                events.insert(Self::PointerEnter);
118            }
119            Self::MouseDown | Self::TouchStart => {
120                events.insert(Self::PointerDown);
121            }
122            Self::MouseUp | Self::TouchEnd => {
123                events.insert(Self::PointerPress);
124            }
125            _ => {}
126        }
127
128        events
129    }
130
131    fn get_cancellable_events(&self) -> HashSet<Self> {
132        let mut events = HashSet::new();
133
134        events.insert(*self);
135
136        match self {
137            Self::KeyDown => {
138                events.insert(Self::GlobalKeyDown);
139            }
140            Self::KeyUp => {
141                events.insert(Self::GlobalKeyUp);
142            }
143            Self::MouseUp => events.extend([Self::PointerPress, Self::GlobalMouseUp]),
144            Self::PointerPress => events.extend([Self::MouseUp, Self::GlobalMouseUp]),
145            Self::MouseDown => events.extend([Self::PointerDown, Self::GlobalMouseDown]),
146            Self::PointerDown => events.extend([Self::MouseDown, Self::GlobalMouseDown]),
147            Self::CaptureGlobalMouseMove => {
148                events.extend([Self::MouseMove, Self::PointerEnter, Self::GlobalMouseMove]);
149            }
150            Self::CaptureGlobalMouseUp => {
151                events.extend([Self::MouseUp, Self::PointerPress, Self::GlobalMouseUp]);
152            }
153
154            _ => {}
155        }
156
157        events
158    }
159
160    fn is_global(&self) -> bool {
161        matches!(
162            self,
163            Self::GlobalKeyDown
164                | Self::GlobalKeyUp
165                | Self::GlobalMouseUp
166                | Self::GlobalMouseMove
167                | Self::GlobalFileHover
168                | Self::GlobalFileHoverCancelled
169        )
170    }
171
172    fn is_moved(&self) -> bool {
173        matches!(
174            &self,
175            Self::MouseMove
176                | Self::TouchMove
177                | Self::CaptureGlobalMouseMove
178                | Self::GlobalMouseMove
179        )
180    }
181
182    fn does_bubble(&self) -> bool {
183        !self.is_moved()
184            && !self.is_enter()
185            && !self.is_left()
186            && !self.is_global()
187            && !self.is_capture()
188    }
189
190    fn does_go_through_solid(&self) -> bool {
191        // TODO
192        false
193    }
194
195    fn is_enter(&self) -> bool {
196        matches!(&self, Self::PointerEnter)
197    }
198
199    fn is_pressed(&self) -> bool {
200        matches!(self, Self::MouseDown | Self::PointerDown)
201    }
202
203    fn is_released(&self) -> bool {
204        matches!(&self, Self::PointerPress)
205    }
206
207    fn new_leave() -> Self {
208        Self::PointerLeave
209    }
210}