From 857c5ec86572d9188048f43eabb6a64fb0527023 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sun, 6 Jul 2025 20:53:40 +0200 Subject: [PATCH] listener handles, auto-clean destroyed listeners, minor refactor --- uidev/src/main.rs | 10 +- uidev/src/testbed/testbed_any.rs | 9 +- uidev/src/testbed/testbed_generic.rs | 9 +- wgui/src/components/button.rs | 77 ++++---- wgui/src/components/slider.rs | 174 +++++++++++------- wgui/src/event.rs | 101 +++++++++- wgui/src/layout.rs | 7 +- wgui/src/parser/component_button.rs | 4 +- wgui/src/parser/component_slider.rs | 4 +- wgui/src/parser/mod.rs | 41 +++-- wgui/src/widget/mod.rs | 13 +- wlx-overlay-s/src/gui/panel.rs | 46 ++--- wlx-overlay-s/src/overlays/anchor.rs | 2 +- wlx-overlay-s/src/overlays/bar.rs | 4 +- .../src/overlays/keyboard/builder.rs | 16 +- wlx-overlay-s/src/overlays/watch.rs | 13 +- 16 files changed, 348 insertions(+), 182 deletions(-) diff --git a/uidev/src/main.rs b/uidev/src/main.rs index c314c58..a325fe9 100644 --- a/uidev/src/main.rs +++ b/uidev/src/main.rs @@ -126,7 +126,7 @@ fn main() -> Result<(), Box> { MouseScrollDelta::LineDelta(x, y) => testbed .layout() .push_event( - &listeners, + &mut listeners, &wgui::event::Event::MouseWheel(MouseWheelEvent { shift: Vec2::new(x, y), pos: mouse / scale, @@ -138,7 +138,7 @@ fn main() -> Result<(), Box> { MouseScrollDelta::PixelDelta(pos) => testbed .layout() .push_event( - &listeners, + &mut listeners, &wgui::event::Event::MouseWheel(MouseWheelEvent { shift: Vec2::new(pos.x as f32 / 5.0, pos.y as f32 / 5.0), pos: mouse / scale, @@ -157,7 +157,7 @@ fn main() -> Result<(), Box> { testbed .layout() .push_event( - &listeners, + &mut listeners, &wgui::event::Event::MouseDown(MouseDownEvent { pos: mouse / scale, button: MouseButton::Left, @@ -170,7 +170,7 @@ fn main() -> Result<(), Box> { testbed .layout() .push_event( - &listeners, + &mut listeners, &wgui::event::Event::MouseUp(MouseUpEvent { pos: mouse / scale, button: MouseButton::Left, @@ -190,7 +190,7 @@ fn main() -> Result<(), Box> { testbed .layout() .push_event( - &listeners, + &mut listeners, &wgui::event::Event::MouseMotion(MouseMotionEvent { pos: mouse / scale, device: 0, diff --git a/uidev/src/testbed/testbed_any.rs b/uidev/src/testbed/testbed_any.rs index 44b9b1b..a56bca5 100644 --- a/uidev/src/testbed/testbed_any.rs +++ b/uidev/src/testbed/testbed_any.rs @@ -1,9 +1,12 @@ use crate::{assets, testbed::Testbed}; use glam::Vec2; -use wgui::{event::EventListenerCollection, layout::Layout}; +use wgui::{event::EventListenerCollection, layout::Layout, parser::ParserState}; pub struct TestbedAny { pub layout: Layout, + + #[allow(dead_code)] + state: ParserState, } impl TestbedAny { @@ -12,9 +15,9 @@ impl TestbedAny { listeners: &mut EventListenerCollection<(), ()>, ) -> anyhow::Result { let path = format!("gui/{name}.xml"); - let (layout, _state) = + let (layout, state) = wgui::parser::new_layout_from_assets(Box::new(assets::Asset {}), listeners, &path)?; - Ok(Self { layout }) + Ok(Self { layout, state }) } } diff --git a/uidev/src/testbed/testbed_generic.rs b/uidev/src/testbed/testbed_generic.rs index 24935f1..448b4fd 100644 --- a/uidev/src/testbed/testbed_generic.rs +++ b/uidev/src/testbed/testbed_generic.rs @@ -1,19 +1,22 @@ use crate::{assets, testbed::Testbed}; use glam::Vec2; -use wgui::{event::EventListenerCollection, layout::Layout}; +use wgui::{event::EventListenerCollection, layout::Layout, parser::ParserState}; pub struct TestbedGeneric { pub layout: Layout, + + #[allow(dead_code)] + state: ParserState, } impl TestbedGeneric { pub fn new(listeners: &mut EventListenerCollection<(), ()>) -> anyhow::Result { const XML_PATH: &str = "gui/testbed.xml"; - let (layout, _res) = + let (layout, state) = wgui::parser::new_layout_from_assets(Box::new(assets::Asset {}), listeners, XML_PATH)?; - Ok(Self { layout }) + Ok(Self { layout, state }) } } diff --git a/wgui/src/components/button.rs b/wgui/src/components/button.rs index 5a11df5..5b11463 100644 --- a/wgui/src/components/button.rs +++ b/wgui/src/components/button.rs @@ -5,7 +5,7 @@ use crate::{ animation::{Animation, AnimationEasing}, components::Component, drawing::{self, Color}, - event::{CallbackDataCommon, EventListenerCollection, EventListenerKind}, + event::{CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec}, layout::{Layout, WidgetID}, renderer_vk::text::{FontWeight, TextStyle}, widget::{ @@ -37,59 +37,64 @@ impl Default for Params<'_> { } } -pub struct Button { +struct Data { initial_color: drawing::Color, initial_border_color: drawing::Color, - pub body: WidgetID, // Rectangle - pub text_id: WidgetID, // Text + text_id: WidgetID, // Text text_node: taffy::NodeId, } +pub struct Button { + data: Rc, + #[allow(dead_code)] + listener_handles: ListenerHandleVec, +} + impl Component for Button {} impl Button { - pub fn set_text<'a, 'b, C>(&self, callback_data: &mut CallbackDataCommon, text: &str) { - callback_data.call_on_widget(self.text_id, |label: &mut TextLabel| { + pub fn set_text(&self, callback_data: &mut CallbackDataCommon, text: &str) { + callback_data.call_on_widget(self.data.text_id, |label: &mut TextLabel| { label.set_text(text); }); callback_data.mark_redraw(); - callback_data.mark_dirty(self.text_node); + callback_data.mark_dirty(self.data.text_node); } } -fn anim_hover(rect: &mut Rectangle, button: &Button, pos: f32) { +fn anim_hover(rect: &mut Rectangle, data: &Data, 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.color.r = data.initial_color.r + brightness; + rect.params.color.g = data.initial_color.g + brightness; + rect.params.color.b = data.initial_color.b + brightness; + rect.params.border_color.r = data.initial_border_color.r + border_brightness; + rect.params.border_color.g = data.initial_border_color.g + border_brightness; + rect.params.border_color.b = data.initial_border_color.b + border_brightness; rect.params.border = 3.0; } -fn anim_hover_in(button: Rc