1use std::path::PathBuf;
2
3use keyboard_types::{
4 Code,
5 Key,
6 Modifiers,
7};
8use torin::prelude::CursorPoint;
9
10use crate::{
11 events::{
12 data::{
13 MouseButton,
14 WheelSource,
15 },
16 name::EventName,
17 },
18 prelude::{
19 Force,
20 TouchPhase,
21 },
22};
23
24#[derive(Clone, Debug, PartialEq, Copy, Eq, Hash)]
25pub enum MouseEventName {
26 MouseUp,
27 MouseDown,
28 MouseMove,
29}
30
31impl From<MouseEventName> for EventName {
32 fn from(value: MouseEventName) -> Self {
33 match value {
34 MouseEventName::MouseUp => EventName::MouseUp,
35 MouseEventName::MouseMove => EventName::MouseMove,
36 MouseEventName::MouseDown => EventName::MouseDown,
37 }
38 }
39}
40
41#[derive(Clone, Debug, PartialEq, Copy, Eq, Hash)]
42pub enum WheelEventName {
43 Wheel,
44}
45
46impl From<WheelEventName> for EventName {
47 fn from(value: WheelEventName) -> Self {
48 match value {
49 WheelEventName::Wheel => EventName::Wheel,
50 }
51 }
52}
53
54#[derive(Clone, Debug, PartialEq, Copy, Eq, Hash)]
55pub enum KeyboardEventName {
56 KeyDown,
57 KeyUp,
58}
59
60impl From<KeyboardEventName> for EventName {
61 fn from(value: KeyboardEventName) -> Self {
62 match value {
63 KeyboardEventName::KeyDown => EventName::KeyDown,
64 KeyboardEventName::KeyUp => EventName::KeyUp,
65 }
66 }
67}
68
69#[derive(Clone, Debug, PartialEq, Copy, Eq, Hash)]
70pub enum FileEventName {
71 FileDrop,
72 FileHover,
73 FileHoverCancelled,
74}
75
76impl From<FileEventName> for EventName {
77 fn from(value: FileEventName) -> Self {
78 match value {
79 FileEventName::FileDrop => EventName::FileDrop,
80 FileEventName::FileHover => EventName::GlobalFileHover,
81 FileEventName::FileHoverCancelled => EventName::GlobalFileHoverCancelled,
82 }
83 }
84}
85
86#[derive(Clone, Debug, PartialEq)]
88pub enum PlatformEvent {
89 Mouse {
91 name: MouseEventName,
92 cursor: CursorPoint,
93 button: Option<MouseButton>,
94 },
95 Keyboard {
97 name: KeyboardEventName,
98 key: Key,
99 code: Code,
100 modifiers: Modifiers,
101 },
102 Wheel {
104 name: WheelEventName,
105 scroll: CursorPoint,
106 cursor: CursorPoint,
107 source: WheelSource,
108 },
109 Touch {
111 name: TouchEventName,
112 location: CursorPoint,
113 finger_id: u64,
114 phase: TouchPhase,
115 force: Option<Force>,
116 },
117 ImePreedit {
119 name: ImeEventName,
120 text: String,
121 cursor: Option<(usize, usize)>,
122 },
123 File {
125 name: FileEventName,
126 cursor: CursorPoint,
127 file_path: Option<PathBuf>,
128 },
129}
130
131#[derive(Clone, Debug, PartialEq, Copy, Eq, Hash)]
132pub enum ImeEventName {
133 Preedit,
134}
135
136impl From<ImeEventName> for EventName {
137 fn from(value: ImeEventName) -> Self {
138 match value {
139 ImeEventName::Preedit => EventName::ImePreedit,
140 }
141 }
142}
143
144#[derive(Clone, Debug, PartialEq, Copy, Eq, Hash)]
145pub enum TouchEventName {
146 TouchStart,
147 TouchMove,
148 TouchEnd,
149 TouchCancel,
150}
151
152impl From<TouchEventName> for EventName {
153 fn from(value: TouchEventName) -> Self {
154 match value {
155 TouchEventName::TouchStart => EventName::TouchStart,
156 TouchEventName::TouchMove => EventName::TouchMove,
157 TouchEventName::TouchEnd => EventName::TouchEnd,
158 TouchEventName::TouchCancel => EventName::TouchCancel,
159 }
160 }
161}
162
163impl ragnarok::SourceEvent for PlatformEvent {
164 type Name = EventName;
165
166 fn is_moved(&self) -> bool {
168 matches!(
169 &self,
170 Self::Mouse {
171 name: MouseEventName::MouseMove,
172 ..
173 } | Self::Touch {
174 phase: TouchPhase::Moved,
175 ..
176 }
177 )
178 }
179
180 fn is_pressed(&self) -> bool {
182 matches!(
183 &self,
184 Self::Mouse {
185 name: MouseEventName::MouseDown,
186 ..
187 } | Self::Touch {
188 name: TouchEventName::TouchStart,
189 ..
190 }
191 )
192 }
193
194 fn is_touch_released(&self) -> bool {
196 matches!(
197 &self,
198 Self::Touch {
199 phase: TouchPhase::Ended,
200 ..
201 }
202 )
203 }
204
205 fn as_event_name(&self) -> EventName {
206 match self {
207 Self::Mouse { name, .. } => (*name).into(),
208 Self::Keyboard { name, .. } => (*name).into(),
209 Self::Wheel { name, .. } => (*name).into(),
210 Self::ImePreedit { name, .. } => (*name).into(),
211 Self::Touch { name, .. } => (*name).into(),
212 Self::File { name, .. } => (*name).into(),
213 }
214 }
215
216 fn try_location(&self) -> Option<ragnarok::CursorPoint> {
217 match self {
218 PlatformEvent::Mouse { cursor, .. } => Some(*cursor),
219 PlatformEvent::Wheel { cursor, .. } => Some(*cursor),
220 PlatformEvent::Touch { location, .. } => Some(*location),
221 PlatformEvent::File { cursor, .. } => Some(*cursor),
222 _ => None,
223 }
224 }
225}