sceneCounter = 0;
}
-bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
+bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2) {
ConnectedInterface* ref1 = iface1->refInter;
ConnectedInterface* ref2 = iface2->refInter;
- ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface();
- ConnectedInterface* asso2 = iface2->refInter->getAssociatedIface();
+ ConnectedInterface* asso1 = (ConnectedInterface*)(iface1->refInter->getAssociatedIface());
+ ConnectedInterface* asso2 = (ConnectedInterface*)(iface2->refInter->getAssociatedIface());
// connect both interface
bool ok1 = false;
// test the ref1->ref2 connection
if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) {
ref1->connectTo(ref2);
+ /*
ref2->connectFrom(ref1);
if ((asso1 != NULL) && (asso2 != NULL)) {
asso1->connectTo(asso2);
asso2->connectFrom(asso1);
}
+ */
ok1 = true;
}
// if the frist one did not work, test ref2->ref1
if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {
ref2->connectTo(ref1);
+ /*
ref1->connectFrom(ref2);
if ((asso1 != NULL) && (asso2 != NULL)) {
asso1->connectFrom(asso2);
asso2->connectTo(asso1);
}
+ */
ok2 = true;
}
if ((ok1 == true) || (ok2 == true)) {
// process the special case source->group apart
if (fromIfaceItem->getOwner()->isSourceItem()) {
// remove from graph
- fromInter->removeConnectedTo(toInter);
- toInter->clearConnectedFrom();
+ fromInter->disconnectTo(toInter);
// remove from scene
fromIfaceItem->removeConnectionItem(conn);
toIfaceItem->removeConnectionItem(conn);
#ifdef DEBUG
cout << "removing connections from graph ..." ;
#endif
- if (fromInter->getDirection() == AbstractInterface::InOut) {
- fromInter->clearConnectedTo();
- fromInter->clearConnectedFrom();
- toInter->clearConnectedTo();
- toInter->clearConnectedFrom();
- }
- else {
- fromInter->removeConnectedTo(toInter);
- toInter->clearConnectedFrom();
- }
+ fromInter->disconnectTo(toInter);
+
#ifdef DEBUG
cout << "done." << endl ;
#endif
#endif
if (groupIfaceItem != NULL) {
+
+ bool groupInterRemove = false;
+ if ((groupIfaceItem->nter->isConnectedTo() == false) && (groupInter->isConnectedFrom() == false)) groupInterRemove = true;
+
ConnectedInterface* groupInter = groupIfaceItem->refInter;
groupItem->removeInterface(groupIfaceItem);
// creating/adding the group control interface in the graph model
GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control);
groupCtlInter->setAssociatedIface(groupInter);
- parentItem->getRefBlock()->addInterface(groupCtlInter);
-
- // connect both interface
- bool ok = true;
- if (refInter->getDirection() == AbstractInterface::Output) {
- ok = refInter->connectTo(groupInter);
- ok = ok & groupInter->connectFrom(refInter);
- }
- else if (refInter->getDirection() == AbstractInterface::Input) {
- ok = groupInter->connectTo(refInter);
- ok = ok & refInter->connectFrom(groupInter);
- }
- else if (refInter->getDirection() == AbstractInterface::InOut) {
- ok = refInter->connectTo(groupInter);
- ok = ok & groupInter->connectFrom(refInter);
- ok = ok & groupInter->connectTo(refInter);
- ok = ok & refInter->connectFrom(groupInter);
- }
- if (!ok) {
- cerr << "abnormal case while connecting a block iface to its parent group" << endl;
- }
+ parentItem->getRefBlock()->addInterface(groupCtlInter);
// creating/adding the group interface in the current scene model, and connection item
InterfaceItem *groupIfaceItem = new InterfaceItem(0,item->getOrientation(),groupInter,parentItem,params);
parentItem->addInterface(groupIfaceItem,true);
- parentItem->getScene()->createConnectionItem(item, groupIfaceItem);
+ // creating the connection, in graph and with an item
+ createConnection(item, groupIfaceItem);
// if groupItem is not topGroup, must also add a new interface to the parent BlockItem
BoxItem* parent2Item = parentItem->getParentItem();