use std::{collections::HashMap, sync::Arc}; use chrono::Offset; use idmap::IdMap; use serde::{Deserialize, Serialize}; use crate::{ astr_containers::{AStrMap, AStrSet}, overlays::{BackendAttribValue, ToastDisplayMethod, ToastTopic}, windowing::OverlayWindowState, }; pub type PwTokenMap = AStrMap; pub type SerializedWindowStates = HashMap, OverlayWindowState>; #[derive(Clone, Serialize, Deserialize)] pub struct SerializedWindowSet { pub name: Arc, pub overlays: SerializedWindowStates, } pub const fn def_pw_tokens() -> PwTokenMap { AStrMap::new() } const fn def_mouse_move_interval_ms() -> u32 { 10 // 100fps } const fn def_click_freeze_time_ms() -> u32 { 300 } const fn def_true() -> bool { true } const fn def_false() -> bool { false } const fn def_one() -> f32 { 1.0 } const fn def_half() -> f32 { 0.5 } const fn def_point7() -> f32 { 0.7 } const fn def_point3() -> f32 { 0.3 } const fn def_osc_port() -> u16 { 9000 } fn def_timezones() -> Vec { const EMEA: i32 = -60 * 60; // UTC-1 const APAC: i32 = 5 * 60 * 60; // UTC+5 let offset = chrono::Local::now().offset().fix(); match offset.local_minus_utc() { i32::MIN..EMEA => vec!["Europe/Paris".into(), "Asia/Tokyo".into()], EMEA..APAC => vec!["America/New_York".into(), "Asia/Tokyo".into()], APAC..=i32::MAX => vec!["Europe/Paris".into(), "America/New_York".into()], } } fn def_auto() -> Arc { "auto".into() } fn def_empty() -> Arc { "".into() } fn def_theme_path() -> Arc { "theme".into() } const fn def_max_height() -> u16 { 1440 } #[derive(Deserialize, Serialize)] pub struct GeneralConfig { #[serde(default = "def_theme_path")] pub theme_path: Arc, pub color_text: Option, pub color_accent: Option, pub color_danger: Option, pub color_faded: Option, pub color_background: Option, #[serde(default = "def_one")] pub animation_speed: f32, #[serde(default = "def_one")] pub round_multiplier: f32, pub default_keymap: Option, #[serde(default)] pub attribs: AStrMap>, #[serde(default = "def_click_freeze_time_ms")] pub click_freeze_time_ms: u32, #[serde(default = "def_false")] pub invert_scroll_direction_x: bool, #[serde(default = "def_false")] pub invert_scroll_direction_y: bool, #[serde(default = "def_one")] pub scroll_speed: f32, #[serde(default = "def_one")] pub long_press_duration: f32, #[serde(default = "def_mouse_move_interval_ms")] pub mouse_move_interval_ms: u32, #[serde(default = "def_true")] pub notifications_enabled: bool, #[serde(default = "def_true")] pub notifications_sound_enabled: bool, #[serde(default)] pub notification_topics: IdMap, #[serde(default = "def_empty")] pub notification_sound: Arc, #[serde(default = "def_true")] pub keyboard_sound_enabled: bool, #[serde(default = "def_one")] pub keyboard_scale: f32, #[serde(default = "def_one")] pub desktop_view_scale: f32, #[serde(default = "def_half")] pub watch_view_angle_min: f32, #[serde(default = "def_point7")] pub watch_view_angle_max: f32, #[serde(default = "def_osc_port")] pub osc_out_port: u16, #[serde(default = "def_false")] pub upright_screen_fix: bool, #[serde(default = "def_false")] pub double_cursor_fix: bool, #[serde(default = "def_false")] pub single_set_mode: bool, #[serde(default = "def_false")] pub hide_grab_help: bool, #[serde(default)] pub custom_panels: AStrSet, #[serde(default = "def_auto")] pub capture_method: Arc, #[serde(default = "def_point7")] pub xr_click_sensitivity: f32, #[serde(default = "def_half")] pub xr_click_sensitivity_release: f32, #[serde(default = "def_true")] pub allow_sliding: bool, #[serde(default = "def_false")] pub focus_follows_mouse_mode: bool, #[serde(default = "def_false")] pub left_handed_mouse: bool, #[serde(default = "def_false")] pub block_game_input: bool, #[serde(default = "def_true")] pub block_game_input_ignore_watch: bool, #[serde(default = "def_one")] pub space_drag_multiplier: f32, #[serde(default = "def_empty")] pub skybox_texture: Arc, #[serde(default = "def_true")] pub use_skybox: bool, #[serde(default = "def_true")] pub use_passthrough: bool, #[serde(default = "def_max_height")] pub screen_max_height: u16, #[serde(default = "def_false")] pub screen_render_down: bool, #[serde(default = "def_point3")] pub pointer_lerp_factor: f32, #[serde(default = "def_true")] pub space_drag_unlocked: bool, #[serde(default = "def_false")] pub space_rotate_unlocked: bool, #[serde(default)] pub alt_click_down: Vec, #[serde(default)] pub alt_click_up: Vec, #[serde(default = "def_timezones")] pub timezones: Vec, #[serde(default = "def_false")] pub clock_12h: bool, #[serde(default)] pub sets: Vec, #[serde(default)] pub global_set: SerializedWindowStates, #[serde(default)] pub last_set: u32, }