diff --git a/PROJECT_PLAN.md b/PROJECT_PLAN.md index d5a4a06..aa4a027 100644 --- a/PROJECT_PLAN.md +++ b/PROJECT_PLAN.md @@ -1238,8 +1238,8 @@ private: ### Milestone 6: Undo/Redo & Polish **Estimated Time:** 1-2 weeks -- [ ] Integrate QUndoStack for all graph operations -- [ ] Implement command classes for link, volume, node operations +- [x] Integrate QUndoStack for all graph operations +- [x] Implement command classes for link, volume, node operations - [ ] Add keyboard shortcuts (Delete, Ctrl+D, Ctrl+Z, etc.) - [ ] Implement context menus for nodes/canvas - [ ] Add copy/paste/duplicate functionality diff --git a/src/gui/GraphEditorWidget.cpp b/src/gui/GraphEditorWidget.cpp index 802661e..eecd3a4 100644 --- a/src/gui/GraphEditorWidget.cpp +++ b/src/gui/GraphEditorWidget.cpp @@ -904,7 +904,7 @@ void GraphEditorWidget::refreshMixerStrip(uint32_t nodeId, const Potato::NodeInf } const float volume = static_cast(value) / 100.0f; 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)) { const NodeVolumeState previous = m_mixerLastState.value(nodeId, NodeVolumeState{volume, userMute}); m_mixerStartState.insert(nodeId, previous); @@ -932,6 +932,7 @@ void GraphEditorWidget::refreshMixerStrip(uint32_t nodeId, const Potato::NodeInf if (!m_mixerFaders.contains(nodeId)) { return; } + m_mixerFaders[nodeId]->setProperty("pressValue", QVariant()); const float volume = static_cast(m_mixerFaders[nodeId]->value()) / 100.0f; const bool userMute = m_mixerUserMute.value(nodeId, false); const NodeVolumeState previous = m_mixerStartState.value(nodeId, m_mixerLastState.value(nodeId, NodeVolumeState{volume, userMute})); diff --git a/src/gui/PipeWireGraphModel.cpp b/src/gui/PipeWireGraphModel.cpp index de76004..a4973f1 100644 --- a/src/gui/PipeWireGraphModel.cpp +++ b/src/gui/PipeWireGraphModel.cpp @@ -162,7 +162,9 @@ QWidget *PipeWireGraphModel::nodeWidget(QtNodes::NodeId nodeId) const m_controller->setNodeVolume(pipewireId, volume, next.mute); auto *self = const_cast(this); 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); } }; @@ -186,6 +188,7 @@ QWidget *PipeWireGraphModel::nodeWidget(QtNodes::NodeId nodeId) const } const NodeVolumeState previous = m_inlineStartState.value(pipewireId, m_nodeVolumeState.value(pipewireId)); m_inlineStartState.remove(pipewireId); + slider->setProperty("pressValue", QVariant()); const float volume = static_cast(slider->value()) / 100.0f; const NodeVolumeState next{volume, muteButton->isChecked()}; auto *self = const_cast(this);