diff --git a/wayvr/src/assets/gui/watch.xml b/wayvr/src/assets/gui/watch.xml
index 584c481c..772ed8b8 100644
--- a/wayvr/src/assets/gui/watch.xml
+++ b/wayvr/src/assets/gui/watch.xml
@@ -36,36 +36,36 @@
diff --git a/wgui/src/color.rs b/wgui/src/color.rs
index b2c229b8..85c42574 100644
--- a/wgui/src/color.rs
+++ b/wgui/src/color.rs
@@ -34,6 +34,15 @@ pub struct WguiNamedColor {
alpha: f32,
}
+#[derive(Default, Clone, Copy, Debug, EnumString)]
+#[strum(ascii_case_insensitive, serialize_all = "snake_case")]
+pub enum ParentColor {
+ #[default]
+ Foreground,
+ Background,
+ Ignore,
+}
+
#[derive(Clone, Copy, Debug)]
pub enum WguiColor {
Raw(drawing::Color),
diff --git a/wgui/src/components/button.rs b/wgui/src/components/button.rs
index ec104caa..486734cc 100644
--- a/wgui/src/components/button.rs
+++ b/wgui/src/components/button.rs
@@ -1,7 +1,7 @@
use crate::{
animation::{Animation, AnimationEasing},
assets::AssetPath,
- color::{WguiColor, WguiColorName},
+ color::{ParentColor, WguiColor, WguiColorName},
components::{
self, Component, ComponentBase, ComponentTrait, RefreshData,
tooltip::{ComponentTooltip, TooltipTrait},
@@ -149,29 +149,24 @@ impl ComponentTrait for ComponentButton {
log::error!("Button with more than one sprite!");
}
// apply initial color from button
- if let Some(fg_color) = state.colors.color.fg_color() {
+ if let Some(apply_color) = color_to_apply(widget.parent_color(), state.colors.color) {
let common = &mut CallbackDataCommon {
state: &data.layout.state,
alterables: &mut data.layout.alterables,
};
- widget.set_color(common, fg_color);
+ widget.set_color(common, apply_color);
}
state.id_sprite = child;
} else if let Some(mut widget) = data.layout.state.widgets.get_as::
(child) {
if !state.id_label.is_null() && state.id_label != child {
log::error!("Button with more than one label!");
}
- if let Some(fg_color) = state.colors.color.fg_color() {
+ if let Some(apply_color) = color_to_apply(widget.parent_color(), state.colors.color) {
let common = &mut CallbackDataCommon {
state: &data.layout.state,
alterables: &mut data.layout.alterables,
};
- let label_color = if widget.uses_bg_color() {
- state.colors.color
- } else {
- fg_color
- };
- widget.set_color(common, label_color, true);
+ widget.set_color(common, apply_color, true);
}
state.id_label = child;
}
@@ -221,14 +216,15 @@ impl ComponentButton {
let mut state = self.state.borrow_mut();
state.colors.color = color;
- if let Some(fg_color) = color.fg_color() {
- if let Some(mut label) = common.state.widgets.get_as::(state.id_label) {
- let label_color = if label.uses_bg_color() { color } else { fg_color };
- label.set_color(common, label_color, true);
- }
- if let Some(mut sprite) = common.state.widgets.get_as::(state.id_sprite) {
- sprite.set_color(common, fg_color);
- }
+ if let Some(mut label) = common.state.widgets.get_as::(state.id_label)
+ && let Some(apply_color) = color_to_apply(label.parent_color(), color)
+ {
+ label.set_color(common, apply_color, true);
+ }
+ if let Some(mut sprite) = common.state.widgets.get_as::(state.id_sprite)
+ && let Some(apply_color) = color_to_apply(sprite.parent_color(), color)
+ {
+ sprite.set_color(common, apply_color);
}
}
@@ -297,12 +293,16 @@ impl ComponentButton {
&& let Some(fg_color1) = alt_color.fg_color()
{
let fg_color = fg_color0.lerp(&common.globals().palette, &fg_color1, mult);
- if let Some(mut label) = common.state.widgets.get_as::(state.id_label) {
- let label_color = if label.uses_bg_color() { bg_color } else { fg_color };
- label.set_color(common, label_color, true);
+ if let Some(mut label) = common.state.widgets.get_as::(state.id_label)
+ && let Some(apply) = color_to_apply2(label.parent_color(), bg_color, fg_color)
+ {
+ label.set_color(common, apply, true);
}
- if let Some(mut sprite) = common.state.widgets.get_as::(state.id_sprite) {
- sprite.set_color(common, fg_color);
+
+ if let Some(mut sprite) = common.state.widgets.get_as::(state.id_sprite)
+ && let Some(apply) = color_to_apply2(sprite.parent_color(), bg_color, fg_color)
+ {
+ sprite.set_color(common, apply);
}
}
}
@@ -334,19 +334,22 @@ fn anim_hover(
} else {
(colors.border_color, colors.color)
};
-
let bg_color = init_color.lerp(&common.globals().palette, &colors.hover_color, mult);
if let Some(fg_color0) = init_color.fg_color()
&& let Some(fg_color1) = colors.hover_color.fg_color()
{
let fg_color = fg_color0.lerp(&common.globals().palette, &fg_color1, mult);
- if let Some(mut label) = common.state.widgets.get_as::(label) {
- let label_color = if label.uses_bg_color() { bg_color } else { fg_color };
- label.set_color(common, label_color, true);
+ if let Some(mut label) = common.state.widgets.get_as::(label)
+ && let Some(apply) = color_to_apply2(label.parent_color(), bg_color, fg_color)
+ {
+ label.set_color(common, apply, true);
}
- if let Some(mut sprite) = common.state.widgets.get_as::(sprite) {
- sprite.set_color(common, fg_color);
+
+ if let Some(mut sprite) = common.state.widgets.get_as::(sprite)
+ && let Some(apply) = color_to_apply2(sprite.parent_color(), bg_color, fg_color)
+ {
+ sprite.set_color(common, apply);
}
}
@@ -606,6 +609,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
let sprite = WidgetSprite::create(WidgetSpriteParams {
glyph_data: Some(CustomGlyphData::from_assets(&ess.layout.state.globals, sprite_path)?),
color: Some(params.sprite_color.unwrap_or(WguiColorName::OnBackground.into())),
+ ..Default::default()
});
let (sprite_pair, _) = ess.layout.add_child(
@@ -698,3 +702,19 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
ess.layout.register_component_refresh(&Component(button.clone()));
Ok((root, button))
}
+
+fn color_to_apply(parent_color: ParentColor, bg_color: WguiColor) -> Option {
+ match parent_color {
+ ParentColor::Foreground => bg_color.fg_color(),
+ ParentColor::Background => Some(bg_color),
+ ParentColor::Ignore => None,
+ }
+}
+
+fn color_to_apply2(parent_color: ParentColor, bg_color: WguiColor, fg_color: WguiColor) -> Option {
+ match parent_color {
+ ParentColor::Foreground => Some(fg_color),
+ ParentColor::Background => Some(bg_color),
+ ParentColor::Ignore => None,
+ }
+}
diff --git a/wgui/src/parser/widget_label.rs b/wgui/src/parser/widget_label.rs
index 0fed8c82..1d7c3b31 100644
--- a/wgui/src/parser/widget_label.rs
+++ b/wgui/src/parser/widget_label.rs
@@ -1,4 +1,5 @@
use crate::{
+ color::ParentColor,
i18n::Translation,
layout::WidgetID,
parser::{
@@ -39,8 +40,8 @@ pub fn parse_widget_label<'a>(
"translation" if !value.is_empty() => {
params.content = Translation::from_translation_key(value);
}
- "use_bg_color" if !value.is_empty() => {
- params.use_bg_color = true;
+ "parent_color" => {
+ params.parent_color = ParentColor::try_from(value).unwrap_or_default();
}
_ => {}
}
diff --git a/wgui/src/parser/widget_sprite.rs b/wgui/src/parser/widget_sprite.rs
index e59767d4..0e3eed54 100644
--- a/wgui/src/parser/widget_sprite.rs
+++ b/wgui/src/parser/widget_sprite.rs
@@ -1,4 +1,5 @@
use crate::{
+ color::ParentColor,
layout::WidgetID,
parser::{
AttribPair, ParserContext, ParserFile, get_asset_path_from_kv, parse_children, parse_widget_universal,
@@ -39,6 +40,9 @@ pub fn parse_widget_sprite<'a>(
"color" => {
parse_color_opt(ctx, tag_name, key, value, &mut params.color);
}
+ "parent_color" => {
+ params.parent_color = ParentColor::try_from(value).unwrap_or_default();
+ }
_ => {}
}
}
diff --git a/wgui/src/widget/label.rs b/wgui/src/widget/label.rs
index 903efb34..e870e201 100644
--- a/wgui/src/widget/label.rs
+++ b/wgui/src/widget/label.rs
@@ -5,7 +5,7 @@ use slotmap::Key;
use taffy::AvailableSpace;
use crate::{
- color::{WguiColor, WguiColorName},
+ color::{ParentColor, WguiColor, WguiColorName},
drawing::{self, PrimitiveExtent},
event::CallbackDataCommon,
globals::Globals,
@@ -22,7 +22,7 @@ use super::{WidgetObj, WidgetState};
pub struct WidgetLabelParams {
pub content: Translation,
pub style: TextStyle,
- pub use_bg_color: bool,
+ pub parent_color: ParentColor,
}
pub struct WidgetLabel {
@@ -127,8 +127,8 @@ impl WidgetLabel {
}
}
- pub fn uses_bg_color(&self) -> bool {
- self.params.use_bg_color
+ pub fn parent_color(&self) -> ParentColor {
+ self.params.parent_color
}
}
diff --git a/wgui/src/widget/sprite.rs b/wgui/src/widget/sprite.rs
index 126f3e07..1596df54 100644
--- a/wgui/src/widget/sprite.rs
+++ b/wgui/src/widget/sprite.rs
@@ -4,7 +4,7 @@ use cosmic_text::{Attrs, Buffer, Color, Shaping, Weight};
use slotmap::Key;
use crate::{
- color::WguiColor,
+ color::{ParentColor, WguiColor},
drawing::{self, PrimitiveExtent},
event::{CallbackDataCommon, EventAlterables},
globals::Globals,
@@ -22,6 +22,7 @@ use super::{WidgetObj, WidgetState};
pub struct WidgetSpriteParams {
pub glyph_data: Option,
pub color: Option,
+ pub parent_color: ParentColor,
}
#[derive(Debug, Default)]
@@ -62,6 +63,10 @@ impl WidgetSprite {
pub fn get_content(&self) -> Option {
self.params.glyph_data.clone()
}
+
+ pub fn parent_color(&self) -> ParentColor {
+ self.params.parent_color
+ }
}
impl WidgetObj for WidgetSprite {