This commit is contained in:
Joey Yakimowich-Payne 2026-01-30 09:24:46 -07:00
commit a07f94c93d
10 changed files with 718 additions and 25 deletions

View file

@ -231,31 +231,29 @@ A Qt6-based node editor GUI for warppipe using the QtNodes (nodeeditor) library.
- [x] Add "Save Preset..." context menu action → `QFileDialog::getSaveFileName()`
- [x] Add "Load Preset..." context menu action → `QFileDialog::getOpenFileName()`
- [x] Add tests for preset save/load round-trip
- [ ] Milestone 8d - Volume/Mute Controls (requires core API: `SetNodeVolume()`)
- [ ] Add `NodeVolumeState` struct: `{ float volume; bool mute; }`
- [ ] Add `ClickSlider : QSlider` — click jumps to position instead of page-stepping
- [ ] Add inline volume widget per node via `nodeData(NodeRole::Widget)`:
- [ ] Horizontal `ClickSlider` (0-100) + mute `QToolButton`
- [ ] Calls `Client::SetNodeVolume(nodeId, volume, mute)` on change
- [ ] Styled: dark background, green slider fill, rounded mute button
- [ ] Implement `VolumeChangeCommand : QUndoCommand`
- [ ] Stores previous + next `NodeVolumeState`, node ID
- [ ] `undo()` → apply previous state; `redo()` → apply next state
- [ ] Push on slider release or mute toggle (not during drag)
- [ ] Track volume states in model: `QHash<uint32_t, NodeVolumeState> m_nodeVolumeState`
- [ ] `setNodeVolumeState()` — update state + sync inline widget
- [ ] `nodeVolumeState()` — read current state
- [ ] Emit `nodeVolumeChanged(nodeId, previous, current)` signal
- [ ] Add "MIXER" tab to sidebar `QTabWidget`:
- [ ] `QScrollArea` with horizontal layout of channel strips
- [ ] Per-node strip: `AudioLevelMeter` + vertical `ClickSlider` (fader) + Mute (M) + Solo (S) buttons + node label
- [ ] Solo logic: when any node is soloed, all non-soloed nodes are muted
- [ ] Volume fader changes push `VolumeChangeCommand` onto undo stack
- [ ] `refreshMixerStrip()` — create strip when node appears
- [ ] `removeMixerStrip()` — destroy strip when node removed
- [ ] `updateMixerState()` — sync fader/mute from model state
- [ ] Include volume/mute states in preset save/load (`persistent_volumes`, `persistent_mutes`)
- [ ] Add tests for VolumeChangeCommand undo/redo and mixer strip lifecycle
- [x] Milestone 8d - Volume/Mute Controls (requires core API: `SetNodeVolume()`)
- [x] Add `NodeVolumeState` struct: `{ float volume; bool mute; }`
- [x] Add `ClickSlider : QSlider` — click jumps to position instead of page-stepping
- [x] Add inline volume widget per node via `nodeData(NodeRole::Widget)`:
- [x] Horizontal `ClickSlider` (0-100) + mute `QToolButton`
- [x] Calls `Client::SetNodeVolume(nodeId, volume, mute)` on change
- [x] Styled: dark background, green slider fill, rounded mute button
- [x] Implement `VolumeChangeCommand : QUndoCommand`
- [x] Stores previous + next `NodeVolumeState`, node ID
- [x] `undo()` → apply previous state; `redo()` → apply next state
- [x] Push on slider release or mute toggle (not during drag)
- [x] Track volume states in model: `std::unordered_map<NodeId, NodeVolumeState> m_volumeStates`
- [x] `setNodeVolumeState()` — update state + sync inline widget + call Client API
- [x] `nodeVolumeState()` — read current state
- [x] Emit `nodeVolumeChanged(nodeId, previous, current)` signal
- [x] Add "MIXER" tab to sidebar `QTabWidget`:
- [x] `QScrollArea` with vertical layout of channel strips
- [x] Per-node strip: horizontal `ClickSlider` (fader) + Mute (M) button + node label
- [x] Volume fader changes push `VolumeChangeCommand` onto undo stack
- [x] `rebuildMixerStrips()` — create/remove strips when nodes appear/disappear
- [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)`