TASK 20 step 1: global hotkeys F1-F9 (scenes, stream, mutes, TRAX)

This commit is contained in:
2026-08-24 09:32:54 -07:00
parent b899ff053f
commit b0bace7432
7 changed files with 286 additions and 14 deletions
+9 -9
View File
@@ -958,8 +958,8 @@ The tasks below are ordered by dependency and risk. Each task builds on the prev
1. ✅ **TASK 9.4** — Live chat (right panel) — wire `YouTubeChatService.Start()`, parse messages, render in panel. Foundation for chat box source.
2. ✅ **TASK 3.18** — Chat box source — renders chat ON the stream. Depends on TASK 9.4 (same message parsing).
3. ✅ **TASK 10** — Polar billing — license key entry + watermark toggle + Velopack auto-updates (steps 1-7 shipped; Velopack update URL pending).
4. **TASK 19/23** — Control Surface UX — director's control room: thumbnails above central monitor, transitions (Cut/Fade/Move), edit mode offline only, left panel two-state (layers/props ↔ chat), right panel eliminated.
5. **TASK 20** — Hotkeys — global keyboard shortcuts. Small scope, huge UX impact.
4. ✅ **TASK 19/23** — Control Surface UX — director's control room: thumbnails above central monitor, transitions (Cut/Fade/Move), edit mode offline only, left panel two-state (layers/props ↔ chat), right panel eliminated. Verified shipped 2026-08-24.
5. **TASK 20** — Hotkeys — global keyboard shortcuts. Step 1 (F1-F9 defaults) shipped 2026-08-24; config UI + persistence remain.
6. **TASK 17** — Web source (WebView2) — enables alert ecosystem.
7. **TASK 18** — Local recording — independent, but pairs with stream.
8. **TASK 21** — Media source — video file playback for non-Live scenes.
@@ -987,16 +987,16 @@ The tasks below are ordered by dependency and risk. Each task builds on the prev
**Goal:** keyboard shortcuts for scene switching and common actions — the single biggest UX gap.
### Status: ☐ Not started — required for v1
### Status: ◐ In progress — step 1 shipped 2026-08-24
1. ☐ `HotkeyManager` service — register/unregister hotkeys per scene + common actions
2. ☐ Scene switching hotkeys — F1-F5 for the 5 canonical scenes (configurable)
3. ☐ Common action hotkeys — Start/Stop stream, Mute/Unmute mic, Mute/Unmute game, Toggle TRAX
1. ✅ `GlobalHotkeyManager` service — `Services/GlobalHotkeys.cs`: registers OS-level hotkeys on the window HWND via `RegisterHotKey`/`WM_HOTKEY` (`IHotkeyRegistrar` seam for tests; `RegistrarOverride` mirrors `LayoutPathOverride`). Wired in `MainWindow.OnSourceInitialized`.
2. ☑ Scene switching hotkeys — F1-F5 stage/transition the five canonical scenes. Fixed defaults; configurability deferred to the config UI step.
3. ☑ Common action hotkeys — F6 start/end stream, F7 mute mic, F8 mute desktop audio, F9 TRAX play/pause. Dispatch lives in `MainViewModel.HandleHotkey` and honors command gating.
4. ☐ Hotkey configuration UI — Settings dialog or per-scene hotkey picker
5. ☐ Global hotkeys — work even when app is not focused (for gaming)
6. ☐ Conflict detection — warn when two actions share the same hotkey
5. ✅ Global hotkeys — work even when app is not focused (that is what `RegisterHotKey` gives us)
6. ☐ Conflict detection — warn when two actions share the same hotkey (impossible with fixed defaults; arrives with configurability)
7. ☐ Schema migration for hotkey bindings (persist across restarts)
8. ☐ Tests: hotkey registration, conflict detection, scene switch via hotkey
8. ☑ Test: `GlobalHotkeyTests.WmHotkey_StagesScene_And_TogglesMic_And_RevokesOnClose` — real window + fake registrar, a genuine `WM_HOTKEY` posted through the window's own `HwndSource` hook stages the mapped scene and flips mic mute; close revokes every registration.
### Design decisions