GUI Milestone 8b

This commit is contained in:
Joey Yakimowich-Payne 2026-01-30 08:07:21 -07:00
commit 4a248e5622
6 changed files with 682 additions and 37 deletions

View file

@ -190,26 +190,26 @@ A Qt6-based node editor GUI for warppipe using the QtNodes (nodeeditor) library.
- [x] Ctrl+L → auto-arrange + zoom fit
- [x] Remove default QtNodes copy/paste actions to avoid conflicts
- [x] Add tests for undo/redo command state (push command → undo → verify node re-created → redo → verify deleted)
- [ ] Milestone 8b - View and Layout Enhancements
- [ ] Add "Zoom Fit All" context menu action → `m_view->zoomFitAll()`
- [ ] Add "Zoom Fit Selected" context menu action → `m_view->zoomFitSelected()`
- [ ] Add "Save Layout As..." context menu action
- [ ] `QFileDialog::getSaveFileName()` → save layout JSON to custom path
- [ ] Reuse existing `saveLayout()` serialization, write to chosen path
- [ ] Add "Reset Layout" context menu action
- [ ] Clear saved positions, run `autoArrange()`, save, zoom fit
- [ ] Add "Refresh Graph" context menu action
- [ ] Reset model, re-sync from client, zoom fit
- [ ] Persist view state in layout JSON:
- [ ] Save view scale + center position (`m_view->getScale()`, `m_view->mapToScene(viewport center)`)
- [ ] Restore on load: `m_view->setupScale()` + `m_view->centerOn()`
- [ ] Fallback to `zoomFitAll()` when no saved view state
- [ ] Persist ghost nodes in layout JSON:
- [ ] Serialize ghost node stable_id, name, description, input/output ports (id + name), position
- [ ] Serialize ghost connections (out_stable_id, out_port_index, in_stable_id, in_port_index)
- [ ] Restore ghosts from layout on load (before live sync)
- [ ] Add middle-click center: `eventFilter` on viewport catches `MiddleButton``m_view->centerOn(mapToScene(pos))`
- [ ] Add tests for view state save/load round-trip and ghost persistence
- [x] Milestone 8b - View and Layout Enhancements
- [x] Add "Zoom Fit All" context menu action → `m_view->zoomFitAll()`
- [x] Add "Zoom Fit Selected" context menu action → `m_view->zoomFitSelected()`
- [x] Add "Save Layout As..." context menu action
- [x] `QFileDialog::getSaveFileName()` → save layout JSON to custom path
- [x] Reuse existing `saveLayout()` serialization, write to chosen path
- [x] Add "Reset Layout" context menu action
- [x] Clear saved positions, run `autoArrange()`, save, zoom fit
- [x] Add "Refresh Graph" context menu action
- [x] Reset model, re-sync from client, zoom fit
- [x] Persist view state in layout JSON:
- [x] Save view scale + center position (`m_view->getScale()`, `m_view->mapToScene(viewport center)`)
- [x] Restore on load: `m_view->setupScale()` + `m_view->centerOn()`
- [x] Fallback to `zoomFitAll()` when no saved view state
- [x] Persist ghost nodes in layout JSON:
- [x] Serialize ghost node stable_id, name, description, input/output ports (id + name), position
- [x] Serialize ghost connections (out_stable_id, out_port_index, in_stable_id, in_port_index)
- [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
@ -276,7 +276,7 @@ A Qt6-based node editor GUI for warppipe using the QtNodes (nodeeditor) library.
- [ ] 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
- [ ] Milestone 8f (Optional) - Architecture and Routing Rules
- [ ] 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)`
- [ ] `linkAdded(LinkInfo)`, `linkRemoved(uint32_t)`