More tests

This commit is contained in:
Joey Yakimowich-Payne 2026-02-06 11:07:01 -07:00
commit 69d9a9e3f1
5 changed files with 742 additions and 27 deletions

View file

@ -647,6 +647,11 @@ GraphEditorWidget::GraphEditorWidget(warppipe::Client *client,
void GraphEditorWidget::onRefreshTimer() {
m_model->refreshFromClient();
if (m_scene &&
m_scene->itemIndexMethod() != QGraphicsScene::BspTreeIndex) {
m_scene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);
}
if (!m_graphReady && m_model->allNodeIds().size() > 0) {
m_graphReady = true;
Q_EMIT graphReady();
@ -688,6 +693,45 @@ int GraphEditorWidget::linkCount() const {
return count / 2;
}
QAction *GraphEditorWidget::execMenuAction(QMenu &menu,
const QPoint &screenPos) {
return menu.exec(screenPos);
}
QString GraphEditorWidget::promptTextInput(const QString &title,
const QString &label,
bool *ok) {
return QInputDialog::getText(this,
title,
label,
QLineEdit::Normal,
QString(),
ok);
}
QString GraphEditorWidget::chooseSaveFilePath(const QString &title,
const QString &initialDir,
const QString &filter) {
return QFileDialog::getSaveFileName(this,
title,
initialDir,
filter);
}
QString GraphEditorWidget::chooseOpenFilePath(const QString &title,
const QString &initialDir,
const QString &filter) {
return QFileDialog::getOpenFileName(this,
title,
initialDir,
filter);
}
void GraphEditorWidget::showWarningDialog(const QString &title,
const QString &message) {
QMessageBox::warning(this, title, message);
}
void GraphEditorWidget::setDebugScreenshotDir(const QString &dir) {
m_debugScreenshotDir = dir;
QDir d(dir);
@ -830,7 +874,7 @@ void GraphEditorWidget::showCanvasContextMenu(const QPoint &screenPos,
QAction *savePresetAction = menu.addAction(QStringLiteral("Save Preset..."));
QAction *loadPresetAction = menu.addAction(QStringLiteral("Load Preset..."));
QAction *chosen = menu.exec(screenPos);
QAction *chosen = execMenuAction(menu, screenPos);
if (chosen == createSink) {
createVirtualNode(true, scenePos);
} else if (chosen == createSource) {
@ -922,7 +966,7 @@ void GraphEditorWidget::showNodeContextMenu(const QPoint &screenPos,
QStringLiteral(
"application/warppipe-virtual-graph"))));
QAction *chosen = menu.exec(screenPos);
QAction *chosen = execMenuAction(menu, screenPos);
if (!chosen) {
return;
}
@ -949,9 +993,9 @@ void GraphEditorWidget::createVirtualNode(bool isSink,
const QPointF &scenePos) {
if (isSink) {
bool ok = false;
QString name = QInputDialog::getText(
this, QStringLiteral("Create Virtual Sink"),
QStringLiteral("Node name:"), QLineEdit::Normal, QString(), &ok);
QString name = promptTextInput(QStringLiteral("Create Virtual Sink"),
QStringLiteral("Node name:"),
&ok);
if (!ok || name.trimmed().isEmpty())
return;
@ -959,8 +1003,8 @@ void GraphEditorWidget::createVirtualNode(bool isSink,
m_model->setPendingPosition(nodeName, scenePos);
auto result = m_client->CreateVirtualSink(nodeName);
if (!result.status.ok()) {
QMessageBox::warning(this, QStringLiteral("Error"),
QString::fromStdString(result.status.message));
showWarningDialog(QStringLiteral("Error"),
QString::fromStdString(result.status.message));
return;
}
m_model->refreshFromClient();
@ -1034,8 +1078,8 @@ void GraphEditorWidget::createVirtualNode(bool isSink,
QString name = nameEdit->text().trimmed();
if (name.isEmpty()) {
QMessageBox::warning(this, QStringLiteral("Error"),
QStringLiteral("Name cannot be empty."));
showWarningDialog(QStringLiteral("Error"),
QStringLiteral("Name cannot be empty."));
return;
}
@ -1050,8 +1094,8 @@ void GraphEditorWidget::createVirtualNode(bool isSink,
auto result = m_client->CreateVirtualSource(nodeName, opts);
if (!result.status.ok()) {
QMessageBox::warning(this, QStringLiteral("Error"),
QString::fromStdString(result.status.message));
showWarningDialog(QStringLiteral("Error"),
QString::fromStdString(result.status.message));
return;
}
m_model->refreshFromClient();
@ -1415,9 +1459,9 @@ void GraphEditorWidget::savePreset() {
if (!dir.exists())
dir.mkpath(".");
QString path = QFileDialog::getSaveFileName(
this, QStringLiteral("Save Preset"), m_presetDir,
QStringLiteral("JSON files (*.json)"));
QString path = chooseSaveFilePath(QStringLiteral("Save Preset"),
m_presetDir,
QStringLiteral("JSON files (*.json)"));
if (path.isEmpty())
return;
if (!path.endsWith(QStringLiteral(".json"), Qt::CaseInsensitive))
@ -1428,15 +1472,15 @@ void GraphEditorWidget::savePreset() {
mw->statusBar()->showMessage(
QStringLiteral("Preset saved: ") + QFileInfo(path).fileName(), 4000);
} else {
QMessageBox::warning(this, QStringLiteral("Error"),
QStringLiteral("Failed to save preset."));
showWarningDialog(QStringLiteral("Error"),
QStringLiteral("Failed to save preset."));
}
}
void GraphEditorWidget::loadPreset() {
QString path = QFileDialog::getOpenFileName(
this, QStringLiteral("Load Preset"), m_presetDir,
QStringLiteral("JSON files (*.json)"));
QString path = chooseOpenFilePath(QStringLiteral("Load Preset"),
m_presetDir,
QStringLiteral("JSON files (*.json)"));
if (path.isEmpty())
return;
@ -1445,8 +1489,8 @@ void GraphEditorWidget::loadPreset() {
mw->statusBar()->showMessage(
QStringLiteral("Preset loaded: ") + QFileInfo(path).fileName(), 4000);
} else {
QMessageBox::warning(this, QStringLiteral("Error"),
QStringLiteral("Failed to load preset."));
showWarningDialog(QStringLiteral("Error"),
QStringLiteral("Failed to load preset."));
}
}

View file

@ -27,6 +27,8 @@ class QSplitter;
class QTabWidget;
class QSlider;
class QTimer;
class QAction;
class QMenu;
class DeleteVirtualNodeCommand;
enum class ConnectionStyleType : uint8_t {
@ -59,6 +61,20 @@ private slots:
void onContextMenuRequested(const QPoint &pos);
void scheduleSaveLayout();
protected:
virtual QAction *execMenuAction(QMenu &menu, const QPoint &screenPos);
virtual QString promptTextInput(const QString &title,
const QString &label,
bool *ok);
virtual QString chooseSaveFilePath(const QString &title,
const QString &initialDir,
const QString &filter);
virtual QString chooseOpenFilePath(const QString &title,
const QString &initialDir,
const QString &filter);
virtual void showWarningDialog(const QString &title,
const QString &message);
private:
void showCanvasContextMenu(const QPoint &screenPos, const QPointF &scenePos);
void showNodeContextMenu(const QPoint &screenPos, uint32_t pwNodeId,

View file

@ -9,8 +9,6 @@
#include <QScrollBar>
#include <QWheelEvent>
#include <QtNodes/internal/ConnectionGraphicsObject.hpp>
#include <cmath>
class ZoomGraphicsView : public QtNodes::GraphicsView {
@ -41,8 +39,7 @@ public:
auto cacheMode = highZoom ? QGraphicsItem::DeviceCoordinateCache
: QGraphicsItem::NoCache;
for (QGraphicsItem *item : scene()->items()) {
if (item->type() == QGraphicsProxyWidget::Type ||
item->type() == QtNodes::ConnectionGraphicsObject::Type)
if (item->type() == QGraphicsProxyWidget::Type)
item->setCacheMode(cacheMode);
}
}