wgui: components base, anyhow event listener callbacks, 📦📎-fixes, typo fixes

This commit is contained in:
Aleksander
2025-08-13 17:10:00 +02:00
parent 93a3fee349
commit a79ed0839b
23 changed files with 104 additions and 72 deletions

View File

@@ -3,7 +3,7 @@ use taffy::{AlignItems, JustifyContent, prelude::length};
use crate::{
animation::{Animation, AnimationEasing},
components::{Component, ComponentTrait, InitData},
components::{Component, ComponentBase, ComponentTrait, InitData},
drawing::{self, Color},
event::{EventAlterables, EventListenerCollection, EventListenerKind, ListenerHandleVec},
i18n::Translation,
@@ -42,7 +42,7 @@ pub struct ButtonClickEvent<'a> {
pub state: &'a LayoutState,
pub alterables: &'a mut EventAlterables,
}
pub type ButtonClickCallback = Box<dyn Fn(ButtonClickEvent)>;
pub type ButtonClickCallback = Box<dyn Fn(ButtonClickEvent) -> anyhow::Result<()>>;
struct State {
hovered: bool,
@@ -59,14 +59,16 @@ struct Data {
}
pub struct ComponentButton {
base: ComponentBase,
data: Rc<Data>,
state: Rc<RefCell<State>>,
#[allow(dead_code)]
listener_handles: ListenerHandleVec,
}
impl ComponentTrait for ComponentButton {
fn base(&mut self) -> &mut ComponentBase {
&mut self.base
}
fn init(&self, _data: &mut InitData) {}
}
@@ -143,6 +145,7 @@ fn register_event_mouse_enter<U1, U2>(
.alterables
.animate(anim_hover_in(data.clone(), event_data.widget_id));
state.borrow_mut().hovered = true;
Ok(())
}),
);
}
@@ -163,6 +166,7 @@ fn register_event_mouse_leave<U1, U2>(
.alterables
.animate(anim_hover_out(data.clone(), event_data.widget_id));
state.borrow_mut().hovered = false;
Ok(())
}),
);
}
@@ -184,6 +188,8 @@ fn register_event_mouse_press<U1, U2>(
if state.hovered {
state.down = true;
}
Ok(())
}),
);
}
@@ -209,11 +215,12 @@ fn register_event_mouse_release<U1, U2>(
if let Some(on_click) = &state.on_click {
on_click(ButtonClickEvent {
state: common.state,
alterables: &mut common.alterables,
});
alterables: common.alterables,
})?;
}
}
}
Ok(())
}),
);
}
@@ -286,18 +293,14 @@ pub fn construct<U1, U2>(
on_click: None,
}));
let mut lhandles = ListenerHandleVec::default();
let mut base = ComponentBase::default();
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut base.lhandles);
let button = Rc::new(ComponentButton {
data,
state,
listener_handles: lhandles,
});
let button = Rc::new(ComponentButton { base, data, state });
layout.defer_component_init(Component(button.clone()));
Ok(button)

View File

@@ -1,6 +1,10 @@
use std::rc::Rc;
use crate::{any::AnyTrait, event::EventAlterables, layout::LayoutState};
use crate::{
any::AnyTrait,
event::{self, EventAlterables},
layout::LayoutState,
};
pub mod button;
pub mod slider;
@@ -10,7 +14,14 @@ pub struct InitData<'a> {
pub alterables: &'a mut EventAlterables,
}
// common component data
#[derive(Default)]
pub struct ComponentBase {
lhandles: event::ListenerHandleVec,
}
pub trait ComponentTrait: AnyTrait {
fn base(&mut self) -> &mut ComponentBase;
fn init(&self, data: &mut InitData);
}

View File

@@ -5,7 +5,7 @@ use taffy::prelude::{length, percent};
use crate::{
animation::{Animation, AnimationEasing},
components::{Component, ComponentTrait, InitData},
components::{Component, ComponentBase, ComponentTrait, InitData},
drawing::{self},
event::{
self, CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind,
@@ -63,11 +63,9 @@ struct Data {
}
pub struct ComponentSlider {
base: ComponentBase,
data: Rc<Data>,
state: Rc<RefCell<State>>,
#[allow(dead_code)]
listener_handles: ListenerHandleVec,
}
impl ComponentTrait for ComponentSlider {
@@ -76,6 +74,10 @@ impl ComponentTrait for ComponentSlider {
let value = state.values.value;
state.set_value(init_data.state, &self.data, init_data.alterables, value);
}
fn base(&mut self) -> &mut ComponentBase {
&mut self.base
}
}
// NOTICE: this can be re-used in the future
@@ -222,6 +224,7 @@ fn register_event_mouse_enter<U1, U2>(
common.alterables.trigger_haptics();
state.borrow_mut().hovered = true;
on_enter_anim(common, data.slider_handle_rect_id);
Ok(())
}),
);
}
@@ -240,6 +243,7 @@ fn register_event_mouse_leave<U1, U2>(
common.alterables.trigger_haptics();
state.borrow_mut().hovered = false;
on_leave_anim(common, data.slider_handle_rect_id);
Ok(())
}),
);
}
@@ -260,6 +264,8 @@ fn register_event_mouse_motion<U1, U2>(
if state.dragging {
state.update_value_to_mouse(event_data, &data, common);
}
Ok(())
}),
);
}
@@ -282,6 +288,8 @@ fn register_event_mouse_press<U1, U2>(
state.dragging = true;
state.update_value_to_mouse(event_data, &data, common)
}
Ok(())
}),
);
}
@@ -303,6 +311,8 @@ fn register_event_mouse_release<U1, U2>(
if state.dragging {
state.dragging = false;
}
Ok(())
}),
);
}
@@ -417,20 +427,16 @@ pub fn construct<U1, U2>(
let state = Rc::new(RefCell::new(state));
let mut lhandles = ListenerHandleVec::default();
let mut base = ComponentBase::default();
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_motion(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut lhandles);
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_motion(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut base.lhandles);
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut base.lhandles);
let slider = Rc::new(ComponentSlider {
data,
state,
listener_handles: lhandles,
});
let slider = Rc::new(ComponentSlider { base, data, state });
layout.defer_component_init(Component(slider.clone()));
Ok(slider)