1 // Copyright (C) 2006-2013 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "SceneBlocItem.hxx"
24 #include "SceneComposedNodeItem.hxx"
25 #include "SceneElementaryNodeItem.hxx"
26 #include "SceneHeaderItem.hxx"
27 #include "SceneHeaderNodeItem.hxx"
28 #include "SceneInPortItem.hxx"
29 #include "SceneOutPortItem.hxx"
30 #include "SceneLinkItem.hxx"
31 #include "SceneDSLinkItem.hxx"
32 #include "SceneCtrlLinkItem.hxx"
33 #include "SceneProgressItem.hxx"
34 #include "LinkMatrix.hxx"
35 #include "LinkAStar.hxx"
36 #include "ItemMimeData.hxx"
37 #include "QtGuiContext.hxx"
39 #include "Message.hxx"
40 #include "guiObservers.hxx"
41 #include "GuiEditor.hxx"
46 #include <QGraphicsSceneDragDropEvent>
50 #include "Resource.hxx"
53 #include "YacsTrace.hxx"
56 using namespace YACS::ENGINE;
57 using namespace YACS::HMI;
59 SceneComposedNodeItem::SceneComposedNodeItem(QGraphicsScene *scene, SceneItem *parent,
60 QString label, Subject *subject)
61 : SceneNodeItem(scene, parent, label, subject)
63 DEBTRACE("SceneComposedNodeItem::SceneComposedNodeItem " <<label.toStdString());
65 _width = 2*Resource::Corner_Margin + 2*Resource::DataPort_Width + Resource::Space_Margin;
66 _height = Resource::Header_Height + Resource::DataPort_Height + Resource::Corner_Margin;
68 _hiBrushColor = Resource::ComposedNode_hiBrush;
69 _penColor = Resource::ComposedNode_pen;
70 _hiPenColor = Resource::ComposedNode_hiPen;
76 SceneComposedNodeItem::~SceneComposedNodeItem()
80 void SceneComposedNodeItem::adjustColors()
82 _brushColor = Resource::ComposedNode_brush.darker(100 +5*_level);
83 for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
85 if (SceneComposedNodeItem *scnode = dynamic_cast<SceneComposedNodeItem*>(*it))
86 scnode->adjustColors();
90 QRectF SceneComposedNodeItem::childrenBoundingRect() const
92 QRectF ChildrenBRect =QRectF(x(), y(), 5, 5);
93 if (_header) ChildrenBRect = _header->getMinimalBoundingRect();
94 for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
95 ChildrenBRect = ChildrenBRect.united(childBoundingRect(*it));
96 ChildrenBRect.setWidth (ChildrenBRect.width() + Resource::Border_Margin);
97 ChildrenBRect.setHeight(ChildrenBRect.height() + Resource::Border_Margin);
101 void SceneComposedNodeItem::paint(QPainter *painter,
102 const QStyleOptionGraphicsItem *option,
105 //DEBTRACE("SceneComposedNodeItem::paint " << _label.toStdString());
106 // IMN (14/11/2013) below block commented
107 // prevent bad resizing of scene in shrink mode
108 /* if (!isExpanded()) {
109 _width = 2*Resource::Corner_Margin + 2*Resource::DataPort_Width + Resource::Space_Margin;
110 _height = getHeaderBottom() + Resource::Corner_Margin;
114 painter->setPen(getPenColor());
115 painter->setBrush(getBrushColor());
116 painter->drawRect(QRectF(Resource::Border_Margin, Resource::Border_Margin, _width - 2*Resource::Border_Margin, _height - 2*Resource::Border_Margin));
120 void SceneComposedNodeItem::update(GuiEvent event, int type, Subject* son)
122 DEBTRACE("SceneComposedNodeItem::update "<< eventName(event)<<" "<<type<<" "<<son);
123 SceneNodeItem::update(event, type, son);
124 AbstractSceneItem *item;
130 case YACS::HMI::BLOC:
131 item = new SceneBlocItem(_scene,
133 son->getName().c_str(),
136 autoPosNewChild(item, _children, true);
138 case YACS::HMI::FORLOOP:
139 case YACS::HMI::WHILELOOP:
140 case YACS::HMI::SWITCH:
141 case YACS::HMI::FOREACHLOOP:
142 case YACS::HMI::OPTIMIZERLOOP:
143 item = new SceneComposedNodeItem(_scene,
145 son->getName().c_str(),
148 if ( !QtGuiContext::getQtCurrent()->isEdition()
149 && (type == YACS::HMI::FORLOOP || type == YACS::HMI::FOREACHLOOP) )
151 item->addProgressItem();
153 autoPosNewChild(item, _children, true);
155 case YACS::HMI::PYTHONNODE:
156 case YACS::HMI::PYFUNCNODE:
157 case YACS::HMI::CORBANODE:
158 case YACS::HMI::CPPNODE:
159 case YACS::HMI::SALOMENODE:
160 case YACS::HMI::SALOMEPYTHONNODE:
161 case YACS::HMI::XMLNODE:
162 case YACS::HMI::PRESETNODE:
163 case YACS::HMI::OUTNODE:
164 case YACS::HMI::STUDYINNODE:
165 case YACS::HMI::STUDYOUTNODE:
166 item = new SceneElementaryNodeItem(_scene,
168 son->getName().c_str(),
171 autoPosNewChild(item, _children, true);
173 case YACS::HMI::INPUTPORT:
174 case YACS::HMI::INPUTDATASTREAMPORT:
175 item = new SceneInPortItem(_scene,
177 son->getName().c_str(),
179 _header->autoPosNewPort(item);
180 _inPorts.push_back(item);
181 if (Scene::_autoComputeLinks && !QtGuiContext::getQtCurrent()->isLoading())
183 YACS::HMI::SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
184 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[subproc];
185 SceneComposedNodeItem *proc = dynamic_cast<SceneComposedNodeItem*>(item);
186 proc->rebuildLinks();
189 case YACS::HMI::OUTPUTPORT:
190 case YACS::HMI::OUTPUTDATASTREAMPORT:
191 item = new SceneOutPortItem(_scene,
193 son->getName().c_str(),
195 _header->autoPosNewPort(item);
196 _outPorts.push_back(item);
197 if (Scene::_autoComputeLinks && !QtGuiContext::getQtCurrent()->isLoading())
199 YACS::HMI::SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
200 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[subproc];
201 SceneComposedNodeItem *proc = dynamic_cast<SceneComposedNodeItem*>(item);
202 proc->rebuildLinks();
206 DEBTRACE("SceneComposedNodeItem::update() ADD, type not handled:" << type);
209 case YACS::HMI::ADDLINK:
212 case YACS::HMI::DATALINK:
213 if (SubjectLink* slink = dynamic_cast<SubjectLink*>(son))
215 SubjectDataPort* soutp = slink->getSubjectOutPort();
216 SubjectDataPort* sinp = slink->getSubjectInPort();
217 SceneItem * scout = QtGuiContext::getQtCurrent()->_mapOfSceneItem[soutp];
218 SceneItem * scin = QtGuiContext::getQtCurrent()->_mapOfSceneItem[sinp];
219 ScenePortItem* from = dynamic_cast<ScenePortItem*>(scout);
220 ScenePortItem* to = dynamic_cast<ScenePortItem*>(scin);
221 if (dynamic_cast<SubjectInputDataStreamPort*>(sinp))
223 SceneDSLinkItem* item = new SceneDSLinkItem(_scene,
226 son->getName().c_str(),
232 SceneLinkItem* item = new SceneLinkItem(_scene,
235 son->getName().c_str(),
239 if (Scene::_autoComputeLinks && !QtGuiContext::getQtCurrent()->isLoading())
241 YACS::HMI::SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
242 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[subproc];
243 SceneComposedNodeItem *proc = dynamic_cast<SceneComposedNodeItem*>(item);
244 proc->rebuildLinks();
250 case YACS::HMI::ADDCONTROLLINK:
253 case YACS::HMI::CONTROLLINK:
254 if (SubjectControlLink* slink = dynamic_cast<SubjectControlLink*>(son))
256 SubjectNode* soutn = slink->getSubjectOutNode();
257 SubjectNode* sinn = slink->getSubjectInNode();
258 SceneItem * scout = QtGuiContext::getQtCurrent()->_mapOfSceneItem[soutn];
259 SceneItem * scin = QtGuiContext::getQtCurrent()->_mapOfSceneItem[sinn];
260 SceneNodeItem* nodefrom = dynamic_cast<SceneNodeItem*>(scout);
261 SceneNodeItem* nodeto = dynamic_cast<SceneNodeItem*>(scin);
262 if (!nodeto || !nodefrom) DEBTRACE("CONTROLLINK problem -----------------");
263 ScenePortItem* from = nodefrom->getCtrlOutPortItem();
264 ScenePortItem* to = nodeto->getCtrlInPortItem();
265 if (!to || !from) DEBTRACE("CONTROLLINK problem -----------------");
266 SceneCtrlLinkItem* item = new SceneCtrlLinkItem(_scene,
269 son->getName().c_str(),
272 if (Scene::_autoComputeLinks && !QtGuiContext::getQtCurrent()->isLoading())
274 YACS::HMI::SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
275 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[subproc];
276 SceneComposedNodeItem *proc = dynamic_cast<SceneComposedNodeItem*>(item);
277 proc->rebuildLinks();
283 case YACS::HMI::REMOVE:
284 //SceneObserverItem::update(event, type, son);
286 case YACS::HMI::SETCASE:
288 SubjectSwitch *sSwitch = dynamic_cast<SubjectSwitch*>(_subject);
291 Switch *aSwitch = dynamic_cast<Switch*>(sSwitch->getNode());
292 Node *node = aSwitch->edGetNode(type);
295 if (GuiContext::getCurrent()->_mapOfSubjectNode.count(node))
297 Subject* sub = GuiContext::getCurrent()->_mapOfSubjectNode[node];
298 if (QtGuiContext::getQtCurrent()->_mapOfSceneItem.count(sub))
300 SceneItem* item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[sub];
301 SceneNodeItem *scnode = dynamic_cast<SceneNodeItem*>(item);
302 if (scnode) scnode->updateName();
311 SceneItem * sinode = QtGuiContext::getQtCurrent()->_mapOfSceneItem[son];
312 removeChildFromList(sinode);
315 case YACS::HMI::PASTE:
317 SceneItem * sinode = QtGuiContext::getQtCurrent()->_mapOfSceneItem[son];
318 sinode->setParent(this);
320 if (SceneComposedNodeItem *scnode = dynamic_cast<SceneComposedNodeItem*>(sinode))
321 scnode->adjustColors();
322 autoPosNewChild(sinode, _children, true);
327 if (dynamic_cast<SubjectForLoop*>(son) || dynamic_cast<SubjectForEachLoop*>(son))
329 if (SceneProgressItem* spitem = getProgressItem())
330 spitem->setProgress(son->getProgress().c_str());
336 // DEBTRACE("SceneComposedNodeItem::update(), event not handled: "<< eventName(event));
340 void SceneComposedNodeItem::autoPosNewChild(AbstractSceneItem *item,
341 const std::list<AbstractSceneItem*> alreadySet,
344 SceneItem *it = dynamic_cast<SceneItem*>(item);
348 qreal xLeft = Resource::Corner_Margin;
349 qreal yTop = getHeaderBottom() + Resource::Space_Margin;
350 for (list<AbstractSceneItem*>::const_iterator it=alreadySet.begin(); it!=alreadySet.end(); ++it)
352 childrenBox = childrenBox.united(childBoundingRect(*it));
353 DEBTRACE((*it)->getLabel().toStdString());
354 DEBTRACE("childrenBox valid " << childrenBox.right() << " " << childrenBox.bottom());
356 if (childrenBox.isValid())
357 yTop = childrenBox.bottom() + 1.; // +1. to avoid collision with bottom (penwidth)
358 //xLeft += childrenBox.right();
359 DEBTRACE("left, top " << xLeft << " " << yTop);
360 QPointF topLeft(xLeft, yTop);
361 if (isNew) _children.push_back(item);
362 if (_eventPos.isNull())
364 //DEBTRACE("_eventPos.isNull");
365 item->setTopLeft(topLeft);
369 //DEBTRACE("_eventPos " << _eventPos.x() << " " << _eventPos.y());
370 item->setTopLeft(_eventPos);
372 collisionResolv(it, -it->boundingRect().bottomRight()); // as if the new item was coming from top left (previous position outside)
373 if (Scene::_autoComputeLinks && !QtGuiContext::getQtCurrent()->isLoading()) rebuildLinks();
378 void SceneComposedNodeItem::popupMenu(QWidget *caller, const QPoint &globalPos)
381 m.popupMenu(caller, globalPos);
384 std::list<AbstractSceneItem*> SceneComposedNodeItem::getChildren()
389 void SceneComposedNodeItem::removeChildFromList(AbstractSceneItem* child)
391 _children.remove(child);
394 void SceneComposedNodeItem::reorganizeShrinkExpand() {
395 DEBTRACE("SceneComposedNodeItem::reorganizeShrinkExpand " << _expanded << " " << _label.toStdString());
396 bool isExpanding = isExpanded();
398 //update control links
399 std::list<SubjectControlLink*> lscl=dynamic_cast<SubjectNode*>(_subject)->getSubjectControlLinks();
400 for (std::list<SubjectControlLink*>::const_iterator it = lscl.begin(); it != lscl.end(); ++it) {
401 SceneLinkItem* lk = dynamic_cast<SceneLinkItem*>(QtGuiContext::getQtCurrent()->_mapOfSceneItem[*it]);
403 bool b1 = true, b2 = true;
405 SceneNodeItem* no = lk->getFromNode();
407 SceneComposedNodeItem* scni = dynamic_cast<SceneComposedNodeItem*>(no);
413 no = lk->getToNode();
415 SceneComposedNodeItem* scni = dynamic_cast<SceneComposedNodeItem*>(no);
430 shrinkExpandRecursive(isExpanding, true);
431 if (Scene::_autoComputeLinks)
433 SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
434 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[subproc];
435 SceneComposedNodeItem *proc = dynamic_cast<SceneComposedNodeItem*>(item);
436 proc->rebuildLinks();
440 void SceneComposedNodeItem::shrinkExpandRecursive(bool isExpanding, bool fromHere)
442 DEBTRACE("SceneComposedNodeItem::shrinkExpandRecursive " << isExpanding << " " << fromHere << " " << isExpanded() << " " << _label.toStdString());
445 { // ---collapsing: hide first children , then resize
446 for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
448 SceneItem* item = dynamic_cast<SceneItem*>(*it);
449 item->shrinkExpandRecursive(false, false);
451 DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
452 item->shrinkExpandLink(false);
455 if (_shownState == expandShown)
457 _expandedWidth = _width;
458 _expandedHeight = _height;
463 _shownState = shrinkShown;
467 _ancestorShrinked = true;
468 _shownState = shrinkHidden;
471 _width = 2*Resource::Corner_Margin + 2*Resource::DataPort_Width + Resource::Space_Margin;
472 if (_shownState == shrinkShown)
473 _height = getHeaderBottom() + Resource::Corner_Margin;
475 _height = Resource::Header_Height + Resource::Corner_Margin;
477 if (_shownState == shrinkHidden) // shrink of ancestor
480 setPos(_expandedPos);
483 _progressItem->adjustGeometry();
486 { // --- expanding: resize, then show children
487 _ancestorShrinked = false;
489 for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
491 SceneItem* item = dynamic_cast<SceneItem*>(*it);
492 item->shrinkExpandRecursive(isExpanded(), false);
496 DEBTRACE("------------------------------- Show " << item->getLabel().toStdString());
501 DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
503 item->shrinkExpandLink(fromHere);
508 _width = _expandedWidth;
509 _height = _expandedHeight;
510 _shownState = expandShown;
514 _shownState = shrinkShown;
515 _width = 2*Resource::Corner_Margin + 2*Resource::DataPort_Width + Resource::Space_Margin;
516 _height = getHeaderBottom() + Resource::Corner_Margin;
518 setPos(_expandedPos);
521 _progressItem->adjustGeometry();
525 void SceneComposedNodeItem::shrinkExpandLink(bool se) {
526 DEBTRACE("SceneComposedNodeItem::shrinkExpandLink " << se << " " << _label.toStdString());
527 se = se && isExpanded();
528 foreach (QGraphicsItem *child, childItems()) {
529 if (SceneItem *sci = dynamic_cast<SceneItem*>(child)) {
530 sci->shrinkExpandLink(se);
535 void SceneComposedNodeItem::reorganize()
537 DEBTRACE("SceneComposedNodeItem::reorganize() " << _label.toStdString());
538 list<AbstractSceneItem*> alreadySet;
539 for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
541 autoPosNewChild(*it, alreadySet);
542 alreadySet.push_back(*it);
546 void SceneComposedNodeItem::setShownState(shownState ss)
549 if (_shownState == shrinkHidden)
551 _ancestorShrinked = true;
556 _ancestorShrinked = false;
561 _progressItem->adjustGeometry();
564 void SceneComposedNodeItem::collisionResolv(SceneItem* child, QPointF oldPos)
566 //DEBTRACE("SceneComposedNodeItem::collisionResolv " << _label.toStdString());
567 for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
569 SceneNodeItem *other = dynamic_cast<SceneNodeItem*>(*it);
570 if (other && (other != child))
572 if (child->collidesWithItem(other))
574 //DEBTRACE("collision detected with " << other->getLabel().toStdString());
575 QRectF otherBR = (other->mapToParent(other->boundingRect())).boundingRect();
576 qreal oldX = oldPos.x();
577 qreal oldY = oldPos.y();
578 qreal newX = child->pos().x();
579 qreal newY = child->pos().y();
580 qreal othX = otherBR.left()+0.5;
581 qreal othY = otherBR.top()+0.5;
582 //DEBTRACE("oldX=" << oldX << " oldY=" << oldY << " newX=" << newX << " newY=" << newY);
583 //DEBTRACE("otherLeft=" << otherBR.left() << " otherRight=" << otherBR.right() <<
584 // " otherTop=" << otherBR.top() << " otherBottom=" << otherBR.bottom());
585 //DEBTRACE("width=" << child->boundingRect().width() <<
586 // " height=" << child->boundingRect().height());
587 bool fromTop = (((oldY + child->boundingRect().height()) <= otherBR.top()+1) &&
588 ((newY + child->boundingRect().height()) >= otherBR.top()));
589 bool fromBottom = (( oldY >= otherBR.bottom()) &&
590 ( newY <= otherBR.bottom()));
591 bool fromRight = (( oldX >= otherBR.right()) &&
592 ( newX <= otherBR.right()));
593 bool fromLeft = (((oldX+ child->boundingRect().width()) <= otherBR.left()+1) &&
594 ((newX+ child->boundingRect().width()) >= otherBR.left()));
595 //DEBTRACE("fromTop=" << fromTop << " fromBottom=" << fromBottom
596 // << " fromRight=" << fromRight << " fromLeft=" << fromLeft);
597 bool pushOther =false;
598 bool blocThis = false;
601 othY = newY + child->boundingRect().height();
603 other->_blocY = false;
607 othX = newX+ child->boundingRect().width();
609 other->_blocX = false;
615 newY = otherBR.bottom() + 1;
621 othY = newY - otherBR.height();
622 if ( othY < Resource::Space_Margin + getHeaderBottom() )
624 othY = Resource::Space_Margin + getHeaderBottom();
625 other->_blocY = true;
626 newY = otherBR.bottom() + 1;
638 newX = otherBR.right()+ 1;
644 othX = newX - otherBR.width();
645 if (othX < Resource::Space_Margin)
647 othX = Resource::Space_Margin;
648 other->_blocX = true;
649 newX = otherBR.right()+ 1;
657 //DEBTRACE("newX=" << newX << " newY=" << newY);
658 if (blocThis) child->setTopLeft(QPointF(newX, newY));
661 other->setTopLeft(QPointF(othX, othY));
668 void SceneComposedNodeItem::rebuildLinks()
670 DEBTRACE("SceneComposedNodeItem::rebuildLinks " << QtGuiContext::_delayCalc);
671 if (QtGuiContext::_delayCalc)
675 LinkMatrix matrix(this);
679 list<linkdef> alist = matrix.getListOfDataLinkDef();
680 list<linkdef> blist = matrix.getListOfCtrlLinkDef(); // add list operator ?
681 for (list<linkdef>::const_iterator ii = blist.begin(); ii != blist.end(); ++ii)
682 alist.push_back(*ii);
686 LinkAStar astar(matrix);
687 for (list<linkdef>::const_iterator it = alist.begin(); it != alist.end(); ++it)
690 DEBTRACE("from("<<ali.from.first<<","<<ali.from.second
691 <<") to ("<<ali.to.first<<","<<ali.to.second
692 <<") " << ali.item->getLabel().toStdString());
693 if(ali.from.first<0||ali.from.second<0||ali.to.first<0||ali.to.second<0) continue;
695 bool isPath = astar.computePath(LNode(ali.from), LNode(ali.to));
698 if (! isPath) DEBTRACE("Link Path not found !");
699 if (! isPath) continue;
700 LNodePath ijPath = astar.givePath();
701 if(Scene::_addRowCols)
702 matrix.incrementCost(ijPath);
703 LinkPath apath = matrix.getPath(ijPath);
704 // DEBTRACE(apath.size());
707 ali.item->setPath(apath);
711 void SceneComposedNodeItem::arrangeNodes(bool isRecursive)
713 DEBTRACE("SceneComposedItem::arrangeNodes " << isRecursive);
715 bool isExtern = !QtGuiContext::_delayCalc;
716 QtGuiContext::_delayCalc = true; // avoid rebuildLinks
718 SubjectComposedNode *scnode = dynamic_cast<SubjectComposedNode*>(getSubject());
720 ComposedNode *cnode = dynamic_cast<ComposedNode*>(scnode->getNode());
725 list<Node*> children = cnode->edGetDirectDescendants();
726 for (list<Node*>::iterator it = children.begin(); it != children.end(); ++it)
728 DEBTRACE("child " << (*it)->getName());
729 SceneComposedNodeItem *scni = 0;
730 ComposedNode *cchild = dynamic_cast<ComposedNode*>(*it);
733 SubjectNode* sn = GuiContext::getCurrent()->_mapOfSubjectNode[cchild];
734 SceneItem* sci = QtGuiContext::getQtCurrent()->_mapOfSceneItem[sn];
735 if (sci) scni = dynamic_cast<SceneComposedNodeItem*>(sci);
737 if (scni && (scni->getShownState() == expandShown))
739 DEBTRACE("call arrangeNode on child " << (*it)->getName());
740 scni->arrangeNodes(isRecursive);
750 QtGuiContext::_delayCalc = false; // allow rebuildLinks
751 if (Scene::_autoComputeLinks)
756 void SceneComposedNodeItem::arrangeChildNodes()
761 void SceneComposedNodeItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
763 bool accepted = false;
764 const ItemMimeData *myData = dynamic_cast<const ItemMimeData*>(event->mimeData());
767 if (myData->hasFormat("yacs/cataService") ||
768 myData->hasFormat("yacs/cataNode") ||
769 myData->hasFormat("yacs/subjectNode"))
771 event->setAccepted(true);
773 QGraphicsItem::update();
777 event->setAccepted(accepted);
780 void SceneComposedNodeItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
784 QGraphicsItem::update();
787 void SceneComposedNodeItem::dropEvent(QGraphicsSceneDragDropEvent *event)
791 QGraphicsItem::update();
793 const ItemMimeData *myData = dynamic_cast<const ItemMimeData*>(event->mimeData());
795 setEventPos(event->scenePos());
796 if (myData->hasFormat("yacs/cataService") || myData->hasFormat("yacs/cataNode"))
798 SubjectComposedNode *cnode = dynamic_cast<SubjectComposedNode*>(getSubject());
799 bool createNewComponentInstance=Resource::COMPONENT_INSTANCE_NEW;
800 // by default getControl gives false. In this case we use the user preference COMPONENT_INSTANCE_NEW
801 // to create the node. If getControl gives true we invert the user preference
802 if(myData->getControl())
803 createNewComponentInstance=!Resource::COMPONENT_INSTANCE_NEW;
804 QtGuiContext::getQtCurrent()->getGMain()->_guiEditor->CreateNodeFromCatalog(myData, cnode,createNewComponentInstance);
806 else if(myData->hasFormat("yacs/subjectNode"))
808 Subject *sub = myData->getSubject();
810 SubjectNode *node = dynamic_cast<SubjectNode*>(sub);
812 if (dynamic_cast<SubjectProc*>(node)) return; // --- do not reparent proc !
813 SubjectComposedNode *cnode = dynamic_cast<SubjectComposedNode*>(getSubject());
815 if (!node->reparent(cnode))
820 QColor SceneComposedNodeItem::getPenColor()
823 return Resource::dragOver;
830 QColor SceneComposedNodeItem::getBrushColor()
833 return _hiBrushColor;
837 color = _hiBrushColor;
838 else if (_emphasized)
839 color = Resource::emphasizeBrushColor;
844 color = hoverColor(color);
848 void SceneComposedNodeItem::updateChildItems()
850 SceneNodeItem::updateChildItems();
853 foreach (QGraphicsItem *child, _header->childItems())
855 if (SceneItem *sci = dynamic_cast<SceneItem*>(child))