freya_core/
platform_state.rs

1use accesskit::{
2    Node as AccessibilityNode,
3    NodeId as AccessibilityId,
4};
5use torin::prelude::Size2D;
6use winit::window::Window;
7
8/// State consumed by components and updated by the platform.
9#[derive(Clone, Debug)]
10pub struct NativePlatformState {
11    pub focused_accessibility_id: AccessibilityId,
12    pub focused_accessibility_node: AccessibilityNode,
13    pub preferred_theme: PreferredTheme,
14    pub navigation_mode: NavigationMode,
15    pub information: PlatformInformation,
16    pub scale_factor: f64,
17}
18
19#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
20pub enum PreferredTheme {
21    #[default]
22    /// Use the light variant.
23    Light,
24
25    /// Use the dark variant.
26    Dark,
27}
28
29impl From<winit::window::Theme> for PreferredTheme {
30    fn from(value: winit::window::Theme) -> Self {
31        match value {
32            winit::window::Theme::Light => Self::Light,
33            winit::window::Theme::Dark => Self::Dark,
34        }
35    }
36}
37
38#[derive(Clone, Copy, PartialEq, Eq, Default, Debug)]
39pub enum NavigationMode {
40    #[default]
41    NotKeyboard,
42
43    Keyboard,
44}
45
46/// Information about the platform.
47#[derive(Clone, PartialEq, Debug, Copy)]
48pub struct PlatformInformation {
49    pub viewport_size: Size2D,
50    pub is_minimized: bool,
51    pub is_maximized: bool,
52    pub is_fullscreen: bool,
53}
54
55impl PlatformInformation {
56    pub fn from_winit(winit: &Window) -> Self {
57        let window_size = winit.inner_size();
58        Self {
59            viewport_size: Size2D::new(window_size.width as f32, window_size.height as f32),
60            is_minimized: winit.is_minimized().unwrap_or_default(),
61            is_maximized: winit.is_maximized(),
62            is_fullscreen: winit.fullscreen().is_some(),
63        }
64    }
65
66    pub fn new(
67        viewport_size: Size2D,
68        is_minimized: bool,
69        is_maximized: bool,
70        is_fullscreen: bool,
71    ) -> Self {
72        Self {
73            viewport_size,
74            is_minimized,
75            is_maximized,
76            is_fullscreen,
77        }
78    }
79}