From 0813e8531f4b617fc30487cfa897e8965a41c108 Mon Sep 17 00:00:00 2001 From: Mae PUGIN <48982737+mornepousse@users.noreply.github.com> Date: Tue, 7 Apr 2026 12:23:34 +0200 Subject: [PATCH] fix: Auto-slot macros + heatmap auto-load on toggle - Macro slot auto-assigned from macros.len() (no manual slot selection) - Heatmap toggle auto-loads KEYSTATS? from firmware - Debug logs for macro save/refresh Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main.rs | 21 ++++++++++++++++++++- ui/globals.slint | 3 ++- ui/tabs/tab_keymap.slint | 5 ++++- ui/tabs/tab_macros.slint | 6 ------ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9af2c6c..e1f276e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -489,6 +489,23 @@ fn main() { }); } + // --- Heatmap toggle: auto-load data --- + { + let serial = serial.clone(); + let tx = bg_tx.clone(); + + keymap_bridge.on_toggle_heatmap(move || { + let serial = serial.clone(); + let tx = tx.clone(); + std::thread::spawn(move || { + let mut ser = serial.lock().unwrap_or_else(|e| e.into_inner()); + let lines = ser.query_command("KEYSTATS?").unwrap_or_default(); + let (data, max) = logic::parsers::parse_heatmap_lines(&lines); + let _ = tx.send(BgMsg::HeatmapData(data, max)); + }); + }); + } + // --- Connect/Disconnect callbacks --- { let serial_c = serial.clone(); @@ -1203,7 +1220,7 @@ fn main() { window.global::().on_save_macro(move || { let Some(w) = window_weak.upgrade() else { return }; let mb = w.global::(); - let slot_num = mb.get_new_slot_idx() as u8; + let slot_num = mb.get_macros().row_count() as u8; let name = mb.get_new_name().to_string(); let steps = macro_steps.borrow(); let steps_str: Vec = steps.iter().map(|&(kc, md)| { @@ -1213,6 +1230,7 @@ fn main() { let steps_text = steps_str.join(","); drop(steps); let cmd = logic::protocol::cmd_macroseq(slot_num, &name, &steps_text); + eprintln!("MACRO SAVE: {}", cmd); let serial = serial.clone(); let tx = tx.clone(); std::thread::spawn(move || { @@ -1606,6 +1624,7 @@ fn main() { window.global::().set_bt_status(SharedString::from(bt_text)); } "macros" => { + eprintln!("MACRO raw lines: {:?}", lines); let macro_data = logic::parsers::parse_macro_lines(&lines); let model: Vec = macro_data.iter().map(|m| { let steps_str: Vec = m.steps.iter().map(|s| { diff --git a/ui/globals.slint b/ui/globals.slint index bf74f85..6e78ca1 100644 --- a/ui/globals.slint +++ b/ui/globals.slint @@ -62,7 +62,8 @@ export global KeymapBridge { in-out property selector-target: "keymap"; callback select-key(int); callback switch-layer(int); - callback change-key(int, int); // key-index, new-keycode + callback change-key(int, int); + callback toggle-heatmap(); callback rename-layer(int, string); // layer-index, new-name } diff --git a/ui/tabs/tab_keymap.slint b/ui/tabs/tab_keymap.slint index 6d3c062..0ca00cc 100644 --- a/ui/tabs/tab_keymap.slint +++ b/ui/tabs/tab_keymap.slint @@ -106,7 +106,10 @@ export component TabKeymap inherits VerticalLayout { } TouchArea { - clicked => { KeymapBridge.heatmap-enabled = !KeymapBridge.heatmap-enabled; } + clicked => { + KeymapBridge.heatmap-enabled = !KeymapBridge.heatmap-enabled; + if KeymapBridge.heatmap-enabled { KeymapBridge.toggle-heatmap(); } + } mouse-cursor: pointer; } } diff --git a/ui/tabs/tab_macros.slint b/ui/tabs/tab_macros.slint index d976c17..b358d83 100644 --- a/ui/tabs/tab_macros.slint +++ b/ui/tabs/tab_macros.slint @@ -39,12 +39,6 @@ export component TabMacros inherits Rectangle { spacing: 8px; alignment: start; - Text { text: "Slot:"; color: Theme.fg-secondary; font-size: 12px; vertical-alignment: center; } - DarkComboBox { - width: 60px; - model: ["0","1","2","3","4","5","6","7","8","9"]; - current-index <=> MacroBridge.new-slot-idx; - } Text { text: "Name:"; color: Theme.fg-secondary; font-size: 12px; vertical-alignment: center; } DarkLineEdit { horizontal-stretch: 1;