Commit graph

20 commits

Author SHA1 Message Date
Mae PUGIN
9c6f069bf1 feat: Matrix test tool — live key press visualization in Tools tab
Sends MATRIX_TEST (0xB0) toggle, polls unsolicited KR events.
3-state colors: grey (untouched), green (pressed), purple (was activated).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 10:05:36 +02:00
Mae PUGIN
88ab57bebe feat: Move language combobox to Layers tab, update key selector on layout change
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 09:30:18 +02:00
Mae PUGIN
67a883dd0b feat: Add full flash (0x0) option to flasher offset combobox
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 21:20:03 +02:00
Mae PUGIN
3e54361d0d refactor: Modularize main.rs (2478 → 58 lines), flat architecture
Split monolithic main.rs into domain modules:
- context.rs: AppContext shared state, BgMsg enum, serial_spawn helper
- models.rs: UI model builders, keycap labels, key entries, layout preview
- config.rs: keyboard config export/import via binary protocol
- dispatch.rs: BgMsg handler + WPM/layout timers
- keymap.rs: key selection, layer switch/rename, heatmap toggle
- key_selector.rs: dispatch_keycode router, apply_keycode, hex/MT/LT
- macros.rs: macro CRUD, shortcut presets, step builder
- advanced.rs: combos, KO, leaders, tap dance, BT, tama, autoshift
- settings.rs: OTA flash, config backup, keyboard layout
- flasher.rs: ESP32 bootloader flash
- layout.rs: layout JSON preview, load/export
- connection.rs: serial connect/disconnect, tab auto-refresh
- stats.rs: stats refresh

Rename logic/ → protocol/ with cleaner file names.
Remove unused original-src/ directory.
Fix DarkLineEdit double styling, add rename popup, macro shortcuts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 12:02:22 +02:00
Mae PUGIN
d1d10b7d73 feat: Binary protocol v2, config import/export, Tools tab, new layout format
- Migrate all serial commands from ASCII text to binary KS/KR frame protocol
  (SETLAYER, TD_LIST, COMBO_LIST, LEADER_LIST, KO_LIST, etc.)
- Add config import/export as JSON (keymaps, tap dances, combos, KO, leaders, macros)
- Merge Flash + Layout Preview into single Tools tab
- Replace WPF tree layout JSON format with flat groups+keys format:
  - Top-level "keys" for absolute positioning (thumbs, isolated keys)
  - "groups" with x/y/r transform, keys inside use local coordinates
  - Coordinates in units (1u = 50px), w/h default 1u, r default 0
- Layout auto-refresh (5s timer) for live preview while editing externally
- Pretty-print JSON in layout preview and export

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 21:30:04 +02:00
Mae PUGIN
b06bf08cc3 release: v1.0.0 — KeSp Controller multi-platform
- Rename package to KeSp_controller
- Version 1.0.0
- GitHub Actions workflow for Linux/Windows/macOS releases
- Auto-build on tag push (v*)
- Window title and version strings updated

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:23:12 +02:00
Mae PUGIN
ddcb6c6e8f fix: Layer rename targets active layer + rename field width
- active-layer property now updated on switch_layer callback
  (rename was always targeting layer 0)
- Rename input constrained to 85px max-width (no overflow)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:10:00 +02:00
Mae PUGIN
70fa72ddb7 feat: OTA firmware update via CDC serial (Settings tab)
OTA protocol (text-based, uses existing keyboard connection):
1. Send "OTA <size>"
2. Wait for firmware OTA_READY
3. Send firmware in 4096-byte chunks
4. Progress bar with chunk counter
5. OTA_DONE on completion

No programming cable needed - uses the same USB port as
keyboard communication. Browse for .bin file, click Flash OTA.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:45:12 +02:00
Mae PUGIN
2f53119178 fix: Heatmap gradient with stepped colors for clarity
mix() was not rendering correctly. Replaced with stepped thresholds:
- >80%: bright red (#ff0000)
- >60%: red-orange (#ff4400)
- >40%: orange (#ff8800)
- >20%: yellow (#ffcc00)
- >5%: cool blue (#446688)
- <=5%: very cold (#2d2d44)

Dark text when heat > 20%. Removed debug eprintln.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:35:08 +02:00
Mae PUGIN
af32862c76 fix: Heatmap readability - dark text on warm colors
- Gradient: dark purple -> orange -> red (more contrast than blue->yellow)
- Text switches to dark (#1a1a2e) when heat > 0.3
- Bold text in heatmap mode
- Sublabel opacity reduced in heatmap

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:23:12 +02:00
Mae PUGIN
61c3afc344 feat: Auto-refresh data on tab change
- Advanced tab: auto-loads TD, combos, leaders, KO, BT
- Macros tab: auto-loads macro list via binary protocol
- Stats tab: auto-loads heatmap + bigrams
- Only refreshes when connected
- 50ms delays between serial queries

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:16:26 +02:00
Mae PUGIN
0813e8531f 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) <noreply@anthropic.com>
2026-04-07 12:23:34 +02:00
Mae PUGIN
d69b421590 style: DarkLineEdit + scrollable layer sidebar
- DarkLineEdit: wrapper around std LineEdit with Dracula theme
  (dark bg, purple focus border)
- Replaced all remaining std LineEdit in: tab_keymap, tab_macros,
  tab_flasher, key_selector
- Layer sidebar: wrapped in Flickable for scrolling with many layers
- Zero std-widgets visual components remaining (except LineEdit
  inside DarkLineEdit wrapper)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 12:04:13 +02:00
Mae PUGIN
e8f4ee41a6 feat: KO creation with checkboxes (matching egui)
- Replace ModComboBox with Ctrl/Shift/Alt checkboxes for KO mods
- Build HID bitmask from checkboxes (Ctrl=0x01, Shift=0x02, Alt=0x04)
- Add DarkCheckbox component (Dracula theme)
- Descriptive label: "When you press [From] key, output [To] key instead"
- Read all KO fields from properties (no args in callback)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 11:06:32 +02:00
Mae PUGIN
362b0c729c fix: Combo key picker and TD buttons visibility
- Combo picker: pass key index directly instead of relying on selected_key_index
- TD actions: use DarkButton for consistent visibility
- Combo Add: validation message when keys not picked

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:20:54 +02:00
Mae PUGIN
4cfe2fbb7b feat: Editable Tap Dance + combo creation validation
Tap Dance:
- Each TD action is now a clickable button that opens the key selector
- Clicking an action -> pick key from popup -> sends TD_SET binary to firmware
- Labels show 1-tap / 2-tap / 3-tap / hold columns

Combo creation:
- Added validation: "Pick both keys first" message if keys not selected
- Debug log for COMBOSET command

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:09:41 +02:00
Mae PUGIN
d69d931ea9 style: Fix contrast on buttons, combobox, and tab titles
- button-bg lighter (#565970) to stand out from bg-secondary
- Border on DarkButton and DarkComboBox (#6272a4)
- Primary button: dark text on purple bg
- Tab titles: inactive #9a9ebb (was #6272a4), 13px, bold 700 when active

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:03:44 +02:00
Mae PUGIN
4e93f4fd97 style: Custom DarkComboBox + DarkTab (Dracula theme throughout)
- DarkComboBox: PopupWindow dropdown with Dracula colors, replaces all std ComboBox
- DarkTab: custom tab bar with purple underline, replaces std TabWidget
- All 7 .slint files updated, zero std-widgets Button/ComboBox/TabWidget remaining

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 08:46:39 +02:00
Mae PUGIN
28fbf10b79 style: Replace all std Button with custom DarkButton (Dracula theme)
Custom DarkButton component with Dracula theme colors:
- bg-secondary base, button-hover on hover
- primary variant with accent-purple
- Disabled state with reduced opacity
- Consistent 28px height, 4px border-radius

Also fixes PickDarkButton/KeyDarkButton naming errors from agent.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 20:52:44 +02:00
Mae PUGIN
32ee3a6d26 feat: Complete KeSp Controller — Slint UI port
Full port of the KaSe/KeSp split keyboard configurator from egui to Slint:
- 6 tabs: Keymap, Advanced, Macros, Stats, Settings, Flash
- Responsive keyboard view with scale-to-fit and key rotations
- Key selector popup with categorized grid, MT/LT builders, hex input
- Combo key picker with inline keyboard visual
- Macro step builder with visual tags
- Serial communication via background threads + mpsc polling
- Heatmap overlay with blue-yellow-red gradient
- OTA flasher with prog port VID filtering and partition selector
- WPM polling, Tamagotchi, Autoshift controls
- Dracula theme matching egui version

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 20:40:34 +02:00