freya_core/events/
name.rs

1#[derive(Clone, Copy, PartialEq, 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
46impl Eq for EventName {}
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) -> Vec<Self> {
96        let mut events = Vec::new();
97        match self {
98            Self::MouseUp => events.extend([Self::GlobalMouseUp, Self::CaptureGlobalMouseUp]),
99            Self::MouseDown => events.push(Self::GlobalMouseDown),
100            Self::MouseMove => events.extend([Self::GlobalMouseMove, Self::CaptureGlobalMouseMove]),
101
102            Self::KeyDown => events.push(Self::GlobalKeyDown),
103            Self::KeyUp => events.push(Self::GlobalKeyUp),
104
105            Self::GlobalFileHover => events.push(Self::GlobalFileHover),
106            Self::GlobalFileHoverCancelled => events.push(Self::GlobalFileHoverCancelled),
107            _ => {}
108        }
109        events
110    }
111
112    fn get_derived_events(&self) -> Vec<Self> {
113        let mut events = Vec::new();
114
115        events.push(*self);
116
117        match self {
118            Self::MouseMove | Self::TouchMove => events.extend([Self::PointerEnter]),
119            Self::MouseDown | Self::TouchStart => events.extend([Self::PointerDown]),
120            Self::MouseUp | Self::TouchEnd => events.extend([Self::PointerPress]),
121            _ => {}
122        }
123
124        events
125    }
126
127    fn get_cancellable_events(&self) -> Vec<Self> {
128        let mut events = Vec::new();
129
130        events.push(*self);
131
132        match self {
133            Self::KeyDown => events.extend([Self::GlobalKeyDown]),
134            Self::KeyUp => events.extend([Self::GlobalKeyUp]),
135
136            Self::MouseUp | Self::PointerPress => events.extend([Self::GlobalMouseUp]),
137            Self::MouseDown | Self::PointerDown => events.extend([Self::GlobalMouseDown]),
138
139            Self::CaptureGlobalMouseMove => {
140                events.extend([Self::MouseMove, Self::PointerEnter, Self::GlobalMouseMove])
141            }
142            Self::CaptureGlobalMouseUp => {
143                events.extend([Self::MouseUp, Self::PointerPress, Self::GlobalMouseUp])
144            }
145
146            _ => {}
147        }
148
149        events
150    }
151
152    fn is_global(&self) -> bool {
153        matches!(
154            self,
155            Self::GlobalKeyDown
156                | Self::GlobalKeyUp
157                | Self::GlobalMouseUp
158                | Self::GlobalMouseMove
159                | Self::GlobalFileHover
160                | Self::GlobalFileHoverCancelled
161        )
162    }
163
164    fn is_moved(&self) -> bool {
165        matches!(
166            &self,
167            Self::MouseMove
168                | Self::TouchMove
169                | Self::CaptureGlobalMouseMove
170                | Self::GlobalMouseMove
171        )
172    }
173
174    fn does_bubble(&self) -> bool {
175        !self.is_moved()
176            && !self.is_enter()
177            && !self.is_left()
178            && !self.is_global()
179            && !self.is_capture()
180    }
181
182    fn does_go_through_solid(&self) -> bool {
183        // TODO
184        false
185    }
186
187    fn is_enter(&self) -> bool {
188        matches!(&self, Self::PointerEnter)
189    }
190
191    fn is_pressed(&self) -> bool {
192        matches!(self, Self::MouseDown | Self::PointerDown)
193    }
194
195    fn is_released(&self) -> bool {
196        matches!(&self, Self::PointerPress)
197    }
198
199    fn new_leave() -> Self {
200        Self::PointerLeave
201    }
202}