/
mainctrl.cpp
131 lines (107 loc) · 3.98 KB
/
mainctrl.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "mainctrl.h"
#include <QDebug>
#include <cstdlib>
#include "nodectrl.h"
#include "propertyeditor.h"
#include "zodiacgraph/nodehandle.h"
QString MainCtrl::s_defaultName = "Node ";
MainCtrl::MainCtrl(QObject *parent, zodiac::Scene* scene, PropertyEditor* propertyEditor)
: QObject(parent)
, m_scene(zodiac::SceneHandle(scene))
, m_propertyEditor(propertyEditor)
, m_nodes(QHash<zodiac::NodeHandle, NodeCtrl*>())
, m_nodeIndex(1) // name suffixes start at 1
{
m_propertyEditor->setMainCtrl(this);
connect(&m_scene, SIGNAL(selectionChanged(QList<zodiac::NodeHandle>)),
this, SLOT(selectionChanged(QList<zodiac::NodeHandle>)));
}
NodeCtrl* MainCtrl::createNode(const QString& name)
{
// the newly created Node is the only selected one to avoid confusion
m_scene.deselectAll();
// use the given name or construct a default one
QString nodeName = name;
if(nodeName.isEmpty()){
nodeName = s_defaultName + QString::number(m_nodeIndex++);
}
// create the node
NodeCtrl* nodeCtrl = new NodeCtrl(this, m_scene.createNode(nodeName));
m_nodes.insert(nodeCtrl->getNodeHandle(), nodeCtrl);
return nodeCtrl;
}
bool MainCtrl::deleteNode(NodeCtrl* node)
{
#ifdef QT_DEBUG
Q_ASSERT(m_nodes.contains(node->getNodeHandle()));
#else
if(!m_nodes.contains(node->getNodeHandle())){
return false;
}
#endif
if(!node->isRemovable()){
// nodes with connections cannot be deleted
return false;
}
// disconnect and delete the node
node->disconnect();
zodiac::NodeHandle handle = node->getNodeHandle();
m_nodes.remove(handle);
bool result = handle.remove();
Q_ASSERT(result);
return result;
}
void MainCtrl::printZodiacScene()
{
QList<zodiac::NodeHandle> allNodes = m_nodes.keys();
for(zodiac::NodeHandle node : allNodes){
int number = node.getName().right(2).trimmed().toInt();
QString nodeCtrl = "nodeCtrl" + QString::number(number);
QPointF pos = node.getPos();
qDebug() << "NodeCtrl* nodeCtrl" + QString::number(number) + " = mainCtrl->createNode(\"" + node.getName() + "\");";
qDebug() << nodeCtrl + "->getNodeHandle().setPos(" + QString::number(pos.x()) + ", " + QString::number(pos.y()) + ");";
for(zodiac::PlugHandle plug : node.getPlugs()){
if(plug.isIncoming()){
qDebug() << nodeCtrl + "->addIncomingPlug(\"" + plug.getName() + "\");";
} else {
qDebug() << nodeCtrl + "->addOutgoingPlug(\"" + plug.getName() + "\");";
}
}
qDebug() << ""; // newline
}
for(zodiac::NodeHandle node : allNodes){
int number = node.getName().right(2).trimmed().toInt();
QString nodeCtrl = "nodeCtrl" + QString::number(number);
for(zodiac::PlugHandle plug : node.getPlugs()){
if(plug.isIncoming()) continue;
for(zodiac::PlugHandle otherPlug : plug.getConnectedPlugs()){
int otherNumber = otherPlug.getNode().getName().right(2).trimmed().toInt();
QString otherNodeCtrl = "nodeCtrl" + QString::number(otherNumber);
qDebug() << nodeCtrl + "->getNodeHandle().getPlug(\"" + plug.getName() + "\").connectPlug(" + otherNodeCtrl + "->getNodeHandle().getPlug(\"" + otherPlug.getName() + "\"));";
}
}
}
}
bool MainCtrl::shutdown()
{
// do not receive any more signals from the scene handle
m_scene.disconnect();
return true;
}
void MainCtrl::createDefaultNode()
{
NodeCtrl* newNode = createNode();
// int plugCount = (qreal(qrand())/qreal(RAND_MAX))*12;
// for(int i = 0; i < plugCount + 4; ++i){
// if((qreal(qrand())/qreal(RAND_MAX))<0.5){
// newNode->addIncomingPlug("plug");
// } else {
// newNode->addOutgoingPlug("plug");
// }
// }
newNode->setSelected(true);
}
void MainCtrl::selectionChanged(QList<zodiac::NodeHandle> selection)
{
m_propertyEditor->showNodes(selection);
}