From 28d58fef594559ae120a1d9769a4ae48dbfd5c59 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sat, 28 Jun 2025 18:30:38 +0200 Subject: [PATCH] implement listeners for Button component back --- uidev/src/main.rs | 2 +- uidev/src/testbed/testbed_any.rs | 9 ++-- uidev/src/testbed/testbed_generic.rs | 2 +- wgui/src/components/button.rs | 61 ++++++++++++++++++++-------- wgui/src/parser/component_button.rs | 1 + wgui/src/parser/mod.rs | 16 ++++++-- 6 files changed, 65 insertions(+), 26 deletions(-) diff --git a/uidev/src/main.rs b/uidev/src/main.rs index c1c39f66..c314c58a 100644 --- a/uidev/src/main.rs +++ b/uidev/src/main.rs @@ -62,7 +62,7 @@ fn load_testbed( let name = std::env::var("TESTBED").unwrap_or_default(); Ok(match name.as_str() { "" => Box::new(TestbedGeneric::new(listeners)?), - _ => Box::new(TestbedAny::new(&name)?), + _ => Box::new(TestbedAny::new(&name, listeners)?), }) } diff --git a/uidev/src/testbed/testbed_any.rs b/uidev/src/testbed/testbed_any.rs index 12d3ad2c..44b9b1bc 100644 --- a/uidev/src/testbed/testbed_any.rs +++ b/uidev/src/testbed/testbed_any.rs @@ -1,16 +1,19 @@ use crate::{assets, testbed::Testbed}; use glam::Vec2; -use wgui::layout::Layout; +use wgui::{event::EventListenerCollection, layout::Layout}; pub struct TestbedAny { pub layout: Layout, } impl TestbedAny { - pub fn new(name: &str) -> anyhow::Result { + pub fn new( + name: &str, + listeners: &mut EventListenerCollection<(), ()>, + ) -> anyhow::Result { let path = format!("gui/{name}.xml"); let (layout, _state) = - wgui::parser::new_layout_from_assets(Box::new(assets::Asset {}), &path)?; + wgui::parser::new_layout_from_assets(Box::new(assets::Asset {}), listeners, &path)?; Ok(Self { layout }) } } diff --git a/uidev/src/testbed/testbed_generic.rs b/uidev/src/testbed/testbed_generic.rs index ac43c1a8..24935f1e 100644 --- a/uidev/src/testbed/testbed_generic.rs +++ b/uidev/src/testbed/testbed_generic.rs @@ -11,7 +11,7 @@ impl TestbedGeneric { const XML_PATH: &str = "gui/testbed.xml"; let (layout, _res) = - wgui::parser::new_layout_from_assets(Box::new(assets::Asset {}), XML_PATH)?; + wgui::parser::new_layout_from_assets(Box::new(assets::Asset {}), listeners, XML_PATH)?; Ok(Self { layout }) } diff --git a/wgui/src/components/button.rs b/wgui/src/components/button.rs index ebba0e60..214022ec 100644 --- a/wgui/src/components/button.rs +++ b/wgui/src/components/button.rs @@ -2,10 +2,10 @@ use std::sync::Arc; use taffy::{AlignItems, JustifyContent, prelude::length}; use crate::{ - animation::{Animation, AnimationEasing}, + animation::{self, Animation, AnimationEasing}, components::Component, drawing::{self, Color}, - event::WidgetCallback, + event::{EventListenerCollection, EventListenerKind, WidgetCallback}, layout::{Layout, WidgetID}, renderer_vk::text::{FontWeight, TextStyle}, widget::{ @@ -38,7 +38,8 @@ impl Default for Params<'_> { } pub struct Button { - pub color: drawing::Color, + initial_color: drawing::Color, + initial_border_color: drawing::Color, pub body: WidgetID, // Rectangle pub text_id: WidgetID, // Text text_node: taffy::NodeId, @@ -59,6 +60,18 @@ impl Button { } } +fn anim_hover(rect: &mut Rectangle, button: &Button, pos: f32) { + let brightness = pos * 0.5; + let border_brightness = pos; + rect.params.color.r = button.initial_color.r + brightness; + rect.params.color.g = button.initial_color.g + brightness; + rect.params.color.b = button.initial_color.b + brightness; + rect.params.border_color.r = button.initial_border_color.r + border_brightness; + rect.params.border_color.g = button.initial_border_color.g + border_brightness; + rect.params.border_color.b = button.initial_border_color.b + border_brightness; + rect.params.border = 3.0; +} + fn anim_hover_in(button: Arc