GUI Milestone 8c

This commit is contained in:
Joey Yakimowich-Payne 2026-01-30 08:57:33 -07:00
commit fa67dd3708
9 changed files with 458 additions and 22 deletions

View file

@ -210,27 +210,27 @@ A Qt6-based node editor GUI for warppipe using the QtNodes (nodeeditor) library.
- [x] Restore ghosts from layout on load (before live sync)
- [x] Add middle-click center: `eventFilter` on viewport catches `MiddleButton``m_view->centerOn(mapToScene(pos))`
- [x] Add tests for view state save/load round-trip and ghost persistence
- [ ] Milestone 8c - Sidebar and Preset System
- [ ] Add `QSplitter` between graph view and sidebar panel
- [ ] Graph view (stretch factor 1) on left, sidebar (stretch factor 0) on right
- [ ] Persist splitter sizes in layout JSON, restore on load
- [ ] Default sizes: graph 1200, sidebar 320
- [ ] Add `QTabWidget` sidebar with styled tabs (dark theme)
- [ ] Tab styling: dark background, selected tab has accent underline
- [ ] Initially one tab: "PRESETS" (meters/mixer tabs added in M8d/M8e)
- [ ] Implement `PresetManager` class:
- [ ] `savePreset(path)` → serialize to JSON:
- [ ] Virtual devices: name, description, media_class, channels, rate
- [ ] Routing: links by stable_id:port_name pairs
- [ ] UI layout: node positions, view state
- [ ] `loadPreset(path)` → apply from JSON:
- [ ] Create missing virtual devices
- [ ] Re-create links from routing entries
- [ ] Apply layout positions
- [ ] Save on quit via `QCoreApplication::aboutToQuit` signal
- [ ] Add "Save Preset..." context menu action → `QFileDialog::getSaveFileName()`
- [ ] Add "Load Preset..." context menu action → `QFileDialog::getOpenFileName()`
- [ ] Add tests for preset save/load round-trip
- [x] Milestone 8c - Sidebar and Preset System
- [x] Add `QSplitter` between graph view and sidebar panel
- [x] Graph view (stretch factor 1) on left, sidebar (stretch factor 0) on right
- [x] Persist splitter sizes in layout JSON, restore on load
- [x] Default sizes: graph 1200, sidebar 320
- [x] Add `QTabWidget` sidebar with styled tabs (dark theme)
- [x] Tab styling: dark background, selected tab has accent underline
- [x] Initially one tab: "PRESETS" (meters/mixer tabs added in M8d/M8e)
- [x] Implement `PresetManager` class:
- [x] `savePreset(path)` → serialize to JSON:
- [x] Virtual devices: name, description, media_class, channels, rate
- [x] Routing: links by stable_id:port_name pairs
- [x] UI layout: node positions, view state
- [x] `loadPreset(path)` → apply from JSON:
- [x] Create missing virtual devices
- [x] Re-create links from routing entries
- [x] Apply layout positions
- [x] Save on quit via `QCoreApplication::aboutToQuit` signal
- [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