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 }
174 )
175 }
176
177 fn is_pressed(&self) -> bool {
179 matches!(
180 &self,
181 Self::Mouse {
182 name: MouseEventName::MouseDown,
183 ..
184 }
185 )
186 }
187
188 fn as_event_name(&self) -> EventName {
189 match self {
190 Self::Mouse { name, .. } => (*name).into(),
191 Self::Keyboard { name, .. } => (*name).into(),
192 Self::Wheel { name, .. } => (*name).into(),
193 Self::ImePreedit { name, .. } => (*name).into(),
194 Self::Touch { name, .. } => (*name).into(),
195 Self::File { name, .. } => (*name).into(),
196 }
197 }
198
199 fn try_location(&self) -> Option<ragnarok::CursorPoint> {
200 match self {
201 PlatformEvent::Mouse { cursor, .. } => Some(*cursor),
202 PlatformEvent::Wheel { cursor, .. } => Some(*cursor),
203 PlatformEvent::Touch { location, .. } => Some(*location),
204 PlatformEvent::File { cursor, .. } => Some(*cursor),
205 _ => None,
206 }
207 }
208}