windjammer_ui/platform/
mod.rs1pub mod desktop;
10pub mod web;
11
12#[cfg(target_os = "ios")]
14pub mod ios;
15
16#[cfg(target_os = "android")]
17pub mod android;
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub enum Target {
22 Desktop,
24 Web,
26 IOS,
28 Android,
30}
31
32impl Target {
33 pub fn parse(s: &str) -> Option<Self> {
35 match s.to_lowercase().as_str() {
36 "desktop" => Some(Target::Desktop),
37 "web" | "wasm" => Some(Target::Web),
38 "ios" | "iphone" => Some(Target::IOS),
39 "android" => Some(Target::Android),
40 _ => None,
41 }
42 }
43
44 pub fn is_mobile(&self) -> bool {
46 matches!(self, Target::IOS | Target::Android)
47 }
48
49 pub fn name(&self) -> &'static str {
51 match self {
52 Target::Desktop => "desktop",
53 Target::Web => "web",
54 Target::IOS => "ios",
55 Target::Android => "android",
56 }
57 }
58}
59
60pub trait Renderer {
62 fn render(&mut self, vnode: &crate::vdom::VNode);
64
65 fn handle_event(&mut self, event: Event);
67
68 fn update(&mut self);
70}
71
72#[derive(Debug, Clone)]
74pub enum Event {
75 Click { x: f32, y: f32 },
77 KeyPress { key: String },
79 TextInput { text: String },
81 Gesture(GestureEvent),
83}
84
85#[derive(Debug, Clone)]
87pub enum GestureEvent {
88 Swipe {
90 direction: SwipeDirection,
91 velocity: f32,
92 },
93 Pinch { scale: f32 },
95 LongPress { x: f32, y: f32, duration: f32 },
97 Pan { dx: f32, dy: f32 },
99}
100
101#[derive(Debug, Clone, Copy)]
102pub enum SwipeDirection {
103 Up,
104 Down,
105 Left,
106 Right,
107}
108
109#[cfg(test)]
110mod tests {
111 use super::*;
112
113 #[test]
114 fn test_target_from_str() {
115 assert_eq!(Target::parse("desktop"), Some(Target::Desktop));
116 assert_eq!(Target::parse("web"), Some(Target::Web));
117 assert_eq!(Target::parse("ios"), Some(Target::IOS));
118 assert_eq!(Target::parse("android"), Some(Target::Android));
119 assert_eq!(Target::parse("invalid"), None);
120 }
121
122 #[test]
123 fn test_is_mobile() {
124 assert!(!Target::Desktop.is_mobile());
125 assert!(!Target::Web.is_mobile());
126 assert!(Target::IOS.is_mobile());
127 assert!(Target::Android.is_mobile());
128 }
129
130 #[test]
131 fn test_target_name() {
132 assert_eq!(Target::Desktop.name(), "desktop");
133 assert_eq!(Target::Web.name(), "web");
134 assert_eq!(Target::IOS.name(), "ios");
135 assert_eq!(Target::Android.name(), "android");
136 }
137}