wgui: Refactoring, various changes (see desc)

- use parking_lot for mutex (less restrictive and easier to use)
- simplify event callbacks and widget type casting
- defer component initialization at start (required for setting the initial state of sliders)
- fix non-working scroll events
- update testbed.xml
- replace slider with the real one in bar.xml
- show slider text on its handle
This commit is contained in:
Aleksander
2025-07-29 22:12:01 +02:00
parent f950273a2d
commit 4e46c45bcf
21 changed files with 450 additions and 334 deletions

View File

@@ -320,7 +320,7 @@ impl WidgetState {
pub fn process_event<'a, U1, U2>(
&mut self,
widget_id: WidgetID,
listeners: &EventListenerVec<U1, U2>,
listeners: Option<&EventListenerVec<U1, U2>>,
node_id: taffy::NodeId,
event: &Event,
user_data: &mut (&mut U1, &mut U2),
@@ -331,52 +331,92 @@ impl WidgetState {
match &event {
Event::MouseDown(e) => {
if hovered && self.data.set_device_pressed(e.device, true) {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MousePress,
user_data,
CallbackMetadata::MouseButton(event::MouseButton {
index: e.index,
pos: e.pos
})
);
}
}
Event::MouseUp(e) => {
if self.data.set_device_pressed(e.device, false) {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseRelease,
user_data,
CallbackMetadata::MouseButton(event::MouseButton {
index: e.index,
pos: e.pos,
})
);
}
}
Event::MouseMotion(e) => {
if self.data.set_device_hovered(e.device, hovered) {
if self.data.is_hovered() {
if let Some(listeners) = &listeners {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseEnter,
MousePress,
user_data,
CallbackMetadata::None
CallbackMetadata::MouseButton(event::MouseButton {
index: e.index,
pos: e.pos
})
);
} else {
}
}
}
Event::MouseUp(e) => {
if self.data.set_device_pressed(e.device, false) {
if let Some(listeners) = listeners {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseRelease,
user_data,
CallbackMetadata::MouseButton(event::MouseButton {
index: e.index,
pos: e.pos,
})
);
}
}
}
Event::MouseMotion(e) => {
let hover_state_changed = self.data.set_device_hovered(e.device, hovered);
if let Some(listeners) = &listeners {
if hover_state_changed {
if self.data.is_hovered() {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseEnter,
user_data,
CallbackMetadata::None
);
} else {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseLeave,
user_data,
CallbackMetadata::None
);
}
}
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseMotion,
user_data,
CallbackMetadata::MousePosition(event::MousePosition { pos: e.pos })
);
}
}
Event::MouseWheel(e) => {
if hovered && self.process_wheel(params, e) {
return EventResult::Consumed;
}
}
Event::MouseLeave(e) => {
if self.data.set_device_hovered(e.device, false) {
if let Some(listeners) = &listeners {
call_event!(
self,
listeners,
@@ -389,49 +429,21 @@ impl WidgetState {
);
}
}
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseMotion,
user_data,
CallbackMetadata::MousePosition(event::MousePosition { pos: e.pos })
);
}
Event::MouseWheel(e) => {
if hovered && self.process_wheel(params, e) {
return EventResult::Consumed;
}
}
Event::MouseLeave(e) => {
if self.data.set_device_hovered(e.device, false) {
Event::InternalStateChange(e) => {
if let Some(listeners) = &listeners {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
MouseLeave,
InternalStateChange,
user_data,
CallbackMetadata::None
CallbackMetadata::Custom(e.metadata)
);
}
}
Event::InternalStateChange(e) => {
call_event!(
self,
listeners,
widget_id,
node_id,
params,
InternalStateChange,
user_data,
CallbackMetadata::Custom(e.metadata)
);
}
}
EventResult::Pass
}

View File

@@ -61,7 +61,7 @@ impl WidgetObj for SpriteBox {
let mut buffer = Buffer::new_empty(DEFAULT_METRICS);
{
let mut font_system = FONT_SYSTEM.lock().unwrap(); // safe unwrap
let mut font_system = FONT_SYSTEM.lock();
let mut buffer = buffer.borrow_with(&mut font_system);
let attrs = Attrs::new()
.color(Color::rgb(255, 0, 255))

View File

@@ -30,7 +30,7 @@ impl TextLabel {
let mut buffer = Buffer::new_empty(metrics);
{
let mut font_system = FONT_SYSTEM.lock().unwrap(); // safe unwrap
let mut font_system = FONT_SYSTEM.lock();
let mut buffer = buffer.borrow_with(&mut font_system);
buffer.set_wrap(wrap);
@@ -56,7 +56,7 @@ impl TextLabel {
self.params.content = String::from(text);
let attrs = Attrs::from(&self.params.style);
let mut font_system = FONT_SYSTEM.lock().unwrap(); // safe unwrap
let mut font_system = FONT_SYSTEM.lock();
let mut buffer = self.buffer.borrow_mut();
buffer.set_rich_text(
@@ -79,7 +79,7 @@ impl WidgetObj for TextLabel {
if self.last_boundary != boundary {
self.last_boundary = boundary;
let mut font_system = FONT_SYSTEM.lock().unwrap(); // safe unwrap
let mut font_system = FONT_SYSTEM.lock();
let mut buffer = self.buffer.borrow_mut();
buffer.set_size(
&mut font_system,
@@ -108,7 +108,7 @@ impl WidgetObj for TextLabel {
AvailableSpace::Definite(width) => Some(width),
});
let mut font_system = FONT_SYSTEM.lock().unwrap(); // safe unwrap
let mut font_system = FONT_SYSTEM.lock();
let mut buffer = self.buffer.borrow_mut();
buffer.set_size(&mut font_system, width_constraint, None);