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
**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

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 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<float>(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}));

View file

@ -162,7 +162,9 @@ QWidget *PipeWireGraphModel::nodeWidget(QtNodes::NodeId nodeId) const
m_controller->setNodeVolume(pipewireId, volume, next.mute);
auto *self = const_cast<PipeWireGraphModel*>(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<float>(slider->value()) / 100.0f;
const NodeVolumeState next{volume, muteButton->isChecked()};
auto *self = const_cast<PipeWireGraphModel*>(this);