Skip to content

Commit 97a9b62

Browse files
committed
Add save load interface functions to AbstractModel
1 parent 7498fd4 commit 97a9b62

File tree

6 files changed

+138
-29
lines changed

6 files changed

+138
-29
lines changed

examples/graph/CustomGraphModel.cpp

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
CustomGraphModel::
55
CustomGraphModel()
6-
: _lastNodeId{0}
6+
: _nextNodeId{0}
77
{}
88

99

@@ -105,7 +105,7 @@ NodeId
105105
CustomGraphModel::
106106
addNode(QString const nodeType)
107107
{
108-
NodeId newId = _lastNodeId++;
108+
NodeId newId = _nextNodeId++;
109109
// Create new node.
110110
_nodeIds.insert(newId);
111111

@@ -388,3 +388,71 @@ deleteNode(NodeId const nodeId)
388388

389389
return true;
390390
}
391+
392+
393+
QJsonObject
394+
CustomGraphModel::
395+
saveNode(NodeId const nodeId) const
396+
{
397+
QJsonObject nodeJson;
398+
399+
nodeJson["id"] = static_cast<qint64>(nodeId);
400+
401+
QPointF const pos =
402+
nodeData(nodeId, NodeRole::Position).value<QPointF>();
403+
404+
QJsonObject posJson;
405+
posJson["x"] = pos.x();
406+
posJson["y"] = pos.y();
407+
nodeJson["position"] = posJson;
408+
409+
return nodeJson;
410+
}
411+
412+
413+
void
414+
CustomGraphModel::
415+
loadNode(QJsonObject const & nodeJson)
416+
{
417+
NodeId nodeId = static_cast<NodeId>(nodeJson["id"].toInt());
418+
419+
_nextNodeId = std::max(_nextNodeId, nodeId);
420+
421+
NodeId newId = addNode();
422+
423+
QJsonObject posJson = nodeJson["position"].toObject();
424+
QPointF const pos(posJson["x"].toInt(),
425+
posJson["y"].toInt());
426+
427+
setNodeData(newId,
428+
NodeRole::Position,
429+
pos);
430+
}
431+
432+
433+
QJsonObject
434+
CustomGraphModel::
435+
saveConnection(ConnectionId const & connId) const
436+
{
437+
QJsonObject connJson;
438+
439+
connJson["outNodeId"] = static_cast<qint64>(connId.outNodeId);
440+
connJson["outPortIndex"] = static_cast<qint64>(connId.outPortIndex);
441+
connJson["intNodeId"] = static_cast<qint64>(connId.inNodeId);
442+
connJson["inPortIndex"] = static_cast<qint64>(connId.inPortIndex);
443+
444+
return connJson;
445+
}
446+
447+
448+
void
449+
CustomGraphModel::
450+
loadConnection(QJsonObject const & connJson)
451+
{
452+
ConnectionId connId{connJson["outNodeId"].toInt(),
453+
connJson["outPortIndex"].toInt(),
454+
connJson["intNodeId"].toInt(),
455+
connJson["inPortIndex"].toInt()};
456+
457+
addConnection(connId);
458+
}

examples/graph/CustomGraphModel.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <QtCore/QPointF>
44
#include <QtCore/QSize>
5+
#include <QtCore/QJsonObject>
56

67
#include <QtNodes/AbstractGraphModel>
78
#include <QtNodes/StyleCollection>
@@ -95,6 +96,18 @@ class CustomGraphModel : public QtNodes::AbstractGraphModel
9596
bool
9697
deleteNode(NodeId const nodeId) override;
9798

99+
QJsonObject
100+
saveNode(NodeId const) const override;
101+
102+
void
103+
loadNode(QJsonObject const & nodeJson) override;
104+
105+
QJsonObject
106+
saveConnection(ConnectionId const & connId) const override;
107+
108+
void
109+
loadConnection(QJsonObject const & connJson) override;
110+
98111
private:
99112

100113
std::unordered_set<NodeId> _nodeIds;
@@ -108,6 +121,6 @@ class CustomGraphModel : public QtNodes::AbstractGraphModel
108121
_nodeGeometryData;
109122

110123

111-
unsigned int _lastNodeId;
124+
unsigned int _nextNodeId;
112125

113126
};

include/QtNodes/internal/AbstractGraphModel.hpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,30 @@ class NODE_EDITOR_PUBLIC AbstractGraphModel : public QObject
160160
bool
161161
deleteNode(NodeId const nodeId) = 0;
162162

163+
/**
164+
* Reimplement the function if you want to store/restore the node's
165+
* inner state during undo/redo node deletion operations.
166+
*/
167+
virtual
168+
QJsonObject
169+
saveNode(NodeId const) const = 0;
170+
171+
/**
172+
* Reimplement the function if you want to store/restore the node's
173+
* inner state during undo/redo node deletion operations.
174+
*/
175+
virtual
176+
void
177+
loadNode(QJsonObject const & nodeJson) = 0;
178+
179+
virtual
180+
QJsonObject
181+
saveConnection(ConnectionId const & connId) const = 0;
182+
183+
virtual
184+
void
185+
loadConnection(QJsonObject const & connJson) = 0;
186+
163187
Q_SIGNALS:
164188

165189
void

include/QtNodes/internal/DataFlowGraphModel.hpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,19 @@ class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel
9393

9494
void
9595
load(QJsonDocument const &json);
96+
97+
QJsonObject
98+
saveNode(NodeId const) const override;
99+
100+
void
101+
loadNode(QJsonObject const & nodeJson) override;
102+
103+
QJsonObject
104+
saveConnection(ConnectionId const & connId) const override;
105+
106+
void
107+
loadConnection(QJsonObject const & connJson) override;
108+
96109
private:
97110

98111
NodeId
@@ -105,23 +118,10 @@ class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel
105118
NodeId
106119
newNodeId(NodeId const restoredNodeId)
107120
{
108-
_nextNodeId = restoredNodeId;
109-
return _nextNodeId++;
121+
_nextNodeId = std::max(_nextNodeId, restoredNodeId);
122+
return restoredNodeId;
110123
}
111124

112-
113-
QJsonObject
114-
saveNode(NodeId const) const;
115-
116-
void
117-
loadNode(QJsonObject const & nodeJson);
118-
119-
QJsonObject
120-
saveConnection(ConnectionId const & connId) const;
121-
122-
void
123-
loadConnection(QJsonObject const & connJson);
124-
125125
private Q_SLOTS:
126126
/**
127127
* Fuction is called by NodeDelegateModel when a node has new data to

include/QtNodes/internal/GraphicsView.hpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,16 @@ class NODE_EDITOR_PUBLIC GraphicsView
3434
centerScene();
3535

3636
public Q_SLOTS:
37-
3837
void
3938
scaleUp();
4039

4140
void
4241
scaleDown();
4342

4443
void
45-
deleteSelectedObjects();
44+
onDeleteSelectedObjects();
4645

4746
protected:
48-
4947
void
5048
contextMenuEvent(QContextMenuEvent *event) override;
5149

@@ -71,12 +69,10 @@ public Q_SLOTS:
7169
showEvent(QShowEvent *event) override;
7270

7371
protected:
74-
7572
BasicGraphicsScene *
7673
nodeScene();
7774

7875
private:
79-
8076
QAction* _clearSelectionAction;
8177
QAction* _deleteSelectionAction;
8278

src/GraphicsView.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,25 @@ setScene(BasicGraphicsScene *scene)
8383
delete _clearSelectionAction;
8484
_clearSelectionAction = new QAction(QStringLiteral("Clear Selection"), this);
8585
_clearSelectionAction->setShortcut(Qt::Key_Escape);
86-
connect(_clearSelectionAction, &QAction::triggered,
87-
scene, &QGraphicsScene::clearSelection);
86+
87+
connect(_clearSelectionAction,
88+
&QAction::triggered,
89+
scene,
90+
&QGraphicsScene::clearSelection);
91+
8892
addAction(_clearSelectionAction);
8993

94+
95+
9096
delete _deleteSelectionAction;
9197
_deleteSelectionAction = new QAction(QStringLiteral("Delete Selection"), this);
9298
_deleteSelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut);
9399
_deleteSelectionAction->setShortcut(QKeySequence(QKeySequence::Delete));
94-
connect(_deleteSelectionAction, &QAction::triggered,
95-
this, &GraphicsView::deleteSelectedObjects);
100+
connect(_deleteSelectionAction,
101+
&QAction::triggered,
102+
this,
103+
&GraphicsView::onDeleteSelectedObjects);
104+
96105
addAction(_deleteSelectionAction);
97106
}
98107

@@ -189,7 +198,7 @@ scaleDown()
189198

190199
void
191200
GraphicsView::
192-
deleteSelectedObjects()
201+
onDeleteSelectedObjects()
193202
{
194203
// Delete the selected connections first, ensuring that they won't be
195204
// automatically deleted when selected nodes are deleted (deleting a
@@ -348,4 +357,3 @@ nodeScene()
348357
{
349358
return dynamic_cast<BasicGraphicsScene*>(scene());
350359
}
351-

0 commit comments

Comments
 (0)