Fix virtual nodes
This commit is contained in:
parent
9f33bcd017
commit
1dd4ef7327
7 changed files with 113 additions and 22 deletions
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <QAction>
|
||||
#include <QClipboard>
|
||||
#include <QContextMenuEvent>
|
||||
#include <QDateTime>
|
||||
#include <QDir>
|
||||
#include <QGraphicsItem>
|
||||
|
|
@ -135,6 +136,9 @@ GraphEditorWidget::GraphEditorWidget(warppipe::Client *client,
|
|||
}})");
|
||||
|
||||
m_view = new QtNodes::GraphicsView(m_scene);
|
||||
m_view->setFocusPolicy(Qt::StrongFocus);
|
||||
m_view->viewport()->setFocusPolicy(Qt::StrongFocus);
|
||||
m_view->viewport()->installEventFilter(this);
|
||||
|
||||
auto *layout = new QVBoxLayout(this);
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
|
|
@ -292,10 +296,21 @@ void GraphEditorWidget::captureDebugScreenshot(const QString &event) {
|
|||
pixmap.save(m_debugScreenshotDir + "/" + filename);
|
||||
}
|
||||
|
||||
bool GraphEditorWidget::eventFilter(QObject *obj, QEvent *event) {
|
||||
if (obj == m_view->viewport() &&
|
||||
event->type() == QEvent::ContextMenu) {
|
||||
auto *cme = static_cast<QContextMenuEvent *>(event);
|
||||
m_lastContextMenuScenePos = m_view->mapToScene(cme->pos());
|
||||
}
|
||||
return QWidget::eventFilter(obj, event);
|
||||
}
|
||||
|
||||
void GraphEditorWidget::onContextMenuRequested(const QPoint &pos) {
|
||||
QPointF scenePos = m_view->mapToScene(pos);
|
||||
m_lastContextMenuScenePos = scenePos;
|
||||
|
||||
uint32_t hitPwNodeId = 0;
|
||||
QtNodes::NodeId hitQtNodeId = 0;
|
||||
for (auto nodeId : m_model->allNodeIds()) {
|
||||
const WarpNodeData *data = m_model->warpNodeData(nodeId);
|
||||
if (!data) {
|
||||
|
|
@ -308,13 +323,14 @@ void GraphEditorWidget::onContextMenuRequested(const QPoint &pos) {
|
|||
QRectF nodeRect(nodePos, QSizeF(nodeSize));
|
||||
if (nodeRect.contains(scenePos)) {
|
||||
hitPwNodeId = data->info.id.value;
|
||||
hitQtNodeId = nodeId;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QPoint screenPos = m_view->mapToGlobal(pos);
|
||||
if (hitPwNodeId != 0) {
|
||||
showNodeContextMenu(screenPos, hitPwNodeId);
|
||||
showNodeContextMenu(screenPos, hitPwNodeId, hitQtNodeId);
|
||||
} else {
|
||||
showCanvasContextMenu(screenPos, scenePos);
|
||||
}
|
||||
|
|
@ -327,6 +343,14 @@ void GraphEditorWidget::showCanvasContextMenu(const QPoint &screenPos,
|
|||
QAction *createSource =
|
||||
menu.addAction(QStringLiteral("Create Virtual Source"));
|
||||
menu.addSeparator();
|
||||
QAction *pasteAction = menu.addAction(QStringLiteral("Paste"));
|
||||
pasteAction->setShortcut(QKeySequence::Paste);
|
||||
pasteAction->setEnabled(!m_clipboardJson.isEmpty() ||
|
||||
(QGuiApplication::clipboard()->mimeData() &&
|
||||
QGuiApplication::clipboard()->mimeData()->hasFormat(
|
||||
QStringLiteral(
|
||||
"application/warppipe-virtual-graph"))));
|
||||
menu.addSeparator();
|
||||
QAction *autoArrange = menu.addAction(QStringLiteral("Auto-Arrange"));
|
||||
|
||||
QAction *chosen = menu.exec(screenPos);
|
||||
|
|
@ -334,15 +358,17 @@ void GraphEditorWidget::showCanvasContextMenu(const QPoint &screenPos,
|
|||
createVirtualNode(true, scenePos);
|
||||
} else if (chosen == createSource) {
|
||||
createVirtualNode(false, scenePos);
|
||||
} else if (chosen == pasteAction) {
|
||||
pasteSelection(QPointF(0, 0));
|
||||
} else if (chosen == autoArrange) {
|
||||
m_model->autoArrange();
|
||||
}
|
||||
}
|
||||
|
||||
void GraphEditorWidget::showNodeContextMenu(const QPoint &screenPos,
|
||||
uint32_t pwNodeId) {
|
||||
QtNodes::NodeId qtId = m_model->qtNodeIdForPw(pwNodeId);
|
||||
const WarpNodeData *data = m_model->warpNodeData(qtId);
|
||||
uint32_t pwNodeId,
|
||||
QtNodes::NodeId qtNodeId) {
|
||||
const WarpNodeData *data = m_model->warpNodeData(qtNodeId);
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -351,17 +377,42 @@ void GraphEditorWidget::showNodeContextMenu(const QPoint &screenPos,
|
|||
bool isVirtual =
|
||||
type == WarpNodeType::kVirtualSink || type == WarpNodeType::kVirtualSource;
|
||||
|
||||
if (!isVirtual) {
|
||||
return;
|
||||
QMenu menu;
|
||||
|
||||
QAction *copyAction = nullptr;
|
||||
QAction *duplicateAction = nullptr;
|
||||
QAction *deleteAction = nullptr;
|
||||
|
||||
if (isVirtual) {
|
||||
copyAction = menu.addAction(QStringLiteral("Copy"));
|
||||
copyAction->setShortcut(QKeySequence::Copy);
|
||||
duplicateAction = menu.addAction(QStringLiteral("Duplicate"));
|
||||
duplicateAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_D));
|
||||
menu.addSeparator();
|
||||
deleteAction = menu.addAction(QStringLiteral("Delete"));
|
||||
deleteAction->setShortcut(QKeySequence::Delete);
|
||||
}
|
||||
|
||||
QMenu menu;
|
||||
QAction *deleteAction = menu.addAction(QStringLiteral("Delete Node"));
|
||||
QAction *pasteAction = menu.addAction(QStringLiteral("Paste"));
|
||||
pasteAction->setShortcut(QKeySequence::Paste);
|
||||
pasteAction->setEnabled(!m_clipboardJson.isEmpty() ||
|
||||
(QGuiApplication::clipboard()->mimeData() &&
|
||||
QGuiApplication::clipboard()->mimeData()->hasFormat(
|
||||
QStringLiteral(
|
||||
"application/warppipe-virtual-graph"))));
|
||||
|
||||
QAction *chosen = menu.exec(screenPos);
|
||||
if (chosen == deleteAction && m_client) {
|
||||
m_client->RemoveNode(warppipe::NodeId{pwNodeId});
|
||||
m_model->refreshFromClient();
|
||||
if (!chosen) {
|
||||
return;
|
||||
}
|
||||
if (chosen == copyAction) {
|
||||
copySelection();
|
||||
} else if (chosen == duplicateAction) {
|
||||
duplicateSelection();
|
||||
} else if (chosen == deleteAction && m_client) {
|
||||
deleteSelection();
|
||||
} else if (chosen == pasteAction) {
|
||||
pasteSelection(QPointF(0, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue