diff --git a/wgui/src/drawing.rs b/wgui/src/drawing.rs index 0f32a46..4f4b4c4 100644 --- a/wgui/src/drawing.rs +++ b/wgui/src/drawing.rs @@ -125,6 +125,25 @@ impl Color { pub fn debug_ansi_block(&self) -> String { format!("{}███{}", self.debug_ansi_format(), ANSI_RESET_CODE) } + + #[must_use] + pub fn with_alpha(&self, n: f32) -> Self { + Self { + r: self.r, + g: self.g, + b: self.b, + a: n, + } + } + + #[must_use] + pub fn to_hex(&self) -> String { + let r = (self.r.clamp(0.0, 1.0) * 255.0).round() as u8; + let g = (self.g.clamp(0.0, 1.0) * 255.0).round() as u8; + let b = (self.b.clamp(0.0, 1.0) * 255.0).round() as u8; + let a = (self.a.clamp(0.0, 1.0) * 255.0).round() as u8; + format!("#{r:02X}{g:02X}{b:02X}{a:02X}") + } } impl Default for Color { diff --git a/wgui/src/globals.rs b/wgui/src/globals.rs index 5245e41..24b9524 100644 --- a/wgui/src/globals.rs +++ b/wgui/src/globals.rs @@ -21,6 +21,8 @@ pub struct Defaults { pub button_color: drawing::Color, pub accent_color: drawing::Color, pub danger_color: drawing::Color, + pub faded_color: drawing::Color, + pub translucent_alpha: f32, } impl Default for Defaults { @@ -31,6 +33,8 @@ impl Default for Defaults { button_color: drawing::Color::new(1.0, 1.0, 1.0, 0.05), accent_color: drawing::Color::new(0.0, 0.54, 1.0, 1.0), danger_color: drawing::Color::new(0.8, 0.0, 0.0, 1.0), + faded_color: drawing::Color::new(0.4, 0.5, 0.6, 1.0), + translucent_alpha: 0.25, } } } diff --git a/wgui/src/parser/mod.rs b/wgui/src/parser/mod.rs index 1d642ef..cd137ee 100644 --- a/wgui/src/parser/mod.rs +++ b/wgui/src/parser/mod.rs @@ -377,6 +377,30 @@ impl ParserContext<'_> { log::warn!("duplicate widget ID \"{id}\" in the same layout file!"); } } + + fn populate_theme_variables(&mut self) { + let def = self.doc_params.globals.defaults(); + + macro_rules! insert_color_vars { + ($self:expr, $name:literal, $field:expr, $alpha:expr) => { + $self.insert_var(concat!("color_", $name), &$field.to_hex()); + $self.insert_var( + concat!("color_", $name, "_translucent"), + &$field.with_alpha($alpha).to_hex(), + ); + $self.insert_var(concat!("color_", $name, "_50"), &$field.mult_rgb(0.50).to_hex()); + $self.insert_var(concat!("color_", $name, "_20"), &$field.mult_rgb(0.20).to_hex()); + $self.insert_var(concat!("color_", $name, "_10"), &$field.mult_rgb(0.10).to_hex()); + $self.insert_var(concat!("color_", $name, "_5"), &$field.mult_rgb(0.05).to_hex()); + $self.insert_var(concat!("color_", $name, "_1"), &$field.mult_rgb(0.01).to_hex()); + }; + } + + insert_color_vars!(self, "text", def.text_color, def.translucent_alpha); + insert_color_vars!(self, "accent", def.accent_color, def.translucent_alpha); + insert_color_vars!(self, "danger", def.danger_color, def.translucent_alpha); + insert_color_vars!(self, "faded", def.faded_color, def.translucent_alpha); + } } // Parses a color from a HTML hex string @@ -1030,6 +1054,8 @@ pub fn parse_from_assets( ) -> anyhow::Result { let parser_data = ParserData::default(); let mut ctx = create_default_context(doc_params, layout, &parser_data); + ctx.populate_theme_variables(); + let (file, node_layout) = get_doc_from_asset_path(&ctx, doc_params.path)?; parse_document_root(&file, &mut ctx, parent_id, node_layout)?; diff --git a/wgui/src/parser/style.rs b/wgui/src/parser/style.rs index 5c0eb91..8e2b1a6 100644 --- a/wgui/src/parser/style.rs +++ b/wgui/src/parser/style.rs @@ -6,8 +6,8 @@ use taffy::{ use crate::{ drawing, parser::{ - is_percent, parse_color_hex, parse_f32, parse_percent, parse_size_unit, parse_val, print_invalid_attrib, - print_invalid_value, AttribPair, + AttribPair, is_percent, parse_color_hex, parse_f32, parse_percent, parse_size_unit, parse_val, + print_invalid_attrib, print_invalid_value, }, renderer_vk::text::{FontWeight, HorizontalAlign, TextStyle}, widget::util::WLength, diff --git a/wlx-common/src/config.rs b/wlx-common/src/config.rs index 8cee4af..e4c4f97 100644 --- a/wlx-common/src/config.rs +++ b/wlx-common/src/config.rs @@ -129,6 +129,10 @@ pub struct GeneralConfig { #[serde(default = "def_theme_path")] pub theme_path: Arc, + pub color_accent: Option, + pub color_danger: Option, + pub color_faded: Option, + #[serde(default = "def_click_freeze_time_ms")] pub click_freeze_time_ms: u32, diff --git a/wlx-overlay-s/src/assets/gui/edit.xml b/wlx-overlay-s/src/assets/gui/edit.xml index 8f97b13..8996b98 100644 --- a/wlx-overlay-s/src/assets/gui/edit.xml +++ b/wlx-overlay-s/src/assets/gui/edit.xml @@ -1,6 +1,4 @@ - - - - - \ No newline at end of file + diff --git a/wlx-overlay-s/src/assets/gui/theme.xml b/wlx-overlay-s/src/assets/gui/theme.xml deleted file mode 100644 index 3d60eb7..0000000 --- a/wlx-overlay-s/src/assets/gui/theme.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wlx-overlay-s/src/assets/gui/toast.xml b/wlx-overlay-s/src/assets/gui/toast.xml index 56976fe..deb0ae9 100644 --- a/wlx-overlay-s/src/assets/gui/toast.xml +++ b/wlx-overlay-s/src/assets/gui/toast.xml @@ -1,6 +1,4 @@ - -
diff --git a/wlx-overlay-s/src/assets/gui/watch.xml b/wlx-overlay-s/src/assets/gui/watch.xml index 6b76d40..12da31f 100644 --- a/wlx-overlay-s/src/assets/gui/watch.xml +++ b/wlx-overlay-s/src/assets/gui/watch.xml @@ -1,9 +1,5 @@ - - - - diff --git a/wlx-overlay-s/src/state.rs b/wlx-overlay-s/src/state.rs index 07e0329..4b90d64 100644 --- a/wlx-overlay-s/src/state.rs +++ b/wlx-overlay-s/src/state.rs @@ -1,9 +1,10 @@ use glam::Affine3A; use idmap::IdMap; use smallvec::{SmallVec, smallvec}; -use std::sync::Arc; +use smithay::backend::renderer::Texture; +use std::{ops::Not, sync::Arc}; use wgui::{ - font_config::WguiFontConfig, gfx::WGfx, globals::WguiGlobals, + font_config::WguiFontConfig, gfx::WGfx, globals::WguiGlobals, parser::parse_color_hex, renderer_vk::context::SharedContext as WSharedContext, }; use wlx_common::{ @@ -87,6 +88,28 @@ impl AppState { let wgui_shared = WSharedContext::new(gfx.clone())?; let theme = session.config.theme_path.clone(); + let mut defaults = wgui::globals::Defaults::default(); + defaults.accent_color = session + .config + .color_accent + .as_ref() + .and_then(|c| parse_color_hex(&c)) + .unwrap_or(defaults.accent_color); + + defaults.danger_color = session + .config + .color_danger + .as_ref() + .and_then(|c| parse_color_hex(&c)) + .unwrap_or(defaults.danger_color); + + defaults.faded_color = session + .config + .color_faded + .as_ref() + .and_then(|c| parse_color_hex(&c)) + .unwrap_or(defaults.faded_color); + Ok(Self { session, tasks, @@ -102,7 +125,7 @@ impl AppState { toast_sound: toast_sound_wav, wgui_globals: WguiGlobals::new( Box::new(gui::asset::GuiAsset {}), - wgui::globals::Defaults::default(), + defaults, &WguiFontConfig::default(), get_config_file_path(&theme), )?,