listener handles, auto-clean destroyed listeners, minor refactor

This commit is contained in:
Aleksander
2025-07-06 20:53:40 +02:00
parent 92444bb5c4
commit 857c5ec865
16 changed files with 348 additions and 182 deletions

View File

@@ -11,7 +11,7 @@ pub fn create_anchor<O>(app: &mut AppState) -> anyhow::Result<OverlayData<O>>
where
O: Default,
{
let (panel, _) = GuiPanel::new_from_template(app, "gui/anchor.xml", ())?;
let panel = GuiPanel::new_from_template(app, "gui/anchor.xml", ())?;
Ok(OverlayData {
state: OverlayState {

View File

@@ -14,9 +14,9 @@ where
O: Default,
{
let state = BarState {};
let (mut panel, parser) = GuiPanel::new_from_template(app, "gui/bar.xml", state)?;
let mut panel = GuiPanel::new_from_template(app, "gui/bar.xml", state)?;
for (id, widget_id) in parser.ids {
for (id, _widget_id) in &panel.parser_state.ids {
match id.as_ref() {
"lock" => {}
"anchor" => {}

View File

@@ -186,7 +186,8 @@ where
})
};
panel.listeners.add(
panel.listeners.register(
&mut panel.listener_handles,
*widget_id,
EventListenerKind::MouseEnter,
Box::new({
@@ -197,7 +198,8 @@ where
}
}),
);
panel.listeners.add(
panel.listeners.register(
&mut panel.listener_handles,
*widget_id,
EventListenerKind::MouseLeave,
Box::new({
@@ -208,7 +210,8 @@ where
}
}),
);
panel.listeners.add(
panel.listeners.register(
&mut panel.listener_handles,
*widget_id,
EventListenerKind::MousePress,
Box::new({
@@ -223,7 +226,8 @@ where
}
}),
);
panel.listeners.add(
panel.listeners.register(
&mut panel.listener_handles,
*widget_id,
EventListenerKind::MouseRelease,
Box::new({
@@ -237,7 +241,8 @@ where
);
if let Some(modifier) = my_modifier {
panel.listeners.add(
panel.listeners.register(
&mut panel.listener_handles,
*widget_id,
EventListenerKind::InternalStateChange,
Box::new({
@@ -259,6 +264,7 @@ where
}
panel.layout.update(vec2(2048., 2048.), 0.0)?;
panel.parser_state = gui_state_key;
let width = layout.row_size * 0.05 * app.session.config.keyboard_scale;

View File

@@ -25,7 +25,7 @@ where
O: Default,
{
let state = WatchState {};
let (mut panel, parser) = GuiPanel::new_from_template(app, "gui/watch.xml", state)?;
let mut panel = GuiPanel::new_from_template(app, "gui/watch.xml", state)?;
panel
.timers
@@ -33,8 +33,8 @@ where
let clock_regex = Regex::new(r"^clock([0-9])_([a-z]+)$").unwrap();
for (id, widget_id) in parser.ids {
if let Some(cap) = clock_regex.captures(&id) {
for (id, widget_id) in &panel.parser_state.ids {
if let Some(cap) = clock_regex.captures(id) {
let tz_idx: usize = cap.get(1).unwrap().as_str().parse().unwrap(); // safe due to regex
let tz_str = (tz_idx > 0)
.then(|| app.session.config.timezones.get(tz_idx - 1))
@@ -44,7 +44,7 @@ where
let mut widget = panel
.layout
.widget_map
.get_mut(widget_id)
.get_mut(*widget_id)
.unwrap() // want panic
.lock()
.unwrap(); // want panic
@@ -87,8 +87,9 @@ where
format: format.into(),
};
panel.listeners.add(
widget_id,
panel.listeners.register(
&mut panel.listener_handles,
*widget_id,
EventListenerKind::InternalStateChange,
Box::new(move |_common, data, _, _| {
clock_on_tick(&clock, data);