From dfec935388f39e7c94d879f9200fcce560fb85b4 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Tue, 16 Sep 2025 20:35:28 +0200 Subject: [PATCH] wgui: component callbacks refactoring --- dash-frontend/src/tab/mod.rs | 2 +- uidev/src/testbed/testbed_generic.rs | 14 +++++++------- wgui/src/components/button.rs | 26 +++++--------------------- wgui/src/components/checkbox.rs | 21 +++------------------ wgui/src/components/mod.rs | 15 ++------------- wgui/src/components/slider.rs | 2 +- wgui/src/layout.rs | 8 +++++--- 7 files changed, 24 insertions(+), 64 deletions(-) diff --git a/dash-frontend/src/tab/mod.rs b/dash-frontend/src/tab/mod.rs index 1b08434..a5293cd 100644 --- a/dash-frontend/src/tab/mod.rs +++ b/dash-frontend/src/tab/mod.rs @@ -42,7 +42,7 @@ pub trait Tab { impl TabType { pub fn register_button(this_rc: RcFrontend, btn: &Rc, tab: TabType) { btn.on_click({ - Box::new(move |_evt| { + Box::new(move |_common, _evt| { this_rc.borrow_mut().push_task(FrontendTask::SetTab(tab)); Ok(()) }) diff --git a/uidev/src/testbed/testbed_generic.rs b/uidev/src/testbed/testbed_generic.rs index bc9211b..2343a3f 100644 --- a/uidev/src/testbed/testbed_generic.rs +++ b/uidev/src/testbed/testbed_generic.rs @@ -32,14 +32,14 @@ fn button_click_callback( label: Widget, text: &'static str, ) -> ButtonClickCallback { - Box::new(move |mut e| { + Box::new(move |common, _e| { label .get_as_mut::() .unwrap() - .set_text(&mut e.as_common(), Translation::from_raw_text(text)); + .set_text(common, Translation::from_raw_text(text)); button.try_cast::()?.set_text( - &mut e.as_common(), + common, Translation::from_raw_text("this button has been clicked"), ); @@ -92,8 +92,8 @@ impl TestbedGeneric { let button_click_me = state.fetch_component_as::("button_click_me")?; let button = button_click_me.clone(); - button_click_me.on_click(Box::new(move |mut e| { - button.set_text(&mut e.as_common(), Translation::from_raw_text("congrats!")); + button_click_me.on_click(Box::new(move |common, _e| { + button.set_text(common, Translation::from_raw_text("congrats!")); Ok(()) })); @@ -111,10 +111,10 @@ impl TestbedGeneric { let cb_first = state.fetch_component_as::("cb_first")?; let label = label_cur_option.widget.clone(); - cb_first.on_toggle(Box::new(move |mut e| { + cb_first.on_toggle(Box::new(move |common, e| { let mut widget = label.get_as_mut::().unwrap(); let text = format!("checkbox toggle: {}", e.checked); - widget.set_text(&mut e.as_common(), Translation::from_raw_text(&text)); + widget.set_text(common, Translation::from_raw_text(&text)); Ok(()) })); diff --git a/wgui/src/components/button.rs b/wgui/src/components/button.rs index 0cf12fc..dc0b12e 100644 --- a/wgui/src/components/button.rs +++ b/wgui/src/components/button.rs @@ -5,9 +5,9 @@ use crate::{ animation::{Animation, AnimationEasing}, components::{Component, ComponentBase, ComponentTrait, InitData}, drawing::{self, Color}, - event::{CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind, ListenerHandleVec}, + event::{CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec}, i18n::Translation, - layout::{Layout, LayoutState, WidgetID}, + layout::{Layout, WidgetID}, renderer_vk::text::{FontWeight, TextStyle}, widget::{ label::{WidgetLabel, WidgetLabelParams}, @@ -42,21 +42,8 @@ impl Default for Params { } } -pub struct ButtonClickEvent<'a> { - pub state: &'a LayoutState, - pub alterables: &'a mut EventAlterables, -} - -impl ButtonClickEvent<'_> { - pub const fn as_common(&mut self) -> CallbackDataCommon { - CallbackDataCommon { - alterables: self.alterables, - state: self.state, - } - } -} - -pub type ButtonClickCallback = Box anyhow::Result<()>>; +pub struct ButtonClickEvent {} +pub type ButtonClickCallback = Box anyhow::Result<()>>; struct State { hovered: bool, @@ -231,10 +218,7 @@ fn register_event_mouse_release( if state.hovered { if let Some(on_click) = &state.on_click { - on_click(ButtonClickEvent { - state: common.state, - alterables: common.alterables, - })?; + on_click(common, ButtonClickEvent {})?; } } } diff --git a/wgui/src/components/checkbox.rs b/wgui/src/components/checkbox.rs index d73a7b8..e094642 100644 --- a/wgui/src/components/checkbox.rs +++ b/wgui/src/components/checkbox.rs @@ -37,22 +37,11 @@ impl Default for Params { } } -pub struct CheckboxToggleEvent<'a> { - pub state: &'a LayoutState, - pub alterables: &'a mut EventAlterables, +pub struct CheckboxToggleEvent { pub checked: bool, } -impl CheckboxToggleEvent<'_> { - pub const fn as_common(&mut self) -> CallbackDataCommon { - CallbackDataCommon { - alterables: self.alterables, - state: self.state, - } - } -} - -pub type CheckboxToggleCallback = Box anyhow::Result<()>>; +pub type CheckboxToggleCallback = Box anyhow::Result<()>>; struct State { checked: bool, @@ -242,11 +231,7 @@ fn register_event_mouse_release( if state.hovered { if let Some(on_toggle) = &state.on_toggle { - on_toggle(CheckboxToggleEvent { - state: common.state, - alterables: common.alterables, - checked: state.checked, - })?; + on_toggle(common, CheckboxToggleEvent { checked: state.checked })?; } } } diff --git a/wgui/src/components/mod.rs b/wgui/src/components/mod.rs index df45fb1..68591f4 100644 --- a/wgui/src/components/mod.rs +++ b/wgui/src/components/mod.rs @@ -2,8 +2,7 @@ use std::rc::Rc; use crate::{ any::AnyTrait, - event::{self, CallbackDataCommon, EventAlterables}, - layout::LayoutState, + event::{self, CallbackDataCommon}, }; pub mod button; @@ -11,17 +10,7 @@ pub mod checkbox; pub mod slider; pub struct InitData<'a> { - pub state: &'a LayoutState, - pub alterables: &'a mut EventAlterables, -} - -impl InitData<'_> { - const fn as_common(&mut self) -> CallbackDataCommon { - CallbackDataCommon { - alterables: self.alterables, - state: self.state, - } - } + pub common: &'a mut CallbackDataCommon<'a>, } // common component data diff --git a/wgui/src/components/slider.rs b/wgui/src/components/slider.rs index 103e279..2122690 100644 --- a/wgui/src/components/slider.rs +++ b/wgui/src/components/slider.rs @@ -69,7 +69,7 @@ impl ComponentTrait for ComponentSlider { fn init(&self, init_data: &mut InitData) { let mut state = self.state.borrow_mut(); let value = state.values.value; - state.set_value(&mut init_data.as_common(), &self.data, value); + state.set_value(init_data.common, &self.data, value); } fn base(&mut self) -> &mut ComponentBase { diff --git a/wgui/src/layout.rs b/wgui/src/layout.rs index eaeb891..b9abc6e 100644 --- a/wgui/src/layout.rs +++ b/wgui/src/layout.rs @@ -7,7 +7,7 @@ use std::{ use crate::{ animation::Animations, components::{Component, InitData}, - event::{self, EventAlterables, EventListenerCollection}, + event::{self, CallbackDataCommon, EventAlterables, EventListenerCollection}, globals::WguiGlobals, transform_stack::Transform, widget::{self, EventParams, WidgetObj, WidgetState, div::WidgetDiv}, @@ -203,10 +203,12 @@ impl Layout { let mut alterables = EventAlterables::default(); while let Some(c) = self.components_to_init.pop_front() { - c.0.init(&mut InitData { + let mut common = CallbackDataCommon { state: &self.state, alterables: &mut alterables, - }); + }; + + c.0.init(&mut InitData { common: &mut common }); } self.process_alterables(alterables)?;