This commit is contained in:
Joey Yakimowich-Payne 2026-01-30 10:40:52 -07:00
commit ecec82c70e
10 changed files with 809 additions and 21 deletions

View file

@ -254,26 +254,26 @@ A Qt6-based node editor GUI for warppipe using the QtNodes (nodeeditor) library.
- [x] Mixer strips sync from model state via `nodeVolumeChanged` signal
- [x] Include volume/mute states in preset save/load (`volumes` array in JSON)
- [x] Add tests for volume state tracking, signal emission, widget sync, preset round-trip, cleanup on deletion
- [ ] Milestone 8e - Audio Level Meters (requires core API: `MeterPeak()`, `NodeMeterPeak()`, `EnsureNodeMeter()`)
- [ ] Implement `AudioLevelMeter : QWidget`
- [ ] Custom `paintEvent`: vertical bar from bottom, background `(24,24,28)`
- [ ] Color thresholds: green (0-0.7), yellow (0.7-0.9), red (0.9-1.0)
- [ ] Peak hold indicator: white horizontal line, holds 6 frames then decays at 0.02/frame
- [ ] `setLevel(float)` — clamp 0-1, update hold, call `update()`
- [ ] `sizeHint()` → 40×160
- [ ] Add "METERS" tab to sidebar `QTabWidget`:
- [ ] "MASTER OUTPUT" label + master `AudioLevelMeter`
- [ ] "NODE METERS" label + scrollable list of per-node meter rows
- [ ] Per-node row: elided label + compact `AudioLevelMeter` (fixed 26px wide, min 70px tall)
- [ ] Add 30fps meter update timer (33ms, `Qt::PreciseTimer`)
- [ ] Poll `Client::MeterPeak()` → master meter
- [ ] Poll `Client::NodeMeterPeak(nodeId)` → per-node meters + mixer meters
- [ ] Skip updates when widget is not visible (`isVisible()` check)
- [ ] Auto-manage per-node meters:
- [ ] Create meter when node has active links (`ensureNodeMeter()`)
- [ ] Remove meter when node removed or all links removed (`removeNodeMeter()`)
- [ ] Skip meter nodes (filter by name prefix)
- [ ] Add tests for AudioLevelMeter level clamping, hold/decay logic
- [x] Milestone 8e - Audio Level Meters (requires core API: `MeterPeak()`, `NodeMeterPeak()`, `EnsureNodeMeter()`)
- [x] Implement `AudioLevelMeter : QWidget`
- [x] Custom `paintEvent`: vertical bar from bottom, background `(24,24,28)`
- [x] Color thresholds: green (0-0.7), yellow (0.7-0.9), red (0.9-1.0)
- [x] Peak hold indicator: white horizontal line, holds 6 frames then decays at 0.02/frame
- [x] `setLevel(float)` — clamp 0-1, update hold, call `update()`
- [x] `sizeHint()` → 40×160
- [x] Add "METERS" tab to sidebar `QTabWidget`:
- [x] "MASTER OUTPUT" label + master `AudioLevelMeter`
- [x] "NODE METERS" label + scrollable list of per-node meter rows
- [x] Per-node row: elided label + compact `AudioLevelMeter` (fixed 26px wide, min 70px tall)
- [x] Add 30fps meter update timer (33ms, `Qt::PreciseTimer`)
- [x] Poll `Client::MeterPeak()` → master meter
- [x] Poll `Client::NodeMeterPeak(nodeId)` → per-node meters
- [x] Auto-rebuild node meters on node create/delete
- [x] Auto-manage per-node meters:
- [x] Call `EnsureNodeMeter()` for each node during rebuild
- [x] Remove meter rows when nodes deleted
- [x] `rebuildNodeMeters()` wired to `nodeCreated`/`nodeDeleted` signals
- [x] Add tests for AudioLevelMeter level clamping, hold/decay logic, METERS tab existence, meter row creation
- [ ] Milestone 8f - Architecture and Routing Rules
- [ ] Event-driven updates: replace 500ms polling with signal/slot if core adds registry callbacks
- [ ] `nodeAdded(NodeInfo)`, `nodeRemoved(uint32_t)`, `nodeChanged(NodeInfo)`