freya_core/events/
platform.rs

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/// Data for [PlatformEvent].
87#[derive(Clone, Debug, PartialEq)]
88pub enum PlatformEvent {
89    /// A Mouse Event.
90    Mouse {
91        name: MouseEventName,
92        cursor: CursorPoint,
93        button: Option<MouseButton>,
94    },
95    /// A Keyboard Event.
96    Keyboard {
97        name: KeyboardEventName,
98        key: Key,
99        code: Code,
100        modifiers: Modifiers,
101    },
102    /// A Wheel Event.
103    Wheel {
104        name: WheelEventName,
105        scroll: CursorPoint,
106        cursor: CursorPoint,
107        source: WheelSource,
108    },
109    /// A Touch Event.
110    Touch {
111        name: TouchEventName,
112        location: CursorPoint,
113        finger_id: u64,
114        phase: TouchPhase,
115        force: Option<Force>,
116    },
117    /// An IME event.
118    ImePreedit {
119        name: ImeEventName,
120        text: String,
121        cursor: Option<(usize, usize)>,
122    },
123    /// A File event.
124    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    /// Check if the event means the cursor was moved.
167    fn is_moved(&self) -> bool {
168        matches!(
169            &self,
170            Self::Mouse {
171                name: MouseEventName::MouseMove,
172                ..
173            }
174        )
175    }
176
177    /// Check if this event can press state of a Node.
178    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}