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(())