Undo for all

This commit is contained in:
Joey Yakimowich-Payne 2026-01-28 09:03:35 -07:00
commit f2d0494af2
3 changed files with 8 additions and 4 deletions

View file

@ -1238,8 +1238,8 @@ private:
### Milestone 6: Undo/Redo & Polish ### Milestone 6: Undo/Redo & Polish
**Estimated Time:** 1-2 weeks **Estimated Time:** 1-2 weeks
- [ ] Integrate QUndoStack for all graph operations - [x] Integrate QUndoStack for all graph operations
- [ ] Implement command classes for link, volume, node operations - [x] Implement command classes for link, volume, node operations
- [ ] Add keyboard shortcuts (Delete, Ctrl+D, Ctrl+Z, etc.) - [ ] Add keyboard shortcuts (Delete, Ctrl+D, Ctrl+Z, etc.)
- [ ] Implement context menus for nodes/canvas - [ ] Implement context menus for nodes/canvas
- [ ] Add copy/paste/duplicate functionality - [ ] Add copy/paste/duplicate functionality

View file

@ -904,7 +904,7 @@ void GraphEditorWidget::refreshMixerStrip(uint32_t nodeId, const Potato::NodeInf
} }
const float volume = static_cast<float>(value) / 100.0f; const float volume = static_cast<float>(value) / 100.0f;
const bool userMute = m_mixerUserMute.value(nodeId, false); const bool userMute = m_mixerUserMute.value(nodeId, false);
if (m_mixerFaders[nodeId]->isSliderDown()) { if (m_mixerFaders[nodeId]->isSliderDown() || m_mixerFaders[nodeId]->property("pressValue").isValid()) {
if (!m_mixerStartState.contains(nodeId)) { if (!m_mixerStartState.contains(nodeId)) {
const NodeVolumeState previous = m_mixerLastState.value(nodeId, NodeVolumeState{volume, userMute}); const NodeVolumeState previous = m_mixerLastState.value(nodeId, NodeVolumeState{volume, userMute});
m_mixerStartState.insert(nodeId, previous); m_mixerStartState.insert(nodeId, previous);
@ -932,6 +932,7 @@ void GraphEditorWidget::refreshMixerStrip(uint32_t nodeId, const Potato::NodeInf
if (!m_mixerFaders.contains(nodeId)) { if (!m_mixerFaders.contains(nodeId)) {
return; return;
} }
m_mixerFaders[nodeId]->setProperty("pressValue", QVariant());
const float volume = static_cast<float>(m_mixerFaders[nodeId]->value()) / 100.0f; const float volume = static_cast<float>(m_mixerFaders[nodeId]->value()) / 100.0f;
const bool userMute = m_mixerUserMute.value(nodeId, false); const bool userMute = m_mixerUserMute.value(nodeId, false);
const NodeVolumeState previous = m_mixerStartState.value(nodeId, m_mixerLastState.value(nodeId, NodeVolumeState{volume, userMute})); const NodeVolumeState previous = m_mixerStartState.value(nodeId, m_mixerLastState.value(nodeId, NodeVolumeState{volume, userMute}));

View file

@ -162,7 +162,9 @@ QWidget *PipeWireGraphModel::nodeWidget(QtNodes::NodeId nodeId) const
m_controller->setNodeVolume(pipewireId, volume, next.mute); m_controller->setNodeVolume(pipewireId, volume, next.mute);
auto *self = const_cast<PipeWireGraphModel*>(this); auto *self = const_cast<PipeWireGraphModel*>(this);
self->setNodeVolumeState(pipewireId, next, false); self->setNodeVolumeState(pipewireId, next, false);
if (!slider->isSliderDown() && !m_inlineStartState.contains(pipewireId)) { if (!slider->isSliderDown()
&& !m_inlineStartState.contains(pipewireId)
&& !slider->property("pressValue").isValid()) {
self->emitNodeVolumeChanged(pipewireId, previous, next); self->emitNodeVolumeChanged(pipewireId, previous, next);
} }
}; };
@ -186,6 +188,7 @@ QWidget *PipeWireGraphModel::nodeWidget(QtNodes::NodeId nodeId) const
} }
const NodeVolumeState previous = m_inlineStartState.value(pipewireId, m_nodeVolumeState.value(pipewireId)); const NodeVolumeState previous = m_inlineStartState.value(pipewireId, m_nodeVolumeState.value(pipewireId));
m_inlineStartState.remove(pipewireId); m_inlineStartState.remove(pipewireId);
slider->setProperty("pressValue", QVariant());
const float volume = static_cast<float>(slider->value()) / 100.0f; const float volume = static_cast<float>(slider->value()) / 100.0f;
const NodeVolumeState next{volume, muteButton->isChecked()}; const NodeVolumeState next{volume, muteButton->isChecked()};
auto *self = const_cast<PipeWireGraphModel*>(this); auto *self = const_cast<PipeWireGraphModel*>(this);