16 #include "qnstgraphicsbind.h"
18 std::map <Qnst::EntityType, QString> QnstView::mediaTypeToXMLStr =
20 (Qnst::Media,
"media")
21 (Qnst::Image,
"image")
22 (Qnst::Audio,
"audio")
23 (Qnst::Video,
"video")
24 (Qnst::Html,
"text/html")
25 (Qnst::NCL,
"application/x-ginga-NCL")
27 (Qnst::NCLua,
"application/x-ginga-NCLua")
28 (Qnst::Settings,
"application/x-ncl-settings");
30 QnstView::QnstView(QWidget* parent)
31 : QGraphicsView(parent)
39 _numScheduledScalings = 0;
53 lastLinkMouseOver = NULL;
56 for(
int i = Qnst::Node; i < Qnst::NoType; i += 1)
57 entityCounter[ (Qnst::EntityType) i ] = 0;
65 void QnstView::load(QString data)
67 qDebug() <<
"###########################################";
69 qDebug() <<
"###########################################";
71 QDomDocument* dom =
new QDomDocument();
72 dom->setContent(data);
74 QDomElement parent = dom->firstChildElement();
76 QDomNodeList list = parent.childNodes();
78 for (
unsigned int i = 0; i < list.length(); i++)
80 if (list.item(i).isElement())
82 QDomElement e = list.item(i).toElement();
88 for (
unsigned int i = 0; i < list.length(); i++)
90 if (list.item(i).isElement())
92 QDomElement e = list.item(i).toElement();
98 for (
unsigned int i = 0; i < list.length(); i++)
100 if (list.item(i).isElement())
102 QDomElement e = list.item(i).toElement();
104 if (e.nodeName() ==
"context" ||
105 e.nodeName() ==
"switch" ||
106 e.nodeName() ==
"body")
108 collapseCompositions(e, parent);
115 if (entity->isMedia())
117 qDebug() <<
"=========================================" << entity->getnstId();
124 deletePendingEntities();
127 void QnstView::collapseCompositions(QDomElement element, QDomElement parent)
129 QDomNodeList list = element.childNodes();
131 for (
unsigned int i = 0; i < list.length(); i++)
133 if (list.item(i).isElement())
135 QDomElement e = list.item(i).toElement();
137 if (e.nodeName() ==
"context" ||
138 e.nodeName() ==
"switch" ||
139 e.nodeName() ==
"body")
141 collapseCompositions(e, parent);
146 if (element.attribute(
"collapsed") ==
"1")
148 if(entities.contains(element.attribute(
"uid")))
155 c->setTop(element.attribute(
"top").toDouble());
156 c->setLeft(element.attribute(
"left").toDouble());
161 void QnstView::read(QDomElement element, QDomElement parent)
163 QMap<QString, QString> properties;
165 QString uid = element.attribute(
"uid");
170 properties[
"TYPE"] = element.nodeName();
171 QDomNamedNodeMap attributeMap = element.attributes();
174 for (
int i = 0; i < attributeMap.count(); ++i)
176 QDomNode attribute = attributeMap.item(i);
177 properties[attribute.nodeName()] = attribute.nodeValue();
181 if (element.nodeName() ==
"body" ||
182 element.nodeName() ==
"context" ||
183 element.nodeName() ==
"switch" ||
184 element.nodeName() ==
"media" ||
185 element.nodeName() ==
"port" ||
186 element.nodeName() ==
"switchPort" ||
187 element.nodeName() ==
"property" ||
188 element.nodeName() ==
"area")
190 if(element.nodeName() ==
"body")
191 addEntity(uid,
"", properties,
true);
193 addEntity(uid, parent.attribute(
"uid"), properties,
true,
false);
195 else if (element.nodeName() ==
"interfaceReference")
201 else if (element.nodeName() ==
"nodeReference")
203 refers[element.attribute(
"nodeReferUID")] =
204 element.attribute(
"nodeOriginUID");
206 else if (element.nodeName() ==
"importBase")
208 importBases[element.attribute(
"uid")] = element.attribute(
"connUID");
210 else if (element.nodeName() ==
"connector")
213 conn->setnstUid(element.attribute(
"uid"));
214 conn->setName(element.attribute(
"id"));
216 QDomNodeList list = element.childNodes();
218 for (
unsigned int i=0;i<list.length();i++)
220 if (list.item(i).isElement())
222 QDomElement e = list.item(i).toElement();
224 if (e.nodeName() ==
"condition")
226 if (e.attribute(
"uid") !=
"")
227 conn->addCondition(e.attribute(
"uid"), e.attribute(
"type"));
229 conn->addCondition(e.attribute(
"type"), e.attribute(
"type"));
231 else if (e.nodeName() ==
"action")
233 if (e.attribute(
"uid") !=
"")
234 conn->addAction(e.attribute(
"uid"), e.attribute(
"type"));
236 conn->addAction(e.attribute(
"type"), e.attribute(
"type"));
238 else if (e.nodeName() ==
"param")
240 if (e.attribute(
"type") ==
"action")
242 conn->addActionParam(e.attribute(
"uid"), e.attribute(
"name"), e.attribute(
"value"));
244 else if (e.attribute(
"type") ==
"condition")
246 conn->addConditionParam(e.attribute(
"uid"), e.attribute(
"name"), e.attribute(
"value"));
251 conn->addActionParam(e.attribute(
"name"),
"", e.attribute(
"name"));
252 conn->addConditionParam(e.attribute(
"name"),
"", e.attribute(
"name"));
258 connectors[conn->getName()] = conn;
259 connectors2[conn->getnstUid()] = conn;
265 else if(element.nodeName() ==
"aggregator")
271 QDomNodeList list = element.childNodes();
273 for (
unsigned int i=0;i<list.length();i++)
275 if (list.item(i).isElement())
277 QDomElement e = list.item(i).toElement();
284 void QnstView::readLink(QDomElement element, QDomElement parent)
287 QMap<QString, QString> properties;
289 if (element.nodeName() ==
"linkdata" ||
292 element.nodeName() ==
"link")
295 properties[
"TYPE"] =
"link";
298 if(element.hasAttribute(
"xconnetor"))
299 properties[
"xconnector"] = element.attribute(
"xconnetor");
300 if(element.hasAttribute(
"xconnetorUID"))
301 properties[
"xconnectorUID"] = element.attribute(
"xconnetorUID");
305 QDomNamedNodeMap attributeMap = element.attributes();
306 for (
int i = 0; i < attributeMap.count(); ++i)
308 QDomNode attribute = attributeMap.item(i);
309 properties[attribute.nodeName()] = attribute.nodeValue();
313 addEntity(element.attribute(
"uid"),
314 element.attribute(
"parent"),
318 else if (element.nodeName() ==
"mapping")
321 properties[
"TYPE"] = element.nodeName();
323 QDomNamedNodeMap attributeMap = element.attributes();
324 for (
int i = 0; i < attributeMap.count(); ++i)
326 QDomNode attribute = attributeMap.item(i);
327 properties[attribute.nodeName()] = attribute.nodeValue();
331 addEntity(properties[
"uid"],
332 element.attribute(
"switchportUid"),
336 else if (element.nodeName() ==
"port")
338 if (entities.contains(element.attribute(
"uid")))
340 if (entities.contains(element.attribute(
"interfaceUID")))
345 if (entitya != entityb)
348 entity->setEntityA(entitya);
349 entity->setEntityB(entityb);
352 entitya->getnstGraphicsParent()->addnstGraphicsEntity(entity);
354 entitya->addnstGraphicsEdge(entity);
355 entityb->addnstGraphicsEdge(entity);
358 else if (entities.contains(element.attribute(
"componentUID")))
367 entity->setEntityA(entitya);
368 entity->setEntityB(entityb);
371 entitya->getnstGraphicsParent()->addnstGraphicsEntity(entity);
373 entitya->addnstGraphicsEdge(entity);
374 entityb->addnstGraphicsEdge(entity);
378 else if (element.nodeName() ==
"bind")
380 if (!entities.contains(element.attribute(
"uid")) &&
381 links.contains(element.attribute(
"linkUID")))
384 properties[
"TYPE"] =
"bind";
385 QDomNamedNodeMap attributeMap = element.attributes();
388 for (
int i = 0; i < attributeMap.count(); ++i)
390 QDomNode attribute = attributeMap.item(i);
391 properties[attribute.nodeName()] = attribute.nodeValue();
394 addEntity(properties[
"uid"],
395 entities[element.attribute(
"linkUID")]->getnstParent()->getnstUid(),
402 if(entities.contains(properties[
"uid"]))
409 QMap<QString, QString> params;
410 QMap<QString, QString> name_uid;
413 QDomNodeList list = element.childNodes();
414 for (
unsigned int i=0;i<list.length();i++)
416 if (list.item(i).isElement())
418 QDomElement e = list.item(i).toElement();
420 if (e.nodeName() ==
"param")
422 params[e.attribute(
"name")] = e.attribute(
"value");
423 name_uid[e.attribute(
"name")] = e.attribute(
"uid");
425 bindParamUIDToBindUID[e.attribute(
"uid")] = bind->getnstUid();
431 bind->setParams(params);
432 bind->setNamesUIDs(name_uid);
435 SIGNAL(bindParamAdded(QString,QString,QMap<QString, QString>)),
436 SLOT(requestBindParamAdjust(QString,QString,QMap<QString, QString>)));
439 SIGNAL(bindParamUpdated(QString,QMap<QString,QString>,QMap<QString,QString>)),
440 SLOT(updateBindParams(QString,QMap<QString,QString>,QMap<QString,QString>)));
447 qWarning() <<
"[QNST] Warning!! Trying to add a bind to a link that \
448 does not exists!! It will be ignored!!";
453 QDomNodeList list = element.childNodes();
454 for (
unsigned int i=0;i<list.length();i++)
456 if (list.item(i).isElement())
458 QDomElement e = list.item(i).toElement();
460 readLink(e, element);
465 QString QnstView::serialize()
467 QDomDocument* dom =
new QDomDocument();
468 QDomElement root = dom->createElement(
"qnst");
470 foreach(QString key, importBases.keys())
472 QDomElement e = dom->createElement(
"importBase");
474 e.setAttribute(
"uid", key);
475 e.setAttribute(
"connUID", importBases[key]);
482 assert(conn != NULL);
484 QDomElement e = dom->createElement(
"connector");
486 e.setAttribute(
"id", conn->getName());
487 e.setAttribute(
"uid", conn->getnstUid());
489 foreach(QString k, conn->getConditions().keys())
491 QDomElement c = dom->createElement(
"condition");
492 c.setAttribute(
"uid", k);
493 c.setAttribute(
"type", conn->getConditions().value(k));
498 foreach(QString k, conn->getActions().keys())
500 QDomElement a = dom->createElement(
"action");
501 a.setAttribute(
"uid", k);
502 a.setAttribute(
"type", conn->getActions().value(k));
518 QPair<QString, QString> key;
520 foreach(key, conn->getActionParams().keys())
522 QDomElement p = dom->createElement(
"param");
524 p.setAttribute(
"uid", key.first);
525 p.setAttribute(
"name", key.second);
526 p.setAttribute(
"value", conn->getActionParams().value(key));
527 p.setAttribute(
"type",
"action");
532 foreach(key, conn->getConditionParams().keys())
534 QDomElement p = dom->createElement(
"param");
536 p.setAttribute(
"uid", key.first);
537 p.setAttribute(
"name", key.second);
538 p.setAttribute(
"value", conn->getConditionParams().value(key));
539 p.setAttribute(
"type",
"condition");
558 foreach(QString key, refers.keys())
560 QDomElement e = dom->createElement(
"nodeReference");
562 e.setAttribute(
"nodeReferUID", key);
563 e.setAttribute(
"nodeOriginUID", refers[key]);
570 QDomElement e = dom->createElement(
"link");
572 e.setAttribute(
"id", link->getnstId());
573 e.setAttribute(
"uid", link->getnstUid());
575 e.setAttribute(
"top", link->getTop());
576 e.setAttribute(
"left", link->getLeft());
577 e.setAttribute(
"width", link->getWidth());
578 e.setAttribute(
"height", link->getHeight());
584 e.setAttribute(
"parent",
585 link->getnstParent()->getnstUid());
588 e.setAttribute(
"xconnector", link->getxConnector());
589 e.setAttribute(
"xconnectorUID", link->getxConnectorUID());
599 QDomElement e = dom->createElement(
"body");
601 e.setAttribute(
"id", entity->getnstId());
602 e.setAttribute(
"uid", entity->getnstUid());
604 e.setAttribute(
"top", entity->getTop());
605 e.setAttribute(
"left", entity->getLeft());
606 e.setAttribute(
"width", entity->getWidth());
607 e.setAttribute(
"height", entity->getHeight());
619 writeLink(e, dom, entity);
624 dom->appendChild(root);
626 linkWriterAux.clear();
628 return dom->toString(4);
631 void QnstView::write(QDomElement element, QDomDocument* dom,
636 switch(entity->getnstType())
639 e = dom->createElement(
"body");
648 e = dom->createElement(
"context");
657 e = dom->createElement(
"switch");
674 e = dom->createElement(
"media");
676 e.setAttribute(
"type", mediaTypeToXMLStr[entity->getnstType()]);
689 e = dom->createElement(
"property");
692 e.setAttribute(
"isRefer",
"true");
696 case Qnst::SwitchPort:
697 e = dom->createElement(
"switchPort");
701 e = dom->createElement(
"area");
704 e.setAttribute(
"isRefer",
"true");
708 case Qnst::Aggregator:
715 e = dom->createElement(
"port");
721 if (edge->getnstType() == Qnst::Reference)
723 if (edge->getEntityB()->getncgType() == Qncg::Node)
725 e.setAttribute(
"componentUID", edge->getEntityB()->getnstUid());
727 else if (edge->getEntityB()->getncgType() == Qncg::Interface)
729 e.setAttribute(
"componentUID", edge->getEntityB()->getnstParent()->getnstUid());
730 e.setAttribute(
"interfaceUID", edge->getEntityB()->getnstUid());
743 e.setAttribute(
"id", entity->getnstId());
744 e.setAttribute(
"uid", entity->getnstUid());
746 e.setAttribute(
"top", entity->getTop());
747 e.setAttribute(
"left", entity->getLeft());
748 e.setAttribute(
"width", entity->getWidth());
749 e.setAttribute(
"height", entity->getHeight());
751 writeLink(element, dom, entity);
758 element.appendChild(e);
761 void QnstView::writeLink(QDomElement element, QDomDocument* dom,
764 if (entity->getncgType() == Qncg::Node)
771 if(linkWriterAux.contains(edge->getnstUid()))
continue;
774 if (edge->getnstType() == Qnst::Condition ||
775 edge->getnstType() == Qnst::Action)
781 e = dom->createElement(
"bind");
782 e.setAttribute(
"id", bind->getnstId());
783 e.setAttribute(
"uid", bind->getnstUid());
785 e.setAttribute(
"linkUID", bind->getLink()->getnstUid());
788 if (edge->getnstType() == Qnst::Condition)
790 e.setAttribute(
"type",
"condition");
792 e.setAttribute(
"condition",
797 else if(edge->getnstType() == Qnst::Action)
799 e.setAttribute(
"type",
"action");
800 e.setAttribute(
"action",
804 e.setAttribute(
"componentaUID", bind->getEntityA()->getnstUid());
805 e.setAttribute(
"componentbUID", bind->getEntityB()->getnstUid());
807 e.setAttribute(
"component", bind->getComponent());
808 e.setAttribute(
"componentUid", bind->getComponentUid());
810 e.setAttribute(
"interface", bind->getInterface());
811 e.setAttribute(
"interfaceUid", bind->getInterfaceUid());
813 element.appendChild(e);
815 linkWriterAux.insert(bind->getnstUid());
820 foreach(QString param, bind->getParams().keys())
822 QDomElement ebp = dom->createElement(
"param");
824 ebp.setAttribute(
"name", param);
825 ebp.setAttribute(
"value", bind->getParams()[param]);
826 ebp.setAttribute(
"uid", bind->getNameUIDs()[param]);
833 else if (edge->getnstType() == Qnst::Mapping)
837 e = dom->createElement(
"mapping");
839 e.setAttribute(
"uid", edge->getnstUid());
841 e.setAttribute(
"switchportUid", link->getSwitchPortUid());
842 e.setAttribute(
"component", link->getComponent());
843 e.setAttribute(
"componentUid", link->getComponentUid());
844 e.setAttribute(
"interface", link->getInterfaceUid());
845 e.setAttribute(
"interfaceUid", link->getInterfaceUid());
847 element.appendChild(e);
849 linkWriterAux.insert(link->getnstUid());
855 void QnstView::createObjects()
858 scene->setParent(
this);
859 scene->setSceneRect(0, 0, 4000, 4000);
870 void QnstView::createConnection()
875 connect(scene, SIGNAL(cutRequested()), SLOT(performCut()));
876 connect(scene, SIGNAL(copyRequested()), SLOT(performCopy()));
877 connect(scene, SIGNAL(pasteRequested()), SLOT(performPaste()));
879 connect(scene, SIGNAL(deleteRequested()), SLOT(performDelete()));
881 connect(scene, SIGNAL(exportRequested()), SLOT(performExport()));
883 connect(scene, SIGNAL(zoominRequested()), SLOT(performZoomIn()));
884 connect(scene, SIGNAL(zoomoutRequested()), SLOT(performZoomOut()));
885 connect(scene, SIGNAL(zoomresetRequested()), SLOT(performZoomReset()));
886 connect(scene, SIGNAL(fullscreenRequested()), SLOT(performFullscreen()));
899 QMap<QString,QString>)),
901 QMap<QString,QString>)));
904 bool QnstView::hasEntity(QString uid)
906 if (entities.contains(uid) ||
907 binds.contains(uid) ||
918 if (links.contains(uid))
919 return links.value(uid);
921 else if (binds.contains(uid))
922 return binds.value(uid);
924 else if (entities.contains(uid))
925 return entities.value(uid);
930 void QnstView::addEntity(
const QString uid,
const QString parent,
931 const QMap<QString, QString> &properties,
bool undo,
941 if(entities.count(parent))
946 qDebug() <<
"[QNST]" <<
":" <<
"Adding entity '" + uid +
"'" << properties <<
"Parent: " << parent;
951 type != Qnst::Body &&
955 qWarning() <<
"[QNST] Trying to add an entity without a parent!!";
958 if( properties[
"TYPE"] ==
"importBase" ||
959 properties[
"TYPE"] ==
"causalConnector" ||
960 properties[
"TYPE"] ==
"simpleAction" ||
961 properties[
"TYPE"] ==
"simpleCondition" )
963 qWarning() <<
"[QNST] " << properties[
"TYPE"] <<
" is a special case. So, we will not need a parent.";
967 qWarning() <<
"[QNST] The entityAdd is beging ignored!";
976 entity->setnstUid(uid);
978 entity->setTop(scene->height()/2 - DEFAULT_BODY_HEIGHT/2);
979 entity->setLeft(scene->width()/2 - DEFAULT_BODY_WIDTH/2);
980 entity->setWidth(DEFAULT_BODY_WIDTH);
981 entity->setHeight(DEFAULT_BODY_HEIGHT);
983 scene->addRoot(entity);
991 if(entity != NULL) ok =
true;
1010 if(entity != NULL) ok =
true;
1016 if (!links.contains(uid))
1023 link->setnstUid(uid);
1025 if (properties[
"id"] !=
"")
1026 link->setnstId(properties[
"id"]);
1034 qWarning() <<
"[QNST] Warning! Link already added!!";
1041 case Qnst::Condition:
1043 if (!binds.contains(uid))
1046 QString action =
"", condition =
"";
1048 if(entities.contains(properties[
"linkUID"]))
1049 entitya = entities[properties[
"linkUID"]];
1051 qWarning() <<
"[QNST] Trying to make a bind that componentaUID does not exist!";
1053 if(entities.contains(properties[
"componentbUID"]))
1054 entityb = entities[properties[
"componentbUID"]];
1056 qWarning() <<
"[QNST] Trying to make a bind that componentbUID \
1059 if(properties.contains(
"action"))
1060 action = properties[
"action"];
1062 condition = properties[
"condition"];
1066 if(links.contains(entitya->getnstUid()))
1077 bind->setnstUid(uid);
1078 bind->setProperties(properties);
1079 entities[uid] = bind;
1083 changeEntity(bind->getnstUid(), properties,
true);
1090 case Qnst::BindParam:
1091 if (entities.contains(parent))
1097 bind->addParam(uid, properties[
"name"], properties[
"value"]);
1098 bindParamUIDToBindUID[uid] = parent;
1102 qWarning() <<
"[QNST] Warning! Trying to add a bind param inside a \
1103 not bind parent. This command will be ignored!";
1108 case Qnst::SwitchPort:
1111 if(entity != NULL) ok =
true;
1128 case Qnst::Aggregator:
1130 qWarning() <<
"[QNST] ERROR!!! Trying to add an Aggregator!! This is not \
1131 supported anymore!";
1137 case Qnst::Property:
1141 if (properties.contains(
"isRefer"))
1157 entity->setnstUid(uid);
1158 entities[uid] = entity;
1159 entity->setProperties(properties);
1161 entity->updateToolTip();
1166 adjustEntity(entity);
1170 if (properties[
"TYPE"] ==
"causalConnector")
1172 addConnector(uid, properties);
1175 else if (properties[
"TYPE"] ==
"simpleCondition")
1177 addCondition(uid, properties);
1180 else if (properties[
"TYPE"] ==
"simpleAction")
1182 addAction(uid, properties);
1185 else if (properties[
"TYPE"] ==
"importBase")
1187 addImportBase(uid, properties);
1189 else if (properties[
"TYPE"] ==
"connectorParam")
1191 addConnectorParam(uid, parent, properties);
1194 if(ok && !undo && entity != NULL)
1201 void QnstView::removeEntity(
const QString uid,
bool undo,
bool rmRef)
1208 if (entities.contains(uid))
1214 Qncg::EntityType qncgType = entity->getncgType();
1215 bool mustRemoveFromParent =
false;
1218 if(entity->getncgType() == Qncg::Node ||
1219 entity->getncgType() == Qncg::Interface)
1235 removeEdgesOfEntity(node,
false);
1240 if (e->getnstType() != Qnst::Edge &&
1241 e->getnstType() != Qnst::Condition &&
1242 e->getnstType() != Qnst::Mapping &&
1243 e->getnstType() != Qnst::Action &&
1244 e->getnstType() != Qnst::Reference)
1246 removeEntity(e->getnstUid(),
true,
false);
1251 if (entity->getnstType() == Qnst::Link ||
1252 entity->getnstType() == Qnst::Aggregator)
1254 if (links.contains(entity->getnstUid()))
1256 links.remove(entity->getnstUid());
1260 mustRemoveFromParent =
true;
1264 case Qncg::Interface:
1270 removeEdgesOfEntity(interface,
false);
1272 qWarning() <<
"Could not make a cast to QnstGraphicsInterface*";
1274 mustRemoveFromParent =
true;
1283 removeEdge(edge,
false);
1289 mustRemoveFromParent =
true;
1294 if(mustRemoveFromParent)
1300 qDebug() <<
"parent = "
1301 << QString().sprintf(
"%p", parent)
1302 << parent->getnstUid();
1304 parent->removenstGraphicsEntity(entity);
1307 scene->removeRoot(entity);
1309 if (selected == entity)
1312 if (clipboard == entity)
1315 if (entity->getnstType() == Qnst::Link &&
1316 links.contains(entity->getnstUid()))
1318 links.remove(entity->getnstUid());
1321 entities.remove(entity->getnstUid());
1323 entity->deleteLater();
1326 if (qncgType == Qncg::Interface)
1328 qDebug() <<
"I am Qncg::Interface" << uid;
1329 if (refers.contains(uid))
1331 qDebug() <<
"Only remove from refer";
1336 qDebug() <<
"Calling adjust... :P" << uid;
1337 qDebug() <<
"Before adjustMedia";
1341 entities.contains(parentMedia->getnstUid()))
1345 foreach(QString rUid, refers.keys(parentMedia->getnstUid()))
1347 if (entities.contains(rUid))
1354 qDebug() <<
"referMedia is ok, so calling adjustMedia";
1355 adjustMedia(referMedia);
1361 qDebug() <<
"After adjust... :P";
1366 qDebug() <<
"Well, I am not inside refer :P...";
1367 foreach(QString ruid, refers.keys(uid))
1369 refers.remove(ruid);
1371 if (entities.contains(ruid))
1380 if (refers.contains(uid))
1382 qDebug() <<
"Removing" + uid +
"from refers.";
1390 else if (importBases.contains(uid))
1394 if (cc->getnstUid() == importBases[uid])
1395 connectors.remove(cc->getName());
1400 if (cc->getnstUid() == importBases[uid])
1401 connectors2.remove(cc->getnstId());
1404 importBases.remove(uid);
1411 else if (connectors2.contains(uid))
1413 connectors.remove(connectors2[uid]->getName());
1414 connectors2.remove(uid);
1416 else if ((cONN = getConnectorByRoleUid(uid)) != NULL)
1418 cONN->removeAction(uid);
1419 cONN->removeCondition(uid);
1421 else if (bindParamUIDToBindUID.contains(uid))
1423 if(bindParamUIDToBindUID.contains(uid))
1425 if(entities.contains(bindParamUIDToBindUID[uid]))
1432 bind->removeUId(uid);
1436 qWarning() <<
"[QNST] Warning! The parent of bindParam is not a \
1442 qWarning() <<
"[QNST] Warning! Trying to remove a bindParam that is \
1443 mapped inside an entity!";
1447 bindParamUIDToBindUID.remove(uid);
1450 qWarning() <<
"[QNST] Warning! Trying to remove a bindParam that is \
1451 not inside bindParamUIDToBindUID";
1455 qDebug() <<
"Warning! Calling removeEntity to a entity that does not exist in view!";
1458 deletePendingEntities();
1461 void QnstView::changeEntity(
const QString uid,
1462 const QMap<QString, QString> &properties,
1465 qDebug() <<
"[QNST]" <<
":" <<
"Changing entity '"+uid+
"'"
1468 if (selected != NULL)
1470 selected->setSelected(
false);
1475 if (links.contains(uid))
1477 changeLink(links[uid], properties);
1479 else if (entities.contains(uid))
1483 switch(entity->getnstType())
1487 entity->setnstId(properties[
"id"]);
1488 entity->setProperties(properties);
1497 if (properties[
"id"] !=
"")
1498 entity->setnstId(properties[
"id"]);
1500 entity->setProperties(properties);
1511 case Qnst::Settings:
1519 media->setnstId(properties[
"id"]);
1520 media->setProperties(properties);
1522 if (properties[
"referUID"] !=
"")
1524 if (entities.contains(properties[
"referUID"]))
1526 entities[properties[
"referUID"]])->getSource());
1529 QString src = media->getSource();
1537 int start = src.lastIndexOf(
".");
1540 QString ext = QFileInfo(src).suffix().toLower();
1565 entity->setnstId(properties[
"id"]);
1567 entity->setProperties(properties);
1569 foreach (QString key, refers.keys(entity->getnstUid()))
1571 if (entities.contains(key))
1572 entities[key]->setnstId(entity->getnstId());
1583 case Qnst::Property:
1585 entity->setnstId(properties[
"id"]);
1587 entity->setProperties(properties);
1589 foreach (QString key, refers.keys(entity->getnstUid()))
1591 if (entities.contains(key))
1592 entities[key]->setnstId(entity->getnstId());
1597 case Qnst::SwitchPort:
1599 if(properties.contains(
"id"))
1600 entity->setnstId(properties[
"id"]);
1602 entity->setProperties(properties);
1610 entity->setProperties(properties);
1613 adjustMapping(mapping);
1619 entity->setProperties(properties);
1626 case Qnst::Condition:
1632 bind->setProperties(properties);
1644 entity->updateToolTip();
1648 qWarning() <<
"Trying to change an Entity that does not exist!";
1650 if (properties[
"TYPE"] ==
"importBase")
1652 changeImportBase(uid, properties);
1654 else if (connectors2.contains(uid))
1656 changeConnector(connectors2[uid], properties);
1658 else if (properties[
"TYPE"] ==
"simpleCondition")
1660 changeCondition(uid, properties);
1662 else if (properties[
"TYPE"] ==
"simpleAction")
1664 changeAction(uid, properties);
1666 else if (properties[
"TYPE"] ==
"bindParam")
1668 changeBindParam(uid, properties);
1670 else if (properties[
"TYPE"] ==
"connectorParam")
1672 changeConnectorParam(uid, properties);
1677 deletePendingEntities();
1680 void QnstView::selectEntity(
const QString uid)
1682 qDebug() <<
"[QNST]" <<
":" <<
"Selecting entity '"+uid+
"'";
1684 if (entities.contains(uid))
1688 if (entity != selected)
1690 if (selected != NULL)
1692 selected->setSelected(
false);
1698 selected->setSelected(
true);
1704 void QnstView::addImportBase(
const QString &uid,
1705 const QMap<QString, QString> &properties)
1707 QString connUID = QUuid::createUuid().toString();
1709 importBases[uid] = connUID;
1711 if (properties[
"documentURI"] !=
"" &&
1712 properties[
"projectURI"] !=
"" &&
1713 properties[
"alias"] !=
"")
1715 int n = properties[
"projectURI"].lastIndexOf(
"/");
1717 QFile* file =
new QFile(properties[
"projectURI"].left(n)+QDir::separator()+properties[
"documentURI"]);
1721 if (file->open(QIODevice::ReadOnly))
1723 QDomDocument* domdoc =
new QDomDocument();
1724 if (domdoc->setContent(file))
1725 readImportBase(connUID, domdoc->firstChildElement(), properties[
"alias"]);
1739 void QnstView::changeImportBase(
const QString &uid,
1740 const QMap<QString, QString> &properties)
1744 if (cc->getnstUid() == importBases[uid])
1745 connectors.remove(cc->getName());
1750 if (cc->getnstUid() == importBases[uid])
1751 connectors2.remove(cc->getnstId());
1754 if (properties[
"documentURI"] !=
"" &&
1755 properties[
"projectURI"] !=
"" &&
1756 properties[
"alias"] !=
"")
1758 int n = properties[
"projectURI"].lastIndexOf(
"/");
1759 QFile* file =
new QFile(properties[
"projectURI"].left(n)+QDir::separator()+properties[
"documentURI"]);
1763 if (file->open(QIODevice::ReadOnly))
1766 QDomDocument* domdoc =
new QDomDocument();
1768 if (domdoc->setContent(file))
1770 readImportBase(importBases[uid], domdoc->firstChildElement(), properties[
"alias"]);
1784 void QnstView::readImportBase(
const QString &uid,
1785 QDomElement element,
1786 const QString &alias)
1788 if (element.tagName() ==
"causalConnector")
1790 QDomNodeList list = element.childNodes();
1793 conn->setnstId(alias+
"#"+element.attribute(
"id"));
1794 conn->setName(alias+
"#"+element.attribute(
"id"));
1795 conn->setnstUid(uid);
1797 for (
unsigned int i=0;i<list.length();i++)
1799 if (list.item(i).isElement())
1801 QDomElement e = list.item(i).toElement();
1803 readConnector(e, conn);
1807 connectors[conn->getName()] = conn;
1808 connectors2[conn->getnstId()] = conn;
1813 QDomNodeList list = element.childNodes();
1815 for (
unsigned int i=0;i<list.length();i++)
1817 if (list.item(i).isElement())
1819 QDomElement e = list.item(i).toElement();
1821 readImportBase(uid, e, alias);
1827 void QnstView::readConnector(QDomElement element,
QnstConnector* conn)
1829 if (element.tagName() ==
"connectorParam")
1831 if (element.attribute(
"name") !=
"")
1832 conn->addParam(QUuid::createUuid().toString(), element.attribute(
"name"));
1835 if (element.tagName() ==
"simpleCondition" ||
1836 element.tagName() ==
"attributeAssessment")
1838 if (element.attribute(
"role") !=
"")
1840 QString UID = QUuid::createUuid().toString();
1842 conn->addCondition(UID, element.attribute(
"role"));
1844 QDomNamedNodeMap attributes = element.attributes();
1846 for (
int i=0;i<attributes.size();i++)
1848 QString name = attributes.item(i).toAttr().name();
1849 QString value = attributes.item(i).toAttr().value();
1851 if (value.contains(
"$"))
1853 conn->addConditionParam(UID,name,value.replace(
'$',
""));
1859 if (element.tagName() ==
"simpleAction")
1861 if (element.attribute(
"role") !=
"")
1863 QString UID = QUuid::createUuid().toString();
1865 conn->addAction(UID, element.attribute(
"role"));
1867 QDomNamedNodeMap attributes = element.attributes();
1869 for (
int i=0;i<attributes.size();i++)
1871 QString name = attributes.item(i).toAttr().name();
1872 QString value = attributes.item(i).toAttr().value();
1874 if (value.contains(
"$"))
1876 conn->addActionParam(UID,name,value.replace(
'$',
""));
1884 QDomNodeList list = element.childNodes();
1886 for (
unsigned int i=0;i<list.length();i++)
1888 if (list.item(i).isElement())
1890 QDomElement e = list.item(i).toElement();
1891 readConnector(e, conn);
1898 QnstType type = entity->getnstType();
1916 case Qnst::Property:
1920 if(entityParent->isMedia())
1924 foreach (QString key, refers.keys(entityParent->getnstUid()))
1926 if (entities.contains(key) && entities[key]->isMedia())
1942 QString referUID = entity->getReferUID();
1943 QString refer = entity->getRefer();
1949 if (!refer.isEmpty() && !referUID.isEmpty())
1951 if (entities.contains(referUID))
1958 entity->setnstType(origin->getnstType());
1959 entity->setSource(origin->getSource());
1963 entity->getnstGraphicsEntities())
1965 if (rinterface->getncgType() == Qncg::Interface)
1967 if (refers.contains(rinterface->getnstUid()))
1969 bool validReference =
false;
1972 origin->getnstGraphicsEntities())
1974 if (interface->getnstUid() == refers[rinterface->getnstUid()])
1976 validReference =
true;
1981 if (!validReference)
1983 entity->removenstGraphicsEntity(rinterface);
1985 refers.remove(rinterface->getnstUid());
1986 entities.remove(rinterface->getnstUid());
1987 toDelete.push_back(rinterface);
1996 bool hasRefer =
false;
1999 if(interface && !interface->isRefer())
2002 entity->getnstGraphicsEntities())
2004 if (refers.value(rinterface->getnstUid()) == interface->getnstUid() ||
2005 refers.value(interface->getnstUid()) == rinterface->getnstUid())
2017 copy->setnstId(interface->getnstId());
2019 copy->setTop(interface->getTop());
2020 copy->setLeft(interface->getLeft());
2021 copy->setWidth(interface->getWidth());
2022 copy->setHeight(interface->getHeight());
2023 copy->setRefer(
true);
2026 refers[copy->getnstUid()] = interface->getnstUid();
2027 entities[copy->getnstUid()] = copy;
2032 if (entity->getInstance() ==
"instSame")
2036 origin->getnstGraphicsEntities())
2038 if (interface->getncgType() == Qncg::Interface)
2040 if (refers.contains(interface->getnstUid()))
2042 bool validReference =
false;
2045 entity->getnstGraphicsEntities())
2047 if (rinterface->getnstUid() == refers[interface->getnstUid()])
2049 validReference =
true;
2054 if (!validReference)
2056 origin->removenstGraphicsEntity(interface);
2058 refers.remove(interface->getnstUid());
2059 entities.remove(interface->getnstUid());
2062 toDelete.push_back(interface);
2069 entity->getnstGraphicsEntities())
2071 if (!refers.contains(rinterface->getnstUid()))
2073 bool containsRef =
false;
2076 origin->getnstGraphicsEntities())
2078 if (refers.value(interface->getnstUid(),
"NULL") == rinterface->getnstUid())
2090 copy->setnstId(rinterface->getnstId());
2092 copy->setTop(rinterface->getTop());
2093 copy->setLeft(rinterface->getLeft());
2094 copy->setWidth(rinterface->getWidth());
2095 copy->setHeight(rinterface->getHeight());
2096 copy->setRefer(
true);
2099 refers[copy->getnstUid()] = rinterface->getnstUid();
2100 entities[copy->getnstUid()] = copy;
2109 if (refers.contains(interface->getnstUid()))
2111 bool containsRef =
false;
2114 entity->getnstGraphicsEntities())
2116 if (refers.value(interface->getnstUid()) == rinterface->getnstUid())
2125 origin->removenstGraphicsEntity(interface);
2127 refers.remove(interface->getnstUid());
2128 entities.remove(interface->getnstUid());
2129 toDelete.push_back(interface);
2135 refers[entity->getnstUid()] = origin->getnstUid();
2149 entity->removenstGraphicsEntity(interface);
2151 refers.remove(interface->getnstUid());
2152 entities.remove(interface->getnstUid());
2154 toDelete.push_back(interface);
2159 entity->setnstType(Qnst::Media);
2160 entity->setSource(
"");
2161 entity->setReferUID(
"");
2166 qWarning() <<
"I do not refer to any media, so remove all references";
2167 if (refers.contains(entity->getnstUid()))
2169 qWarning() <<
"Refers.contains" << entity->getnstUid();
2172 if (refers.contains(interface->getnstUid()))
2174 entity->removenstGraphicsEntity(interface);
2176 refers.remove(interface->getnstUid());
2177 entities.remove(interface->getnstUid());
2180 toDelete.push_back(interface);
2184 if (refers.contains(entity->getnstUid()))
2186 foreach(QString rUid, refers.keys(interface->getnstUid()))
2188 if (entities.contains(rUid))
2193 p->removenstGraphicsEntity(e);
2195 refers.remove(e->getnstUid());
2196 entities.remove(e->getnstUid());
2199 toDelete.push_back(e);
2208 if (refers.keys(entity->getnstUid()).size() == 0)
2219 entity->removenstGraphicsEntity(interface);
2221 entities.remove(interface->getnstUid());
2222 refers.remove(interface->getnstUid());
2225 toDelete.push_back(interface);
2232 if (refers.contains(entity->getnstUid()))
2234 entity->setnstType(Qnst::Media);
2235 entity->setSource(
"");
2237 refers.remove(entity->getnstUid());
2254 if (e->getnstType() == Qnst::Reference)
2258 if (entity == edge->getEntityA())
2260 if (edge->getEntityA()->getncgType() == Qncg::Node ||
2261 edge->getEntityA()->getncgType() == Qncg::Interface )
2266 if (edge->getEntityB()->getncgType() == Qncg::Node ||
2267 edge->getEntityB()->getncgType() == Qncg::Interface)
2272 parent->removenstGraphicsEntity(edge);
2280 if (entity->getInterfaceUid() !=
"")
2283 if (entities.contains(entity->getInterfaceUid()))
2291 if (parenta != NULL && parentb != NULL)
2293 if (entitya != entityb && parenta == parentb->getnstGraphicsParent())
2296 edge->setEntityA(entitya);
2297 edge->setEntityB(entityb);
2300 parenta->addnstGraphicsEntity(edge);
2308 else if (entity->getComponentUid() !=
"")
2311 if (entities.contains(entity->getComponentUid()))
2319 if (parenta != NULL && parentb != NULL)
2321 if (entitya != entityb && parenta == parentb)
2324 edge->setEntityA(entitya);
2325 edge->setEntityB(entityb);
2328 parenta->addnstGraphicsEntity(edge);
2344 if (entities.contains(entity->getComponentUid()) &&
2345 entities.contains(entity->getSwitchPortUid()))
2349 if (edge->getEntityA() != NULL)
2351 if (edge->getEntityA()->getncgType() == Qncg::Node ||
2352 edge->getEntityA()->getncgType() == Qncg::Interface )
2358 if (edge->getEntityB() != NULL)
2360 if (edge->getEntityB()->getncgType() == Qncg::Node ||
2361 edge->getEntityB()->getncgType() == Qncg::Interface )
2368 if(entities.contains(entity->getSwitchPortUid()))
2371 entities[entity->getSwitchPortUid()]->getnstGraphicsParent();
2372 parent->addnstGraphicsEntity(edge);
2374 if (!parent->getnstGraphicsEntities().contains(edge))
2375 parent->addnstGraphicsEntity(edge);
2377 edge->setEntityA(entities[entity->getSwitchPortUid()]);
2379 if (entity->getInterfaceUid() !=
"" &&
2380 entities.contains(entity->getInterfaceUid()))
2382 edge->setEntityB(entities[entity->getInterfaceUid()]);
2386 edge->setEntityB(entities[entity->getComponentUid()]);
2400 if (edge->getEntityA() != NULL)
2402 if (edge->getEntityA()->getncgType() == Qncg::Node ||
2403 edge->getEntityA()->getncgType() == Qncg::Interface )
2409 if (edge->getEntityB() != NULL)
2411 if (edge->getEntityB()->getncgType() == Qncg::Node ||
2412 edge->getEntityB()->getncgType() == Qncg::Interface )
2419 parent->removenstGraphicsEntity(edge);
2424 const QMap<QString, QString> &properties)
2428 if (properties[
"id"] !=
"")
2430 entity->setnstId(properties[
"id"]);
2433 if (properties[
"xconnector"] !=
"")
2435 entity->setxConnector(properties[
"xconnector"]);
2436 entity->setxConnectorUID(properties[
"xconnectorUID"]);
2453 link = bind->getLink();
2456 if(connectors.contains(link->getxConnector()))
2457 bind->setConn(connectors[link->getxConnector()]);
2459 if(bind->getInterfaceUid() !=
"" && entities.contains(bind->getInterfaceUid()))
2460 target = entities[bind->getInterfaceUid()];
2461 else if(entities.contains(bind->getComponentUid()))
2462 target = entities[bind->getComponentUid()];
2465 if(bind->getTarget())
2476 link->removenstGraphicsEdge(bind);
2477 link->addnstGraphicsEdge(bind);
2480 bind->setLink(link);
2481 bind->setTarget(target);
2488 connectors.contains(link->getxConnector()))
2490 QnstConnector *connector = connectors[link->getxConnector()];
2491 if(!connector->getConditions().values().contains(bind->getRole()) &&
2492 !connector->getActions().values().contains(bind->getRole()))
2494 bind->setInvalid(
true);
2497 bind->setInvalid(
false);
2501 bind->setInvalid(
true);
2508 void QnstView::addConnector(
const QString &uid,
2509 const QMap<QString, QString> &properties)
2511 if (!connectors2.contains(uid))
2514 entity->setnstUid(uid);
2516 if (properties[
"id"] !=
"")
2518 entity->setName(properties[
"id"]);
2519 entity->setnstId(properties[
"id"]);
2522 connectors2[uid] = entity;
2526 if (c->getnstUid() == entity->getnstUid())
2528 connectors.remove(connectors.key(c));
2533 if (entity->getnstId() !=
"")
2534 connectors[entity->getnstId()] = entity;
2538 void QnstView::adjustAll()
2545 switch(entity->getnstType())
2548 case Qnst::Condition:
2562 case Qnst::Settings:
2580 const QMap<QString, QString> &properties)
2582 qWarning() <<
"QnstView::changeConnector" << entity << properties;
2583 if (properties[
"id"] !=
"")
2585 entity->setName(properties[
"id"]);
2586 entity->setnstId(properties[
"id"]);
2591 if (c->getnstUid() == entity->getnstUid())
2593 connectors.remove(connectors.key(c));
2598 if (entity->getnstId() !=
"")
2599 connectors[entity->getnstId()] = entity;
2602 void QnstView::addCondition(
const QString &uid,
2603 const QMap<QString, QString> &properties)
2605 if (connectors2.contains(properties[
"connector"]))
2607 QnstConnector* connector = connectors2[properties[
"connector"]];
2609 if (properties[
"role"] !=
"")
2610 connector->addCondition(uid, properties[
"role"]);
2612 foreach(QString key, properties.keys())
2614 if (key.startsWith(
"param"))
2616 QString num = key.replace(
"param",
"");
2618 connector->addConditionParam(uid, properties.value(
"attr"+num), properties.value(key));
2623 qWarning() <<
"[QNST] Trying yo add a condition to a connector that does not exist.";
2626 void QnstView::changeCondition(
const QString &uid,
2627 const QMap<QString, QString> &properties)
2629 if (connectors2.contains(properties[
"connector"]))
2631 QnstConnector* connector = connectors2[properties[
"connector"]];
2633 if (connector->getConditions().contains(uid))
2634 connector->removeCondition(uid);
2636 if (properties[
"role"] !=
"")
2638 qWarning() <<
"CHANGING CONDITION" << properties[
"role"];
2639 connector->addCondition(uid, properties[
"role"]);
2641 foreach(QString key, properties.keys())
2643 if (key.startsWith(
"param"))
2645 QString num = key.replace(
"param",
"");
2647 connector->addConditionParam(uid, properties.value(
"attr"+num), properties.value(key));
2653 qWarning() <<
"[QNST] Trying yo change a condition in a connector that does not exist.";
2656 void QnstView::addAction(
const QString &uid,
2657 const QMap<QString, QString> &properties)
2659 if (connectors2.contains(properties[
"connector"]))
2661 QnstConnector* connector = connectors2[properties[
"connector"]];
2663 if (properties[
"role"] !=
"")
2664 connector->addAction(uid, properties[
"role"]);
2666 foreach(QString key, properties.keys())
2668 if (key.startsWith(
"param"))
2670 QString num = key.replace(
"param",
"");
2672 connector->addActionParam(uid, properties.value(
"attr"+num), properties.value(key));
2678 void QnstView::changeAction(
const QString &uid,
2679 const QMap<QString, QString> &properties)
2681 if (connectors2.contains(properties[
"connector"]))
2683 QnstConnector* connector = connectors2[properties[
"connector"]];
2685 if (connector->getActions().contains(uid))
2686 connector->getActions().remove(uid);
2688 if (properties[
"role"] !=
"")
2689 connector->addAction(uid, properties[
"role"]);
2693 void QnstView::changeBindParam(
const QString &uid,
2694 const QMap<QString, QString> &properties)
2696 if (entities.contains(properties.value(
"parent")))
2701 bind->setParam(properties.value(
"name",
""), properties.value(
"value",
""));
2705 void QnstView::addConnectorParam(
const QString &uid,
2706 const QString &parent,
2707 const QMap<QString, QString> &properties)
2709 if (connectors2.contains(parent))
2712 conn->addParam(uid, properties[
"name"]);
2716 void QnstView::changeConnectorParam(
const QString &uid,
2717 const QMap<QString, QString> &properties)
2719 if (connectors2.contains(properties[
"parent"]))
2722 conn->addParam(uid, properties[
"name"]);
2728 qDebug() <<
"[QNST]" <<
":" <<
"Requesting entity addition '"+entity->getnstUid()+
"'";
2731 QMap<QString, QString> properties;
2732 QMap <QString, QString> additionalData;
2737 entities[entity->getnstUid()] = entity;
2740 additionalData = entity->getUsrData();
2741 foreach(QString key, additionalData.keys())
2743 if(!properties.contains(key))
2744 properties.insert(key, additionalData.value(key));
2750 entity->getProperties(properties);
2752 switch(entity->getnstType())
2756 if (undo){ scene->addRoot(entity); }
2758 properties[
"TYPE"] =
"body";
2765 if (entity->getnstId() ==
"" && !undo)
2766 updateEntityWithUniqueNstId(entity);
2768 properties[
"TYPE"] =
"context";
2769 properties[
"id"] = entity->getnstId();
2777 if (entity->getnstId() ==
"" && !undo)
2778 updateEntityWithUniqueNstId(entity);
2780 properties[
"TYPE"] =
"switch";
2781 properties[
"id"] = entity->getnstId();
2792 case Qnst::Settings:
2797 if (entity->getnstId() ==
"" && !undo)
2798 updateEntityWithUniqueNstId(entity);
2804 properties[
"TYPE"] =
"media";
2805 properties[
"id"] = entity->getnstId();
2814 if (entity->getnstId() ==
"" && !undo)
2815 updateEntityWithUniqueNstId(entity);
2819 properties[
"TYPE"] =
"port";
2820 properties[
"id"] = entity->getnstId();
2827 if (edge->getnstType() == Qnst::Reference)
2829 properties[
"COMPONENT"] = edge->getEntityA()->getnstUid();
2830 properties[
"component"] = edge->getEntityA()->getnstId();
2832 if (edge->getEntityB()->getnstType() == Qnst::Port ||
2833 edge->getEntityB()->getnstType() == Qnst::Property ||
2834 edge->getEntityB()->getnstType() == Qnst::Area)
2836 properties[
"INTERFACE"] = edge->getEntityB()->getnstUid();;
2837 properties[
"interface"] = edge->getEntityB()->getnstId();;
2849 if (entity->getnstId() ==
"" && !undo)
2850 updateEntityWithUniqueNstId(entity);
2852 properties[
"TYPE"] =
"area";
2853 properties[
"id"] = entity->getnstId();
2856 if(entity->getnstGraphicsParent()->isMedia())
2865 foreach (QString key,
2866 refers.keys(entity->getnstGraphicsParent()->getnstUid()))
2868 if (entities.contains(key))
2870 if (entities[key]->isMedia())
2879 case Qnst::Property:
2881 properties[
"TYPE"] =
"property";
2884 if(entity->getnstGraphicsParent()->isMedia())
2893 foreach (QString key,
2894 refers.keys(entity->getnstGraphicsParent()->getnstUid()))
2896 if (entities.contains(key))
2898 if (entities[key]->isMedia())
2907 case Qnst::Aggregator:
2909 qWarning() <<
"Trying to add an Aggregator!!! This is not supported \
2924 if (entity->getnstId() ==
"" && !undo)
2925 updateEntityWithUniqueNstId(entity);
2927 properties[
"TYPE"] =
"link";
2928 properties[
"id"] = entity->getnstId();
2929 properties[
"xconnector"] = link->getxConnector();
2931 entities[entity->getnstUid()] = entity;
2932 links[entity->getnstUid()] = link;
2940 case Qnst::Condition:
2943 if (!binds.contains(entity->getnstUid()))
2948 properties[
"TYPE"] =
"bind";
2951 if(bind->getLink() != NULL)
2953 properties[
"connector"] = bind->getLink()->getxConnector();
2954 properties[
"linkUID"] = bind->getLink()->getnstUid();
2955 properties[
"link"] = bind->getLink()->getnstId();
2959 qWarning() <<
"[QNST] Warning!!! Bind is not associated to link!";
2963 if (bind->isCondition())
2965 properties[
"role"] =
2967 properties[
"condition"] = bind->getRole();
2971 properties[
"action"] = bind->getRole();
2972 properties[
"role"] =
2976 properties[
"component"] = bind->getComponent();
2977 properties[
"interface"] = bind->getInterface();
2979 binds[bind->getnstUid()] = bind;
2987 case Qnst::SwitchPort:
2989 if (entity->getnstId() ==
"" && !undo)
2990 updateEntityWithUniqueNstId(entity);
2992 properties[
"TYPE"] =
"switchPort";
2993 properties[
"id"] = entity->getnstId();
3006 entity->updateToolTip();
3008 if(entity->getnstType() == Qnst::Body)
3010 emit entityAdded(entity->getnstUid(),
"", properties);
3014 emit entityAdded(entity->getnstUid(),
3015 entity->getnstGraphicsParent()->getnstUid(),
3030 bool rmRefs,
bool notify)
3032 qDebug() <<
"[QNST]" <<
":" <<
"Requesting entity remotion '" +
3033 entity->getnstUid() +
"'" +
3034 entity->getnstType() +
"=" +
3041 Qncg::EntityType qncgType = entity->getncgType();
3042 bool mustRemoveFromParent =
false;
3045 if( entity->getncgType() == Qncg::Node ||
3046 entity->getncgType() == Qncg::Interface )
3055 QString UID = entity->getnstUid();
3064 removeEdgesOfEntity(node,
false);
3066 qWarning() <<
"Could not make a cast to QnstGraphicsNode*";
3071 if (e->getnstType() != Qnst::Edge &&
3072 e->getnstType() != Qnst::Condition &&
3073 e->getnstType() != Qnst::Mapping &&
3074 e->getnstType() != Qnst::Action &&
3075 e->getnstType() != Qnst::Reference)
3077 requestEntityRemotion(e,
true,
false);
3081 mustRemoveFromParent =
true;
3085 case Qncg::Interface:
3091 removeEdgesOfEntity(interface,
false);
3093 qWarning() <<
"Could not make a cast to QnstGraphicsInterface*";
3095 mustRemoveFromParent =
true;
3104 removeEdge(edge, notify);
3110 mustRemoveFromParent =
true;
3115 if(mustRemoveFromParent)
3120 parent->removenstGraphicsEntity(entity);
3122 scene->removeRoot(entity);
3124 if (selected == entity)
3127 if (clipboard == entity)
3130 if (entity->getnstType() == Qnst::Link)
3132 if (links.contains(entity->getnstUid()))
3134 links.remove(entity->getnstUid());
3138 entities.remove(entity->getnstUid());
3140 if (entity->getnstType() == Qnst::Link)
3142 if (links.contains(entity->getnstUid()))
3144 links.remove(entity->getnstUid());
3149 emit entityRemoved(entity->getnstUid());
3153 if (qncgType == Qncg::Interface)
3155 if (refers.contains(UID))
3161 if (parent != NULL && parent->isMedia())
3165 foreach(QString rUid, refers.keys(parent->getnstUid()))
3167 if (entities.contains(rUid))
3180 foreach(QString ruid, refers.keys(UID))
3182 refers.remove(ruid);
3184 if (entities.contains(ruid))
3190 qDebug() <<
"=================== un, hello!";
3196 if (refers.contains(UID))
3198 qWarning() <<
"Removing" + UID +
"from refers.";
3205 deletePendingEntities();
3213 requestEntityRemotion(edge,
false,
false, notify);
3219 if(edge->getEntityA())
3221 if ( edge->getEntityA()->getncgType() == Qncg::Node ||
3222 edge->getEntityA()->getncgType() == Qncg::Interface )
3228 if( edge->getEntityB() )
3230 if ( edge->getEntityB()->getncgType() == Qncg::Node ||
3231 edge->getEntityB()->getncgType() == Qncg::Interface )
3237 if (edge->getnstType() == Qnst::Condition ||
3238 edge->getnstType() == Qnst::Action ||
3239 edge->getnstType() == Qnst::Bind)
3248 if (ll->getConditions().contains(bb->getnstUid()))
3249 ll->removeCondition(bb);
3251 if (ll->getActions().contains(bb->getnstUid()))
3252 ll->removeAction(bb);
3255 binds.remove(bb->getnstUid());
3258 else if (edge->getnstType() == Qnst::Reference)
3261 p->setComponent(
"");
3262 p->setComponentUid(
"");
3263 p->setInterface(
"");
3264 p->setInterfaceUid(
"");
3267 else if (edge->getnstType() == Qnst::Mapping)
3281 parent->removenstGraphicsEntity(edge);
3282 entities.remove(edge->getnstUid());
3285 if (edge->getnstType() != Qnst::Reference)
3288 emit entityRemoved(edge->getnstUid());
3291 if (selected == edge)
3294 if (clipboard == edge)
3301 QMap<QString, QString> properties)
3312 qDebug() <<
"[QNST]" <<
":" <<
"Requesting entity change '" + entity->getnstUid() +
"'";
3314 QMap<QString, QString> properties;
3315 QMap <QString, QString> additionalData;
3321 additionalData = entity->getUsrData();
3322 foreach(QString key, additionalData.keys())
3324 if(!properties.contains(key))
3325 properties.insert(key, additionalData.value(key));
3329 entity->getProperties(properties);
3331 switch(entity->getnstType())
3335 properties[
"TYPE"] =
"body";
3342 properties[
"TYPE"] =
"context";
3349 properties[
"TYPE"] =
"switch";
3360 case Qnst::Settings:
3365 properties[
"TYPE"] =
"media";
3373 properties[
"TYPE"] =
"port";
3379 if (edge->getnstType() == Qnst::Reference)
3381 if (edge->getEntityB()->getnstType() == Qnst::Port ||
3382 edge->getEntityB()->getnstType() == Qnst::Property ||
3383 edge->getEntityB()->getnstType() == Qnst::Area)
3385 properties[
"INTERFACE"] = edge->getEntityB()->getnstUid();
3386 properties[
"interface"] = edge->getEntityB()->getnstId();
3388 properties[
"COMPONENT"] = edge->getEntityB()->getnstGraphicsParent()->getnstUid();
3389 properties[
"component"] = edge->getEntityB()->getnstGraphicsParent()->getnstId();
3393 properties[
"COMPONENT"] = edge->getEntityB()->getnstUid();
3394 properties[
"component"] = edge->getEntityB()->getnstId();
3396 properties[
"INTERFACE"] =
"";
3397 properties[
"interface"] =
"";
3410 properties[
"TYPE"] =
"link";
3416 case Qnst::Property:
3417 case Qnst::Aggregator:
3423 case Qnst::SwitchPort:
3425 properties[
"TYPE"] =
"switchPort";
3430 case Qnst::BindParam:
3442 entity->updateToolTip();
3444 emit entityChanged(entity->getnstUid(), properties);
3453 qDebug() <<
"[QNST]" <<
":"
3454 <<
"Requesting entity selection '" + entity->getnstUid() +
"'";
3458 if (entity->isSelected())
3460 if (selected != NULL)
3462 selected->setSelected(
false);
3468 if (!entity->isMedia() && refers.contains(entity->getnstUid()))
3470 qDebug() <<
"========================" <<
"REF" << entity->getnstUid() <<
"->" << refers[entity->getnstUid()];
3471 emit entitySelected(refers[entity->getnstUid()]);
3475 qDebug() <<
"========================" << entity->getnstUid();
3476 emit entitySelected(entity->getnstUid());
3482 void QnstView::performHelp()
3501 void QnstView::performCut()
3503 if (selected != NULL)
3505 if (selected->getnstType() != Qnst::Body)
3507 if (clipboard != NULL)
3509 delete clipboard; clipboard = NULL;
3516 if (clipboard != NULL)
3518 clipboard->setnstId(entity->getnstId());
3520 clipboard->setTop(entity->getTop());
3521 clipboard->setLeft(entity->getLeft());
3522 clipboard->setWidth(entity->getWidth());
3523 clipboard->setHeight(entity->getHeight());
3524 clipboard->setnstGraphicsParent(NULL);
3526 clipboard->setUsrData(entity->getUsrData());
3530 performCopy(e, clipboard);
3533 requestEntityRemotion(selected);
3537 if (e->getnstType() == Qnst::Body ||
3538 e->getnstType() == Qnst::Context ||
3539 e->getnstType() == Qnst::Switch)
3541 e->menu->actionPaste->setEnabled(
true);
3550 QMessageBox::warning(
this,
"Alert",
3551 "You cannot cut a <body> element!");
3556 void QnstView::performCopy()
3558 if (selected != NULL)
3560 if (selected->getnstType() != Qnst::Body)
3562 if (clipboard != NULL)
3564 delete clipboard; clipboard = NULL;
3570 if (clipboard != NULL)
3572 clipboard->setnstId(entity->getnstId());
3573 clipboard->setnstUid(entity->getnstUid());
3575 clipboard->setTop(entity->getTop());
3576 clipboard->setLeft(entity->getLeft());
3577 clipboard->setWidth(entity->getWidth());
3578 clipboard->setHeight(entity->getHeight());
3580 clipboard->setnstGraphicsParent(NULL);
3581 clipboard->setUsrData(entity->getUsrData());
3583 qDebug() <<
"[QNST]" << clipboard->getUsrData();
3586 performCopy(e, clipboard);
3591 if (e->getnstType() == Qnst::Body ||
3592 e->getnstType() == Qnst::Context ||
3593 e->getnstType() == Qnst::Switch)
3595 e->menu->actionPaste->setEnabled(
true);
3605 QMessageBox::warning(
this,
"Alert",
3606 "You cannot copy a <body> element!");
3620 copy->setnstId(entity->getnstId());
3621 copy->setnstUid(entity->getnstUid());
3623 copy->setTop(entity->getTop());
3624 copy->setLeft(entity->getLeft());
3625 copy->setWidth(entity->getWidth());
3626 copy->setHeight(entity->getHeight());
3628 parent->addnstGraphicsEntity(copy);
3630 qDebug() <<
"[QNST]" << entity->getUsrData();
3631 copy->setUsrData(entity->getUsrData());
3635 performCopy(e, copy);
3640 void QnstView::performPaste()
3642 if (clipboard != NULL)
3645 qDebug() <<
"[QNST] performPaste() cliboard userdata = "
3646 << clipboard->getUsrData();
3650 if (copy != NULL && parent != NULL)
3652 if (parent->getnstType() == Qnst::Context ||
3653 parent->getnstType() == Qnst::Switch ||
3654 parent->getnstType() == Qnst::Body)
3661 result = QMessageBox::question(
3664 tr(
"Would you like to make a reference instead?"),
3678 performPaste(copy, parent, (result == 2),
false);
3690 Qnst::EntityType type;
3693 if(entity->isMedia())
3696 type = entity->getnstType();
3699 if(!entityCounter.count(type))
3700 entityCounter[type] = 0;
3711 if (entity->getnstId() == prefix + QString::number(n))
3725 QString::number(n));
3735 bool makeRefer,
bool keepOriginalPos)
3744 updateEntityWithUniqueNstId(entity);
3748 entity->setnstId(copy->getnstId());
3754 entity->setTop(copy->getTop());
3755 entity->setLeft(copy->getLeft());
3759 entity->setTop(parent->getHeight()/2 - copy->getWidth()/2);
3760 entity->setLeft(parent->getWidth()/2 - copy->getHeight()/2);
3764 entity->setWidth(copy->getWidth());
3765 entity->setHeight(copy->getHeight());
3770 performReference(entity, copy);
3772 else if(entity->isMedia())
3778 parent->addnstGraphicsEntity(entity);
3781 entity->setUsrData(copy->getUsrData());
3783 requestEntityAddition(entity);
3785 if(entity->isMedia())
3794 performPaste(e, entity, makeRefer,
true);
3806 if(entity->isMedia())
3820 void QnstView::performDelete()
3822 if (selected != NULL)
3824 if(selected->getncgType() == Qncg::Interface &&
3831 requestEntityRemotion(selected);
3838 void QnstView::performExport()
3840 QString location = QFileDialog::getSaveFileName(NULL,
"Export...",
"", tr(
"Images (*.png)"));
3842 if (location !=
""){
3845 qreal width = scene->width();
3846 qreal height = scene->height();
3850 if (entity->getTop() > top)
3851 top = entity->getTop();
3853 if (entity->getLeft() > left)
3854 left = entity->getLeft();
3856 if (entity->getWidth() < width)
3857 width = entity->getWidth();
3859 if (entity->getHeight() < height)
3860 height = entity->getHeight();
3863 QImage image(width, height, QImage::Format_ARGB32_Premultiplied);
3865 QPainter painter(&image);
3867 scene->render(&painter, QRect(), QRect(left-25,top-25,width+50,height+50));
3871 image.save(location,
"PNG");
3875 void QnstView::performZoomIn()
3883 scale(1 - zoomStep*0.05, 1 - zoomStep*0.05);
3887 void QnstView::performZoomOut()
3889 if (zoomStep*0.05 < 0.9)
3895 scale(1 - zoomStep*0.05, 1 - zoomStep*0.05);
3899 void QnstView::performZoomReset()
3905 void QnstView::performFullscreen()
3910 void QnstView::performBringfront()
3915 void QnstView::performBringforward()
3920 void QnstView::performSendback()
3925 void QnstView::performSendbackward()
3930 void QnstView::performHide()
3935 void QnstView::performProperties()
3940 void QnstView::mouseMoveEvent(QMouseEvent* event)
3944 if (lastLinkMouseOver != NULL)
3946 lastLinkMouseOver->setMouseHover(
false);
3947 lastLinkMouseOver = NULL;
3950 QList<QGraphicsItem *> itemsa = scene->items(link->getLine().p1());
3952 if (itemsa.count() && itemsa.first() == link)
3954 itemsa.removeFirst();
3960 entitya->setMouseHover(
true);
3963 QList<QGraphicsItem*> itemsb = scene->items(link->getLine().p2());
3965 if (itemsb.count() && itemsb.first() == link)
3967 itemsb.removeFirst();
3973 entityb->setMouseHover(
true);
3975 lastLinkMouseOver = entityb;
3978 link->setLine(QLineF(link->getLine().p1(), mapToScene(event->pos())));
3981 QGraphicsView::mouseMoveEvent(event);
3984 void QnstView::mousePressEvent(QMouseEvent* event)
3995 scene->addItem(link);
3996 link->setLine(QLineF(mapToScene(event->pos()), mapToScene(event->pos())));
4003 QGraphicsView::mousePressEvent(event);
4005 if (!event->isAccepted())
4007 if (event->button() == Qt::LeftButton)
4009 if (selected != NULL)
4011 selected->setSelected(
false);
4023 void QnstView::mouseReleaseEvent(QMouseEvent* event)
4027 QList<QGraphicsItem *> itemsa = scene->items(link->getLine().p1());
4029 if (itemsa.count() && itemsa.first() == link)
4030 itemsa.removeFirst();
4032 QList<QGraphicsItem*> itemsb = scene->items(link->getLine().p2());
4034 if (itemsb.count() && itemsb.first() == link)
4035 itemsb.removeFirst();
4037 if (itemsa.count() && itemsb.count())
4042 if (entitya != entityb)
4045 if (entitya->getncgType() == Qncg::Node &&
4046 entityb->getncgType() == Qncg::Node)
4048 addNodetoNodeEdge(entitya, entityb);
4051 else if (entitya->getncgType() == Qncg::Node &&
4052 entityb->getncgType() == Qncg::Interface)
4054 addNodetoInterfaceEdge(entitya, entityb);
4057 else if (entitya->getncgType() == Qncg::Interface &&
4058 entityb->getncgType() == Qncg::Node)
4060 addInterfacetoNodeEdge(entitya, entityb);
4063 else if (entitya->getncgType() == Qncg::Interface &&
4064 entityb->getncgType() == Qncg::Interface)
4066 addInterfacetoInterfaceEdge(entitya, entityb);
4070 entitya->setMouseHover(
false);
4071 entityb->setMouseHover(
false);
4076 scene->removeItem(link);
4087 foreach(entity, entities.values())
4089 assert(entity != NULL);
4090 entity->setDraggable(
false);
4093 QGraphicsView::mouseReleaseEvent(event);
4102 if (parenta != NULL && parentb != NULL)
4104 if (parenta == parentb)
4107 if (entitya->getnstType() == Qnst::Link)
4109 createActionWithDialog(entitya, entityb);
4112 else if (entityb->getnstType() == Qnst::Link)
4114 createConditionWithDialog(entitya, entityb);
4119 createLinkWithDialog(entitya, entityb);
4133 if (parenta != NULL && parentb != NULL)
4135 if (parenta == parentb->getnstGraphicsParent())
4138 if (entitya->getnstType() == Qnst::Link)
4140 createActionWithDialog(entitya, entityb);
4145 createLinkWithDialog(entitya, entityb);
4157 if (entityb->getnstType() == Qnst::Link)
4159 createConditionWithDialog(entitya, entityb);
4164 createLinkWithDialog(entitya, entityb);
4174 if (parenta != NULL && parentb != NULL)
4176 if (parenta == parentb)
4178 if (entitya->getnstType() == Qnst::Port)
4180 createReference(entitya, entityb);
4182 else if (entitya->getnstType() == Qnst::SwitchPort)
4184 createMapping(entitya, entityb);
4187 else if (parenta->getnstGraphicsParent() == parentb && parenta != entityb)
4189 addInterfacetoNodeLink(entitya, entityb);
4202 if (parenta != NULL && parentb != NULL)
4204 if (parenta == parentb->getnstGraphicsParent())
4206 if (entitya->getnstType() == Qnst::Port)
4208 createReference(entitya, entityb);
4210 else if (entitya->getnstType() == Qnst::SwitchPort)
4212 createMapping(entitya, entityb);
4215 else if (parenta->getnstGraphicsParent() == parentb->getnstGraphicsParent())
4217 createLinkWithDialog(entitya, entityb);
4224 QString QnstView::createNewConnector(QString condition, QString action)
4227 conn->setName(
"newConnector"+QString::number(connectors.size()));
4228 conn->addCondition(QUuid::createUuid().toString(),
"onBegin");
4229 conn->addCondition(QUuid::createUuid().toString(),
"onEnd");
4230 conn->addCondition(QUuid::createUuid().toString(),
"onSelection");
4231 conn->addCondition(QUuid::createUuid().toString(),
"onResume");
4232 conn->addCondition(QUuid::createUuid().toString(),
"onPause");
4234 conn->addAction(QUuid::createUuid().toString(),
"start");
4235 conn->addAction(QUuid::createUuid().toString(),
"stop");
4236 conn->addAction(QUuid::createUuid().toString(),
"resume");
4237 conn->addAction(QUuid::createUuid().toString(),
"pause");
4238 conn->addAction(QUuid::createUuid().toString(),
"set");
4240 connectors[conn->getName()] = conn;
4241 connectors2[conn->getnstUid()] = conn;
4243 QMap<QString, QString> properties;
4245 properties[
"TYPE"] =
"complex-connector";
4247 properties[
"id"] = conn->getName();
4249 if (!action.isEmpty())
4251 properties[
"action"] = action;
4253 QString UID = conn->getActions().key(action, QUuid::createUuid().toString());
4255 properties[
"actionUID"] = UID;
4258 if (!condition.isEmpty())
4260 properties[
"condition"] = condition;
4262 QString UID = conn->getConditions().key(action, QUuid::createUuid().toString());
4264 properties[
"conditionUID"] = UID;
4267 emit entityAdded(conn->getnstUid(),
"", properties);
4269 return conn->getName();
4279 if (parenta != NULL && parentb != NULL)
4286 QPointF pointa(entitya->getLeft() + entitya->getWidth()/2,
4287 entitya->getTop() + entitya->getHeight()/2);
4289 QPointF pointb(entityb->getLeft() + entityb->getWidth()/2,
4290 entityb->getTop() + entityb->getHeight()/2);
4292 if(entitya->getncgType() == Qncg::Interface &&
4293 entityb->getncgType() == Qncg::Interface)
4298 super->addnstGraphicsEntity(linkDot);
4300 pointa = super->mapFromItem(parenta, pointa);
4301 pointb = super->mapFromItem(parentb, pointb);
4303 else if(entitya->getncgType() == Qncg::Node &&
4304 entityb->getncgType() == Qncg::Interface)
4307 parenta->addnstGraphicsEntity(linkDot);
4309 pointb = parenta->mapFromItem(parentb, pointb);
4311 else if(entitya->getncgType() == Qncg::Interface &&
4312 entityb->getncgType() == Qncg::Node)
4315 parentb->addnstGraphicsEntity(linkDot);
4317 pointa = parentb->mapFromItem(parenta, pointa);
4323 parenta ->addnstGraphicsEntity(linkDot);
4326 QLineF l(pointa, pointb);
4328 if (pointa.x() <= pointb.x() && pointa.y() <= pointb.y())
4330 qreal angle = (l.angle() - 270);
4331 qreal rangle = angle*PI/180;
4335 pointa.setX(pointa.x() + entitya->getWidth()/2);
4336 pointa.setY(pointa.y() + ((entitya->getWidth()/2)/tan(rangle)));
4338 pointb.setX(pointb.x() - entityb->getWidth()/2);
4339 pointb.setY(pointb. y() - ((entityb->getWidth()/2)/tan(rangle)));
4343 pointa.setX(pointa.x() + ((entitya->getHeight()/2)*tan(rangle)));
4344 pointa.setY(pointa.y() + entitya->getHeight()/2);
4346 pointb.setX(pointb.x() - ((entityb->getHeight()/2)*tan(rangle)));
4347 pointb.setY(pointb.y() - entityb->getHeight()/2);
4350 xcenter = pointa.x() + (pointb.x() - pointa.x())/2;
4351 ycenter = pointa.y() + (pointb.y() - pointa.y())/2;
4353 else if (pointa.x() > pointb.x() && pointa.y() < pointb.y())
4355 qreal angle = (270 - l.angle());
4356 qreal rangle = angle*PI/180;
4360 pointa.setX(pointa.x() - entitya->getWidth()/2);
4361 pointa.setY(pointa.y() + ((entitya->getWidth()/2)/tan(rangle)));
4363 pointb.setX(pointb.x() + entityb->getWidth()/2);
4364 pointb.setY(pointb.y() - ((entityb->getWidth()/2)/tan(rangle)));
4368 pointa.setX(pointa.x() - ((entitya->getHeight()/2)*tan(rangle)));
4369 pointa.setY(pointa.y() + entitya->getHeight()/2);
4371 pointb.setX(pointb.x() + ((entityb->getHeight()/2)*tan(rangle)));
4372 pointb.setY(pointb.y() - entityb->getHeight()/2);
4375 xcenter = pointb.x() + (pointa.x() - pointb.x())/2;
4376 ycenter = pointa.y() + (pointb.y() - pointa.y())/2;
4378 else if (pointa.x() < pointb.x() && pointa.y() > pointb.y())
4380 qreal angle = l.angle();
4381 qreal rangle = angle*PI/180;
4385 pointa.setX(pointa.x() + entitya->getWidth()/2);
4386 pointa.setY(pointa.y() - ((entitya->getWidth()/2)*tan(rangle)));
4388 pointb.setX(pointb.x() - entityb->getWidth()/2);
4389 pointb.setY(pointb.y() + ((entityb->getWidth()/2)*tan(rangle)));
4393 pointa.setX(pointa.x() + ((entitya->getHeight()/2)/tan(rangle)));
4394 pointa.setY(pointa.y() - entitya->getHeight()/2);
4396 pointb.setX(pointb.x() - ((entityb->getHeight()/2)/tan(rangle)));
4397 pointb.setY(pointb.y() + entityb->getHeight()/2);
4400 xcenter = pointa.x() + (pointb.x() - pointa.x())/2;
4401 ycenter = pointb.y() + (pointa.y() - pointb.y())/2;
4403 else if (pointa.x() > pointb.x() && pointa.y() > pointb.y())
4405 qreal angle = l.angle() - 90;
4406 qreal rangle = angle*PI/180;
4410 pointa.setX(pointa.x() - entitya->getWidth()/2);
4411 pointa.setY(pointa.y() - ((entitya->getWidth()/2)/tan(rangle)));
4413 pointb.setX(pointb.x() + entityb->getWidth()/2);
4414 pointb.setY(pointb.y() + ((entityb->getWidth()/2)/tan(rangle)));
4418 pointa.setX(pointa.x() - ((entitya->getHeight()/2)*tan(rangle)));
4419 pointa.setY(pointa.y() - entitya->getHeight()/2);
4421 pointb.setX(pointb.x() + ((entityb->getHeight()/2)*tan(rangle)));
4422 pointb.setY(pointb.y() + entityb->getHeight()/2);
4425 xcenter = pointb.x() + (pointa.x() - pointb.x())/2;
4426 ycenter = pointb.y() + (pointa.y() - pointb.y())/2;
4429 linkDot->setTop(ycenter - DEFAULT_AGGREGATOR_HEIGHT/2);
4430 linkDot->setLeft(xcenter - DEFAULT_AGGREGATOR_WIDTH/2);
4431 linkDot->setWidth(DEFAULT_AGGREGATOR_WIDTH);
4432 linkDot->setHeight(DEFAULT_AGGREGATOR_HEIGHT);
4435 updateEntityWithUniqueNstId(linkDot);
4437 linkDot->setxConnector(connName);
4438 if(connectors.contains(connName))
4439 linkDot->setxConnectorUID(connectors[connName]->getnstUid());
4441 requestEntityAddition(linkDot);
4455 if (parenta != NULL && parentb != NULL)
4460 if (entity->getnstType() == Qnst::Reference)
4464 if (entitya == edge->getEntityA()){
4465 if (edge->getEntityA()->getncgType() == Qncg::Node)
4469 else if (edge->getEntityA()->getncgType() == Qncg::Interface)
4474 if (edge->getEntityB()->getncgType() == Qncg::Node)
4479 else if (edge->getEntityB()->getncgType() == Qncg::Interface)
4484 parenta->removenstGraphicsEntity(edge);
delete (edge);
4492 entity->setEntityA(entitya);
4493 entity->setEntityB(entityb);
4496 parenta->addnstGraphicsEntity(entity);
4500 if (entityb->getncgType() == Qncg::Node)
4502 else if (entityb->getncgType() == Qncg::Interface)
4505 requestEntityChange(entitya);
4515 if (parenta != NULL && parentb != NULL)
4518 QMap<QString, QString> properties;
4520 properties[
"TYPE"] =
"mapping";
4523 entity->setEntityA(entitya);
4524 entity->setEntityB(entityb);
4528 if (entityb->getncgType() == Qncg::Node)
4530 properties[
"component"] = entityb->getnstId();
4531 properties[
"componentUID"] = entityb->getnstUid();
4533 entity->setComponent(properties[
"component"]);
4534 entity->setComponentUid(properties[
"componentUID"]);
4538 else if (entityb->getncgType() == Qncg::Interface)
4540 properties[
"component"] = parentb->getnstId();
4541 properties[
"componentUID"] = parentb->getnstUid();
4542 properties[
"interface"] = entityb->getnstId();
4543 properties[
"interfaceUID"] = entityb->getnstUid();
4546 entity->setComponent(properties[
"component"]);
4547 entity->setComponentUid(properties[
"componentUID"]);
4548 entity->setInterface(properties[
"interface"]);
4549 entity->setInterfaceUid(properties[
"interfaceUID"]);
4554 parenta->addnstGraphicsEntity(entity);
4558 entity->setSwitchPortUid(entitya->getnstUid());
4560 entities[entity->getnstUid()] = entity;
4563 emit entityAdded(entity->getnstUid(), entitya->getnstUid(), properties);
4570 actionDialog->init(connectors, links[entitya->getnstUid()]);
4572 if (actionDialog->exec())
4574 QString link = actionDialog->form.cbLink->currentText();
4575 QString act = actionDialog->form.cbAction->currentText();
4580 if (actionDialog->form.cbConnector->currentText() ==
"New...")
4581 connName = createNewConnector(
"", act);
4583 connName = actionDialog->form.cbConnector->currentText();
4586 if (link ==
"New...")
4588 createLink(entitya, entityb, connName);
4601 if(connectors.contains(connName))
4602 bind->setConn(connectors[connName]);
4604 link->addAction(bind);
4612 conditionDialog->init(connectors, links[entityb->getnstUid()]);
4614 if (conditionDialog->exec())
4616 QString link = conditionDialog->form.cbLink->currentText();
4617 QString cond = conditionDialog->form.cbCondition->currentText();
4622 if (conditionDialog->form.cbConnector->currentText() ==
"New...")
4623 connName = createNewConnector(cond,
"");
4625 connName = conditionDialog->form.cbConnector->currentText();
4628 if (link ==
"New...")
4630 createLink(entitya, entityb, connName);
4642 if(connectors.contains(connName))
4643 bind->setConn(connectors[connName]);
4645 link->addCondition(bind);
4653 linkDialog->init(connectors);
4655 if (linkDialog->exec())
4657 QString con = linkDialog->form.cbCondition->currentText();
4658 QString act = linkDialog->form.cbAction->currentText();
4660 if (con !=
"" && act !=
"")
4665 if (linkDialog->getCurrentConnector() ==
"New...")
4666 connName = createNewConnector(con, act);
4668 connName = linkDialog->getCurrentConnector();
4685 if(connectors.contains(connName))
4687 action->setConn(connectors[connName]);
4688 condition->setConn(connectors[connName]);
4691 link->addAction(action);
4692 link->addCondition(condition);
4701 bool notifyCreation)
4706 bind->setLink(link);
4707 bind->setTarget(target);
4709 parent->addnstGraphicsEntity(bind);
4712 if (!condition.isEmpty())
4714 bind->setRole(condition);
4719 bind->setRole(action);
4723 link->addnstGraphicsEdge(bind);
4727 if(target->getncgType() == Qncg::Node)
4729 bind->setComponent(target->getnstId());
4730 bind->setComponentUid(target->getnstUid());
4732 else if(target->getncgType() == Qncg::Interface)
4736 bind->setComponent(targetParent->getnstId());
4737 bind->setComponentUid(targetParent->getnstUid());
4738 bind->setInterface(target->getnstId());
4739 bind->setInterfaceUid(target->getnstUid());
4746 SIGNAL(bindParamAdded(QString,
4748 QMap<QString, QString>)),
4750 SLOT(requestBindParamAdjust(QString,
4752 QMap<QString, QString>)));
4755 SIGNAL(bindParamUpdated(QString,
4756 QMap<QString,QString>,
4757 QMap<QString,QString>)),
4759 SLOT(updateBindParams(QString,
4760 QMap<QString,QString>,
4761 QMap<QString,QString>)));
4764 requestEntityAddition(bind);
4771 void QnstView::keyPressEvent(QKeyEvent *event)
4774 if (event->modifiers() == Qt::ControlModifier &&
event->key() == Qt::Key_X)
4781 else if (event->modifiers() == Qt::ControlModifier &&
4782 event->key() == Qt::Key_C)
4789 else if (event->modifiers() == Qt::ControlModifier &&
4790 event->key() == Qt::Key_V)
4797 else if (event->key() == Qt::Key_Delete)
4804 else if (event->key() == Qt::Key_Backspace)
4811 else if (event->key() == Qt::Key_Shift)
4813 if (selected != NULL)
4815 selected->setSelected(
false);
4824 else if(event->key() == Qt::Key_Control)
4828 foreach(entity, entities.values())
4830 entity->setDraggable(
true);
4836 else if( event->modifiers() == Qt::ControlModifier &&
4837 event->key() == Qt::Key_0)
4842 else if((event->modifiers() == Qt::ControlModifier ||
4843 event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) &&
4844 event->key() == Qt::Key_Plus)
4851 else if(event->modifiers() == Qt::ControlModifier &&
4852 event->key() == Qt::Key_Minus)
4875 if(!event->isAccepted())
4876 QGraphicsView::keyPressEvent(event);
4879 void QnstView::keyReleaseEvent(QKeyEvent *event)
4882 if (event->key() == Qt::Key_Shift)
4886 else if(event->key() == Qt::Key_Control)
4889 foreach(entity, entities.values())
4891 entity->setDraggable(
false);
4895 QGraphicsView::keyReleaseEvent(event);
4898 void QnstView::wheelEvent(QWheelEvent * event)
4900 if(event->modifiers() == Qt::ControlModifier)
4903 int numDegrees =
event->delta() / 8;
4904 int numSteps = numDegrees / 15;
4905 _numScheduledScalings += numSteps;
4906 if (_numScheduledScalings * numSteps < 0)
4907 _numScheduledScalings = numSteps;
4909 QTimeLine *anim =
new QTimeLine(350,
this);
4910 anim->setUpdateInterval(20);
4912 connect(anim, SIGNAL(valueChanged(qreal)), SLOT(scalingTime(qreal)));
4913 connect(anim, SIGNAL(finished()), SLOT(animFinished()));
4916 if (event->delta() > 0)
4927 QGraphicsView::wheelEvent(event);
4931 void QnstView::scalingTime(qreal x)
4933 qreal factor = 1.0 + qreal(_numScheduledScalings) / 500.0;
4934 scale(factor, factor);
4937 void QnstView::animFinished()
4939 if (_numScheduledScalings > 0)
4940 _numScheduledScalings--;
4942 _numScheduledScalings++;
4943 sender()->~QObject();
4947 void QnstView::focusOutEvent(QFocusEvent *event)
4950 foreach(entity, entities.values())
4952 entity->setDraggable(
false);
4961 if(entitya == NULL || entityb == NULL)
return;
4967 if(edge->getEntityB() == entityb)
4971 edge->setAngle(angle);
4976 edge->setAngle(-angle);
4986 void QnstView::requestBindParamAdjust(QString uid, QString parent,
4987 QMap<QString, QString> properties)
4989 properties[
"TYPE"] =
"bindParam";
4991 if (!properties[
"name"].isEmpty() && !properties[
"value"].isEmpty())
4993 if (bindParamUIDToBindUID.contains(uid))
4995 emit entityChanged(uid, properties);
4999 bindParamUIDToBindUID[uid] = parent;
5000 emit entityAdded(uid, parent, properties );
5003 else if (!properties[
"name"].isEmpty())
5005 bindParamUIDToBindUID.remove(uid);
5007 emit entityRemoved(uid);
5011 void QnstView::updateBindParams(QString bindUID, QMap<QString, QString> params,
5012 QMap<QString, QString> name_uids)
5014 if (binds.contains(bindUID))
5016 binds[bindUID]->setParams(params);
5017 binds[bindUID]->setNamesUIDs(name_uids);
5021 void QnstView::markError(QString uid, QString msg)
5025 if(entities.contains(uid))
5027 entity = entities[uid];
5028 }
else if (binds.contains(uid)){
5034 entity->setError(
true);
5035 entity->setErrorMsg(msg);
5036 entity->updateToolTip();
5040 void QnstView::clearValidationErrors()
5044 assert(entity != NULL);
5045 entity->setError(
false);
5050 assert(bind != NULL);
5051 bind->setError(
false);
5055 void QnstView::clearAllData()
5057 if(scene->getRoots().size())
5058 scene->removeRoot(scene->getRoots().at(0));
5064 importBases.clear();
5066 bindParamUIDToBindUID.clear();
5069 connectors2.clear();
5071 deletePendingEntities();
5074 void QnstView::traceRefers()
5076 qDebug() <<
"#### TRACING REFER ####";
5077 foreach(QString key, refers.keys())
5079 assert(refers[key] != NULL);
5080 if(entities.contains(key))
5081 qDebug() << key << refers[key];
5083 qDebug() <<
"WARNING! This entity " + key +
" is inside refer, but not in the entities map.";
5085 qDebug() <<
"#### END TRACING REFER ####" << endl;
5088 void QnstView::traceEntities()
5090 qDebug() <<
"#### TRACING ENTITIES ####";
5091 foreach(QString key, entities.keys())
5093 assert(entities[key] != NULL);
5094 assert(entities[key] != entities[key]->getnstGraphicsParent());
5097 << QString().sprintf(
"%p", entities.value(key))
5098 << entities[key]->getnstType()
5101 if(entities[key]->getnstGraphicsParent())
5107 << QString().sprintf(
"%p", e)
5112 qDebug() <<
"#### END TRACING ENTITIES ####" << endl;
5115 void QnstView::traceConnectors()
5117 qDebug() <<
"#### TRACING CONNECTORS ####";
5118 foreach(QString key, connectors.keys())
5120 assert(connectors[key] != NULL);
5123 qDebug() << key << connectors[key] << connectors[key]->getConditions() << connectors[key]->getActions();
5125 qDebug() << key << (int)connectors[key] << connectors[key]->getConditions() << connectors[key]->getActions();
5128 qDebug() <<
"#### END TRACING CONNECTORS ####" << endl;
5131 void QnstView::traceConnectors2()
5133 qDebug() <<
"#### TRACING CONNECTORS2 ####";
5134 foreach(QString key, connectors2.keys())
5136 assert(connectors2[key] != NULL);
5139 qDebug() << key << connectors2[key] << connectors2[key]->getConditions() << connectors2[key]->getActions();
5141 qDebug() << key << (int)connectors2[key] << connectors2[key]->getConditions() << connectors2[key]->getActions();
5144 qDebug() <<
"#### END TRACING CONNECTORS2 ####" << endl;
5147 void QnstView::deletePendingEntities()
5163 if (c->hasCondition(uid) || c->hasAction(uid))