From f4132ee37cf8bc5b04c373f9849e6edc1d90fae9 Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Wed, 28 Jan 2026 12:55:02 -0700 Subject: [PATCH] Almost context location --- src/gui/GraphEditorWidget.cpp | 24 ++++++++++++++++++++---- src/gui/GraphEditorWidget.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/gui/GraphEditorWidget.cpp b/src/gui/GraphEditorWidget.cpp index 42d7037..0963c45 100644 --- a/src/gui/GraphEditorWidget.cpp +++ b/src/gui/GraphEditorWidget.cpp @@ -472,23 +472,33 @@ GraphEditorWidget::GraphEditorWidget(Potato::PipeWireController *controller, QWi m_view->addAction(loadPresetAction); auto *createVirtualSinkAction = new QAction(QString("Create Virtual Sink"), m_view); + createVirtualSinkAction->setShortcutContext(Qt::WidgetShortcut); connect(createVirtualSinkAction, &QAction::triggered, [this]() { const int index = ++m_virtualSinkCount; const QString name = QString("Potato_Virtual_Sink_%1").arg(index); const QString description = QString("Virtual Sink %1").arg(index); + + m_pendingPastePositions.insert(name, m_lastContextMenuPos); + if (!m_controller->createVirtualSink(name, description, 2, 48000)) { qWarning() << "Failed to create virtual sink" << name; + m_pendingPastePositions.remove(name); } }); m_view->addAction(createVirtualSinkAction); auto *createVirtualSourceAction = new QAction(QString("Create Virtual Source"), m_view); + createVirtualSourceAction->setShortcutContext(Qt::WidgetShortcut); connect(createVirtualSourceAction, &QAction::triggered, [this]() { const int index = ++m_virtualSourceCount; const QString name = QString("Potato_Virtual_Source_%1").arg(index); const QString description = QString("Virtual Source %1").arg(index); + + m_pendingPastePositions.insert(name, m_lastContextMenuPos); + if (!m_controller->createVirtualSource(name, description, 2, 48000)) { qWarning() << "Failed to create virtual source" << name; + m_pendingPastePositions.remove(name); } }); m_view->addAction(createVirtualSourceAction); @@ -1048,12 +1058,18 @@ void GraphEditorWidget::updateNodeMeterLabel(QLabel *label) bool GraphEditorWidget::eventFilter(QObject *object, QEvent *event) { - if (auto *label = qobject_cast(object)) { - if (event->type() == QEvent::Resize || event->type() == QEvent::Show) { - updateNodeMeterLabel(label); + if (object == m_view->viewport()) { + if (event->type() == QEvent::MouseButtonPress) { + QMouseEvent *mouseEvent = static_cast(event); + if (mouseEvent->button() == Qt::MiddleButton) { + m_view->centerOn(m_view->mapToScene(mouseEvent->pos())); + return true; + } + } else if (event->type() == QEvent::ContextMenu) { + QContextMenuEvent *contextEvent = static_cast(event); + m_lastContextMenuPos = m_view->mapToScene(contextEvent->pos()); } } - return QWidget::eventFilter(object, event); } diff --git a/src/gui/GraphEditorWidget.h b/src/gui/GraphEditorWidget.h index 2580504..7f5e37c 100644 --- a/src/gui/GraphEditorWidget.h +++ b/src/gui/GraphEditorWidget.h @@ -134,4 +134,5 @@ private: int m_meterProfileFrames = 0; PresetManager *m_presetManager = nullptr; bool m_ignoreVolumeUndo = false; + QPointF m_lastContextMenuPos; };