diff --git a/dash-frontend/assets/gui/tab/settings.xml b/dash-frontend/assets/gui/tab/settings.xml index 7bc36f86..592c2b09 100644 --- a/dash-frontend/assets/gui/tab/settings.xml +++ b/dash-frontend/assets/gui/tab/settings.xml @@ -10,20 +10,20 @@ - + - - + + - + diff --git a/dash-frontend/assets/lang/de.json b/dash-frontend/assets/lang/de.json index 9a8f7396..cf4bc721 100644 --- a/dash-frontend/assets/lang/de.json +++ b/dash-frontend/assets/lang/de.json @@ -10,7 +10,6 @@ "APPLICATION_LAUNCHER": "Anwendung Launcher", "APP_SETTINGS": { "HIDE_USERNAME": "Benutzernamen ausblenden", - "12_HOUR_CLOCK": "12-Stunden-Uhr", "OPAQUE_BACKGROUND": "Undurchsichtiger Hintergrund", "RUN_IN_XWAYLAND_MODE_BY_DEFAULT": "Standardmäßig in XWayland-Modus ausführen", "WLX_OVERLAY_S_SETTINGS": "WlxOverlay-S Einstellungen", diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json index 774669ec..f73ae442 100644 --- a/dash-frontend/assets/lang/en.json +++ b/dash-frontend/assets/lang/en.json @@ -11,7 +11,6 @@ "APP_SETTINGS": { "RESTART_SOFTWARE": "Restart software", "HIDE_USERNAME": "Hide username", - "12_HOUR_CLOCK": "12-hour clock", "OPAQUE_BACKGROUND": "Opaque background", "RUN_IN_XWAYLAND_MODE_BY_DEFAULT": "Run in XWayland mode by default", "WLX_OVERLAY_S_SETTINGS": "WlxOverlay-S settings", diff --git a/dash-frontend/assets/lang/es.json b/dash-frontend/assets/lang/es.json index 1c9536c9..688b07bd 100644 --- a/dash-frontend/assets/lang/es.json +++ b/dash-frontend/assets/lang/es.json @@ -10,7 +10,6 @@ "APPLICATION_LAUNCHER": "Lanzador de aplicaciones", "APP_SETTINGS": { "HIDE_USERNAME": "Ocultar nombre de usuario", - "12_HOUR_CLOCK": "Reloj de 12 horas", "OPAQUE_BACKGROUND": "Fondo opaco", "RUN_IN_XWAYLAND_MODE_BY_DEFAULT": "Ejecutar en modo XWayland por defecto", "WLX_OVERLAY_S_SETTINGS": "Configuración de WlxOverlay-S", diff --git a/dash-frontend/assets/lang/ja.json b/dash-frontend/assets/lang/ja.json index d49bdc07..2ee22e86 100644 --- a/dash-frontend/assets/lang/ja.json +++ b/dash-frontend/assets/lang/ja.json @@ -10,7 +10,6 @@ "APPLICATION_LAUNCHER": "アプリケーションランチャー", "APP_SETTINGS": { "HIDE_USERNAME": "ユーザー名を表示しない", - "12_HOUR_CLOCK": "12時間表示", "OPAQUE_BACKGROUND": "不透明な背景", "RUN_IN_XWAYLAND_MODE_BY_DEFAULT": "XWaylandモードでデフォルトで実行する", "WLX_OVERLAY_S_SETTINGS": "WlxOverlay-Sの設定", diff --git a/dash-frontend/assets/lang/pl.json b/dash-frontend/assets/lang/pl.json index 0bec637a..be1c2532 100644 --- a/dash-frontend/assets/lang/pl.json +++ b/dash-frontend/assets/lang/pl.json @@ -1,31 +1,30 @@ { - "HOME_SCREEN": "Ekran główny", - "MONADO_RUNTIME": "„Monado” środowisko uruchomieniowe", - "APPLICATIONS": "Aplikacje", - "GAMES": "Gry", - "SETTINGS": "Ustawienia", - "PROCESSES": "Procesy", - "HELLO_USER": "Witaj, {USER}!", - "GENERAL_SETTINGS": "Ustawienia ogólne", - "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji", - "APP_SETTINGS": { - "HIDE_USERNAME": "Ukryj nazwę użytkownika", - "12_HOUR_CLOCK": "12-godzinny zegar", - "OPAQUE_BACKGROUND": "Nieprzezroczysty tło", - "RUN_IN_XWAYLAND_MODE_BY_DEFAULT": "Uruchom domyślnie w trybie XWayland", - "WLX_OVERLAY_S_SETTINGS": "Ustawienia wlx-overlay-s", - "HEADSET_SETTINGS": "Ustawienia głośności", - "BRIGHTNESS": "Jasność", - "WLX": { - "NOTIFICATIONS_ENABLED": "Powiadomienia", - "NOTIFICATIONS_SOUND_ENABLED": "Dźwięk powiadomień", - "KEYBOARD_SOUND_ENABLED": "Dźwięki klawiatury", - "BLOCK_GAME_INPUT": "Zablokuj sterowanie grą podczas używania Wlx", - "SPACE_DRAG_MULTIPLIER": "Mnożnik space-drag", - "SPACE_DRAG_ROTATION_ENABLED": "Włącz rotację w space-drag", - "SHOW_SKYBOX": "Pokaż skybox", - "ENABLE_PASSTHROUGH": "Włącz passthrough" - }, - "RESTART_SOFTWARE": "Uruchom ponownie oprogramowanie" - } -} + "HOME_SCREEN": "Ekran główny", + "MONADO_RUNTIME": "„Monado” środowisko uruchomieniowe", + "APPLICATIONS": "Aplikacje", + "GAMES": "Gry", + "SETTINGS": "Ustawienia", + "PROCESSES": "Procesy", + "HELLO_USER": "Witaj, {USER}!", + "GENERAL_SETTINGS": "Ustawienia ogólne", + "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji", + "APP_SETTINGS": { + "HIDE_USERNAME": "Ukryj nazwę użytkownika", + "OPAQUE_BACKGROUND": "Nieprzezroczysty tło", + "RUN_IN_XWAYLAND_MODE_BY_DEFAULT": "Uruchom domyślnie w trybie XWayland", + "WLX_OVERLAY_S_SETTINGS": "Ustawienia wlx-overlay-s", + "HEADSET_SETTINGS": "Ustawienia głośności", + "BRIGHTNESS": "Jasność", + "WLX": { + "NOTIFICATIONS_ENABLED": "Powiadomienia", + "NOTIFICATIONS_SOUND_ENABLED": "Dźwięk powiadomień", + "KEYBOARD_SOUND_ENABLED": "Dźwięki klawiatury", + "BLOCK_GAME_INPUT": "Zablokuj sterowanie grą podczas używania Wlx", + "SPACE_DRAG_MULTIPLIER": "Mnożnik space-drag", + "SPACE_DRAG_ROTATION_ENABLED": "Włącz rotację w space-drag", + "SHOW_SKYBOX": "Pokaż skybox", + "ENABLE_PASSTHROUGH": "Włącz passthrough" + }, + "RESTART_SOFTWARE": "Uruchom ponownie oprogramowanie" + } +} \ No newline at end of file diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs index a2fd8db6..3a6dd5ad 100644 --- a/dash-frontend/src/frontend.rs +++ b/dash-frontend/src/frontend.rs @@ -25,7 +25,7 @@ pub struct Frontend { pub layout: RcLayout, globals: WguiGlobals, - settings: settings::Settings, + pub settings: settings::Settings, #[allow(dead_code)] state: ParserState, @@ -99,19 +99,15 @@ impl Frontend { fn tick(&mut self, width: f32, height: f32, timestep_alpha: f32) -> anyhow::Result<()> { let mut layout = self.layout.borrow_mut(); - let mut alterables = EventAlterables::default(); - let mut common = CallbackDataCommon { - alterables: &mut alterables, - state: &layout.state, - }; + let mut c = layout.start_common(); // fixme: timer events instead of this thing if self.ticks.is_multiple_of(1000) { - self.update_time(&mut common); + self.update_time(&mut c.common()); } + c.finish()?; layout.update(Vec2::new(width, height), timestep_alpha)?; - layout.process_alterables(alterables)?; Ok(()) } @@ -154,6 +150,7 @@ impl Frontend { layout: &mut layout, parent_id: widget_content.id, frontend: rc_this, + settings: &mut self.settings, }; let tab: Box = match tab_type { diff --git a/dash-frontend/src/settings.rs b/dash-frontend/src/settings.rs index 67376a9d..ef8425d7 100644 --- a/dash-frontend/src/settings.rs +++ b/dash-frontend/src/settings.rs @@ -11,16 +11,9 @@ pub struct General { pub opaque_background: bool, } -#[derive(Default, Serialize, Deserialize)] -pub enum ApplicationRunMode { - #[default] - Native, /* use Smithay compositor */ - XWaylandCage, -} - #[derive(Default, Serialize, Deserialize)] pub struct Tweaks { - pub default_run_mode: ApplicationRunMode, + pub xwayland_by_default: bool, } #[derive(Default, Serialize, Deserialize)] diff --git a/dash-frontend/src/tab/mod.rs b/dash-frontend/src/tab/mod.rs index 760973e5..d13c34f5 100644 --- a/dash-frontend/src/tab/mod.rs +++ b/dash-frontend/src/tab/mod.rs @@ -2,6 +2,7 @@ use std::rc::Rc; use wgui::{ components::button::ComponentButton, + event::CallbackDataCommon, globals::WguiGlobals, layout::{Layout, WidgetID}, }; @@ -30,6 +31,7 @@ pub struct TabParams<'a> { pub layout: &'a mut Layout, pub parent_id: WidgetID, pub frontend: &'a RcFrontend, + pub settings: &'a mut crate::settings::Settings, } pub trait Tab { diff --git a/dash-frontend/src/tab/settings.rs b/dash-frontend/src/tab/settings.rs index 57e29f37..c5d0dd79 100644 --- a/dash-frontend/src/tab/settings.rs +++ b/dash-frontend/src/tab/settings.rs @@ -1,9 +1,17 @@ +use std::rc::Rc; + use wgui::{ assets::AssetPath, - parser::{ParseDocumentParams, ParserState}, + components::checkbox::ComponentCheckbox, + event::CallbackDataCommon, + parser::{Fetchable, ParseDocumentParams, ParserState}, }; -use crate::tab::{Tab, TabParams, TabType}; +use crate::{ + frontend::{Frontend, RcFrontend}, + settings, + tab::{Tab, TabParams, TabType}, +}; pub struct TabSettings { #[allow(dead_code)] @@ -16,8 +24,27 @@ impl Tab for TabSettings { } } +fn init_setting_checkbox( + params: &mut TabParams, + checkbox: Rc, + fetch_callback: fn(&mut settings::Settings) -> &mut bool, +) -> anyhow::Result<()> { + let mut c = params.layout.start_common(); + + checkbox.set_checked(&mut c.common(), *fetch_callback(params.settings)); + let rc_frontend = params.frontend.clone(); + checkbox.on_toggle(Box::new(move |_common, e| { + let mut frontend = rc_frontend.borrow_mut(); + *fetch_callback(&mut frontend.settings) = e.checked; + Ok(()) + })); + + c.finish()?; + Ok(()) +} + impl TabSettings { - pub fn new(params: TabParams) -> anyhow::Result { + pub fn new(mut params: TabParams) -> anyhow::Result { let state = wgui::parser::parse_from_assets( &ParseDocumentParams { globals: params.globals.clone(), @@ -28,6 +55,34 @@ impl TabSettings { params.parent_id, )?; + init_setting_checkbox( + &mut params, + state.data.fetch_component_as::("cb_hide_username")?, + |settings| &mut settings.home_screen.hide_username, + )?; + + init_setting_checkbox( + &mut params, + state.data.fetch_component_as::("cb_am_pm_clock")?, + |settings| &mut settings.general.am_pm_clock, + )?; + + init_setting_checkbox( + &mut params, + state + .data + .fetch_component_as::("cb_opaque_background")?, + |settings| &mut settings.general.opaque_background, + )?; + + init_setting_checkbox( + &mut params, + state + .data + .fetch_component_as::("cb_xwayland_by_default")?, + |settings| &mut settings.tweaks.xwayland_by_default, + )?; + Ok(Self { state }) } } diff --git a/wgui/src/components/checkbox.rs b/wgui/src/components/checkbox.rs index f9e17c73..63f72870 100644 --- a/wgui/src/components/checkbox.rs +++ b/wgui/src/components/checkbox.rs @@ -84,18 +84,18 @@ fn set_box_checked(widgets: &layout::WidgetMap, data: &Data, checked: bool) { } impl ComponentCheckbox { - pub fn set_text(&self, state: &LayoutState, common: &mut CallbackDataCommon, text: Translation) { - let Some(mut label) = state.widgets.get_as::(self.data.id_label) else { + pub fn set_text(&self, common: &mut CallbackDataCommon, text: Translation) { + let Some(mut label) = common.state.widgets.get_as::(self.data.id_label) else { return; }; label.set_text(common, text); } - pub fn set_checked(&self, state: &LayoutState, alterables: &mut EventAlterables, checked: bool) { + pub fn set_checked(&self, common: &mut CallbackDataCommon, checked: bool) { self.state.borrow_mut().checked = checked; - set_box_checked(&state.widgets, &self.data, checked); - alterables.mark_redraw(); + set_box_checked(&common.state.widgets, &self.data, checked); + common.alterables.mark_redraw(); } pub fn on_toggle(&self, func: CheckboxToggleCallback) { diff --git a/wgui/src/event.rs b/wgui/src/event.rs index 640ac118..beaef43a 100644 --- a/wgui/src/event.rs +++ b/wgui/src/event.rs @@ -6,7 +6,7 @@ use std::{ }; use glam::Vec2; -use slotmap::{new_key_type, DenseSlotMap}; +use slotmap::{DenseSlotMap, new_key_type}; use crate::{ animation::{self, Animation}, diff --git a/wgui/src/layout.rs b/wgui/src/layout.rs index 15e4c180..5b647a40 100644 --- a/wgui/src/layout.rs +++ b/wgui/src/layout.rs @@ -8,14 +8,14 @@ use std::{ use crate::{ animation::Animations, components::{Component, InitData}, - drawing::{self, push_scissor_stack, push_transform_stack, Boundary, ANSI_BOLD_CODE, ANSI_RESET_CODE}, + drawing::{self, ANSI_BOLD_CODE, ANSI_RESET_CODE, Boundary, push_scissor_stack, push_transform_stack}, event::{self, CallbackDataCommon, EventAlterables}, globals::WguiGlobals, - widget::{self, div::WidgetDiv, EventParams, EventResult, WidgetObj, WidgetState}, + widget::{self, EventParams, EventResult, WidgetObj, WidgetState, div::WidgetDiv}, }; -use glam::{vec2, Vec2}; -use slotmap::{new_key_type, HopSlotMap, SecondaryMap}; +use glam::{Vec2, vec2}; +use slotmap::{HopSlotMap, SecondaryMap, new_key_type}; use taffy::{NodeId, TaffyTree, TraversePartialTree}; new_key_type! { @@ -196,7 +196,34 @@ fn add_child_internal( )) } +pub struct LayoutCommon<'a> { + alterables: EventAlterables, + layout: &'a mut Layout, +} + +impl LayoutCommon<'_> { + pub const fn common(&mut self) -> CallbackDataCommon<'_> { + CallbackDataCommon { + alterables: &mut self.alterables, + state: &self.layout.state, + } + } + + pub fn finish(self) -> anyhow::Result<()> { + self.layout.process_alterables(self.alterables)?; + Ok(()) + } +} + impl Layout { + // helper function + pub fn start_common(&mut self) -> LayoutCommon<'_> { + LayoutCommon { + alterables: EventAlterables::default(), + layout: self, + } + } + pub fn as_rc(self) -> RcLayout { Rc::new(RefCell::new(self)) } @@ -580,9 +607,7 @@ impl Layout { pub fn update(&mut self, size: Vec2, timestep_alpha: f32) -> anyhow::Result<()> { let mut alterables = EventAlterables::default(); - self.animations.process(&self.state, &mut alterables, timestep_alpha); - self.process_alterables(alterables)?; self.try_recompute_layout(size)?; Ok(())