Skip to content

Commit c99b6a2

Browse files
zmothpaceholder
authored andcommitted
Process unsuccessful Copy/Pase commands gracefully
1 parent 2bb8330 commit c99b6a2

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

src/DataFlowGraphModel.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#include <QJsonArray>
55

6+
#include <stdexcept>
7+
68
namespace QtNodes
79
{
810

@@ -564,6 +566,11 @@ loadNode(QJsonObject const & nodeJson)
564566

565567
_models[restoredNodeId]->load(internalDataJson);
566568
}
569+
else
570+
{
571+
throw std::logic_error(std::string("No registered model with name ") +
572+
delegateModelName.toLocal8Bit().data());
573+
}
567574
}
568575

569576

src/UndoCommands.cpp

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ insertSerializedItems(QJsonObject const & json,
9595

9696
// Restore the connection
9797
graphModel.addConnection(connId);
98+
99+
scene->connectionGraphicsObject(connId)->setSelected(true);
98100
}
99101
}
100102

@@ -297,6 +299,12 @@ CopyCommand(BasicGraphicsScene* scene)
297299
{
298300
QJsonObject sceneJson = serializeSelectedItems(scene);
299301

302+
if (sceneJson.empty() || sceneJson["nodes"].toArray().empty())
303+
{
304+
setObsolete(true);
305+
return;
306+
}
307+
300308
QClipboard * clipboard = QApplication::clipboard();
301309

302310
QByteArray const data = QJsonDocument(sceneJson).toJson();
@@ -324,6 +332,19 @@ PasteCommand(BasicGraphicsScene* scene,
324332
: _scene(scene)
325333
, _mouseScenePos(mouseScenePos)
326334
{
335+
_newSceneJson = takeSceneJsonFromClipboard();
336+
337+
if (_newSceneJson.empty() || _newSceneJson["nodes"].toArray().empty())
338+
{
339+
setObsolete(true);
340+
return;
341+
}
342+
343+
_newSceneJson = makeNewNodeIdsInScene(_newSceneJson);
344+
345+
QPointF averagePos = computeAverageNodePosition(_newSceneJson);
346+
347+
offsetNodeGroup(_newSceneJson, _mouseScenePos - averagePos);
327348
}
328349

329350

@@ -341,18 +362,28 @@ redo()
341362
{
342363
_scene->clearSelection();
343364

344-
_newSceneJson = takeSceneJsonFromClipboard();
345-
346-
if (_newSceneJson.empty())
347-
return;
348-
349-
_newSceneJson = makeNewNodeIdsInScene(_newSceneJson);
350-
351-
QPointF averagePos = computeAverageNodePosition(_newSceneJson);
365+
// Ignore if pasted in content does not generate nodes.
366+
try
367+
{
368+
insertSerializedItems(_newSceneJson, _scene);
369+
}
370+
catch(...)
371+
{
372+
// If the paste does not work, delete all selected nodes and connections
373+
// `deleteNode(...)` implicitly removed connections
374+
auto & graphModel = _scene->graphModel();
352375

353-
offsetNodeGroup(_newSceneJson, _mouseScenePos - averagePos);
376+
QJsonArray nodesJsonArray;
377+
for (QGraphicsItem * item : _scene->selectedItems())
378+
{
379+
if (auto n = qgraphicsitem_cast<NodeGraphicsObject*>(item))
380+
{
381+
graphModel.deleteNode(n->nodeId());
382+
}
383+
}
354384

355-
insertSerializedItems(_newSceneJson, _scene);
385+
setObsolete(true);
386+
}
356387
}
357388

358389

0 commit comments

Comments
 (0)