diff --git a/dash-frontend/assets/gui/templates.xml b/dash-frontend/assets/gui/templates.xml index 601e748..283f176 100644 --- a/dash-frontend/assets/gui/templates.xml +++ b/dash-frontend/assets/gui/templates.xml @@ -5,6 +5,8 @@ height="82" color="#00000033" border_color="#FFFFFF77" + hover_color="~accent" + hover_border_color="#FFFFFF" round="8">
+ diff --git a/wgui/doc/widgets.md b/wgui/doc/widgets.md index cae6d84..de92d88 100644 --- a/wgui/doc/widgets.md +++ b/wgui/doc/widgets.md @@ -170,6 +170,10 @@ _Translated by key_ `border_color`: #FFAABB | #FFAABBCC +`hover_color`: #FFAABB | #FFAABBCC + +`hover_border_color`: #FFAABB | #FFAABBCC + #### Info Child widgets are supported and can be added directly in XML. diff --git a/wgui/src/components/button.rs b/wgui/src/components/button.rs index 12ef640..39fb770 100644 --- a/wgui/src/components/button.rs +++ b/wgui/src/components/button.rs @@ -20,6 +20,8 @@ pub struct Params { pub text: Translation, pub color: drawing::Color, pub border_color: drawing::Color, + pub hover_border_color: drawing::Color, + pub hover_color: drawing::Color, pub round: WLength, pub style: taffy::Style, pub text_style: TextStyle, @@ -29,8 +31,10 @@ impl Default for Params { fn default() -> Self { Self { text: Translation::from_raw_text(""), - color: drawing::Color::new(1.0, 1.0, 1.0, 1.0), + color: drawing::Color::new(0.7, 0.7, 0.7, 1.0), + hover_color: drawing::Color::new(1.0, 1.0, 1.0, 1.0), border_color: drawing::Color::new(0.0, 0.0, 0.0, 1.0), + hover_border_color: drawing::Color::new(0.25, 0.25, 0.25, 1.0), round: WLength::Units(4.0), style: Default::default(), text_style: TextStyle::default(), @@ -52,8 +56,9 @@ struct State { struct Data { initial_color: drawing::Color, - initial_color2: drawing::Color, initial_border_color: drawing::Color, + initial_hover_color: drawing::Color, + initial_hover_border_color: drawing::Color, id_label: WidgetID, // Label id_rect: WidgetID, // Rectangle node_label: taffy::NodeId, @@ -97,18 +102,21 @@ fn get_color2(color: &drawing::Color) -> drawing::Color { } fn anim_hover(rect: &mut WidgetRectangle, data: &Data, pos: f32, pressed: bool) { - let brightness = pos * if pressed { 0.75 } else { 0.5 }; - let border_brightness = pos; - rect.params.color = data.initial_color.add_rgb(brightness); - rect.params.color2 = data.initial_color2.add_rgb(brightness); - rect.params.border_color = data.initial_border_color.add_rgb(border_brightness); + let mult = pos * if pressed { 1.25 } else { 1.0 }; + let bgcolor = data.initial_color.lerp(&data.initial_hover_color, mult); + + rect.params.color = bgcolor; + rect.params.color2 = get_color2(&bgcolor); + rect.params.border_color = data + .initial_border_color + .lerp(&data.initial_hover_border_color, mult); rect.params.border = 2.0; } fn anim_hover_in(data: Rc, state: Rc>, widget_id: WidgetID) -> Animation { Animation::new( widget_id, - 5, + 2, AnimationEasing::OutQuad, Box::new(move |common, anim_data| { let rect = anim_data.obj.get_as_mut::(); @@ -297,8 +305,9 @@ pub fn construct( id_rect, node_label, initial_color: params.color, - initial_color2: get_color2(¶ms.color), initial_border_color: params.border_color, + initial_hover_color: params.hover_color, + initial_hover_border_color: params.hover_border_color, }); let state = Rc::new(RefCell::new(State { diff --git a/wgui/src/parser/component_button.rs b/wgui/src/parser/component_button.rs index 0b985f9..19fc3d7 100644 --- a/wgui/src/parser/component_button.rs +++ b/wgui/src/parser/component_button.rs @@ -18,6 +18,8 @@ pub fn parse_component_button<'a, U1, U2>( ) -> anyhow::Result { let mut color = Color::new(1.0, 1.0, 1.0, 1.0); let mut border_color: Option = None; + let mut hover_color: Option = None; + let mut hover_border_color: Option = None; let mut round = WLength::Units(4.0); let mut translation = Translation::default(); @@ -42,6 +44,12 @@ pub fn parse_component_button<'a, U1, U2>( "border_color" => { parse_color_opt(&value, &mut border_color); } + "hover_color" => { + parse_color_opt(&value, &mut hover_color); + } + "hover_border_color" => { + parse_color_opt(&value, &mut hover_border_color); + } _ => {} } } @@ -55,6 +63,14 @@ pub fn parse_component_button<'a, U1, U2>( )); } + if hover_color.is_none() { + hover_color = Some(color.add_rgb(0.5)); + } + + if hover_border_color.is_none() { + hover_border_color = Some(border_color.unwrap().add_rgb(0.75)); + } + let (new_id, component) = button::construct( ctx.layout, ctx.listeners, @@ -62,6 +78,8 @@ pub fn parse_component_button<'a, U1, U2>( button::Params { color, border_color: border_color.unwrap(), + hover_border_color: hover_border_color.unwrap(), + hover_color: hover_color.unwrap(), text: translation, style, text_style,