/
scene.cpp
97 lines (83 loc) · 2.41 KB
/
scene.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "scene.h"
#include "node.h"
#include <QGraphicsSceneMouseEvent>
#include <QDebug>
Scene::Scene(QObject *parent) :
QGraphicsScene(parent)
{
setSceneRect(0, 0, 800, 600);
}
void Scene::setNodesInteractable(bool interactable)
{
_nodesInteractable = interactable;
for (auto item : items()) {
auto nodeItem = dynamic_cast<Node *>(item);
if (nodeItem) {
nodeItem->setInteractable(interactable);
}
}
}
Graph Scene::buildGraph() const
{
Graph g;
for (auto item : items()) {
auto node = dynamic_cast<Node *>(item);
if (node) {
GraphNode graphNode;
graphNode.index = node->index();
graphNode.weight = node->number();
g.addNode(graphNode);
}
}
for (auto item : items()) {
auto edge = dynamic_cast<Edge *>(item);
if (edge) {
auto &startGraphNode = g[edge->startNode()->index()];
auto &endGraphNode = g[edge->endNode()->index()];
if (startGraphNode.index != 0 && endGraphNode.index != 0) {
endGraphNode.addParent(startGraphNode.index);
}
}
}
return g;
}
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
if (!_nodesInteractable) {
auto item = itemAt(e->scenePos(), QTransform());
auto nodeItem = dynamic_cast<Node *>(item);
if (nodeItem) {
_currentEdge = new Edge(nodeItem);
addItem(_currentEdge);
}
}
QGraphicsScene::mousePressEvent(e);
}
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
if (!_nodesInteractable && _currentEdge) {
_currentEdge->setEndPoint(e->scenePos());
}
QGraphicsScene::mouseMoveEvent(e);
}
void Scene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
auto hoverItem = itemAt(e->scenePos(), QTransform());
if (!hoverItem && _nodesInteractable) {
auto node = new Node;
node->setInteractable(_nodesInteractable);
node->setSelected(true);
node->setPos(e->scenePos());
addItem(node);
} else if (!_nodesInteractable && _currentEdge) {
auto nodeItem = dynamic_cast<Node *>(hoverItem);
if (nodeItem) {
_currentEdge->setEndNode(nodeItem);
} else {
removeItem(_currentEdge);
delete _currentEdge;
}
_currentEdge = nullptr;
}
QGraphicsScene::mouseReleaseEvent(e);
}