1 // Copyright (C) 2006-2014 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, or (at your option) any later version.
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
20 #include "SceneNodeItem.hxx"
21 #include "SceneComposedNodeItem.hxx"
22 #include "SceneProcItem.hxx"
23 #include "SceneHeaderNodeItem.hxx"
24 #include "SceneProgressItem.hxx"
25 #include "SceneInPortItem.hxx"
26 #include "SceneOutPortItem.hxx"
27 #include "SceneCtrlInPortItem.hxx"
28 #include "SceneCtrlOutPortItem.hxx"
29 #include "SceneLinkItem.hxx"
31 #include "QtGuiContext.hxx"
33 #include "GuiEditor.hxx"
35 #include "OutPort.hxx"
38 #include "Resource.hxx"
40 #include <QGraphicsSceneHoverEvent>
49 #include "YacsTrace.hxx"
52 using namespace YACS::ENGINE;
53 using namespace YACS::HMI;
55 SceneNodeItem::SceneNodeItem(QGraphicsScene *scene, SceneItem *parent,
56 QString label, Subject *subject)
57 : SceneObserverItem(scene, parent, label, subject)
63 _brushColor = Resource::Scene_pen;
69 _dragButton = Qt::MidButton;
70 _execState = YACS::UNDEFINED;
72 _expandedPos = QPointF(0,0);
73 _expandedWidth = _width;
74 _expandedHeight = _height;
75 _shownState = expandShown;
78 SceneNodeItem::~SceneNodeItem()
80 if (SceneComposedNodeItem* parent = getParent())
81 parent->removeChildFromList(this);
84 void SceneNodeItem::setWidth(qreal width)
88 prepareGeometryChange();
90 _expandedWidth = _width;
92 QGraphicsItem::update();
96 void SceneNodeItem::setHeight(qreal height)
98 if (height != _height)
100 prepareGeometryChange();
102 _expandedHeight = _height;
103 QGraphicsItem::update();
107 void SceneNodeItem::addHeader()
109 DEBTRACE("SceneNodeItem::addHeader " << _label.toStdString());
113 _header = new SceneHeaderNodeItem(_scene,
117 checkGeometryChange();
121 SceneHeaderItem* SceneNodeItem::getHeader()
126 void SceneNodeItem::addProgressItem()
128 DEBTRACE("SceneNodeItem::addProgressItem ");
131 _progressItem = new SceneProgressItem(_scene,
134 _progressItem->setText("0");
136 checkGeometryChange();
140 void SceneNodeItem::paint(QPainter *painter,
141 const QStyleOptionGraphicsItem *option,
144 //DEBTRACE("SceneNodeItem::paint");
147 void SceneNodeItem::update(GuiEvent event, int type, Subject* son)
149 DEBTRACE("SceneNodeItem::update "<< eventName(event)<<" "<<type<<" "<<son);
150 SceneObserverItem::update(event, type, son);
151 SubjectNode *snode = 0;
155 case YACS::HMI::RENAME:
156 DEBTRACE("SceneNodeItem::update RENAME " << _subject->getName());
159 case YACS::HMI::EDIT:
160 if (_header) _header->setEdited(type);
162 case YACS::HMI::UPDATE:
165 case YACS::HMI::UPDATEPROGRESS:
173 //! generic method to compute a graph for child nodes. implemented in some derived classes
174 void SceneNodeItem::arrangeNodes(bool isRecursive)
178 void SceneNodeItem::arrangeChildNodes()
182 void SceneNodeItem::reorganizeShrinkExpand(ShrinkMode theShrinkMode)
186 qreal SceneNodeItem::getHeaderBottom()
189 return _header->getHeaderBottom();
195 void SceneNodeItem::autoPosNewPort(AbstractSceneItem *item, int nbPorts) {
198 void SceneNodeItem::popupMenu(QWidget *caller, const QPoint &globalPos)
201 m.popupMenu(caller, globalPos);
204 SceneComposedNodeItem* SceneNodeItem::getParent()
207 return dynamic_cast<SceneComposedNodeItem*>(_parent);
211 void SceneNodeItem::removeInPortFromList(AbstractSceneItem* inPort)
213 _inPorts.remove(inPort);
216 void SceneNodeItem::removeOutPortFromList(AbstractSceneItem* outPort)
218 _outPorts.remove(outPort);
221 void SceneNodeItem::setMoving(bool moving)
223 //DEBTRACE("SceneNodeItem::setMoving " << _label.toStdString() << " " << moving);
225 SceneNodeItem *nodep = 0;
226 if (_parent && (nodep = dynamic_cast<SceneNodeItem*>(_parent)))
227 nodep->setMoving(false);
230 ScenePortItem* SceneNodeItem::getCtrlInPortItem()
232 if (! _header) return 0;
233 return _header->getCtrlInPortItem();
236 ScenePortItem* SceneNodeItem::getCtrlOutPortItem()
238 if (! _header) return 0;
239 return _header->getCtrlOutPortItem();
242 void SceneNodeItem::updateName()
244 if (_header) _header->setText(getHeaderLabel());
247 QString SceneNodeItem::getMimeFormat()
249 return "yacs/subjectNode";
252 void SceneNodeItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
254 DEBTRACE("SceneNodeItem::mousePressEvent " << _label.toStdString());
255 SceneObserverItem::mousePressEvent(event);
256 if (!_scene->isZooming())
258 if (!_draging) setMoving(true);
263 void SceneNodeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
265 //DEBTRACE("SceneNodeItem::mouseReleaseEvent " << _label.toStdString());
266 SceneObserverItem::mouseReleaseEvent(event);
268 if ((pos() != _prevPos) && Scene::_autoComputeLinks)
270 YACS::HMI::SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
271 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[subproc];
272 SceneComposedNodeItem *proc = dynamic_cast<SceneComposedNodeItem*>(item);
273 proc->rebuildLinks();
276 if (Resource::ensureVisibleWhenMoved)
277 QtGuiContext::getQtCurrent()->getView()->ensureVisible(this);
281 void SceneNodeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
283 SceneObserverItem::mouseMoveEvent(event);
286 if (SceneComposedNodeItem *bloc = dynamic_cast<SceneComposedNodeItem*>(_parent))
288 QPointF oldPos = pos();
289 QPointF aPos = oldPos + event->scenePos() - event->lastScenePos();
292 if (aPos.x() > oldPos.x()) _blocX = false;
293 if (aPos.y() > oldPos.y()) _blocY = false;
294 if (aPos.x() < Resource::Border_Margin)
296 aPos.setX(Resource::Border_Margin);
299 if ( aPos.y() < bloc->getHeaderBottom() )
301 aPos.setY(bloc->getHeaderBottom());
305 bloc->collisionResolv(this, oldPos);
310 void SceneNodeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
312 DEBTRACE("SceneNodeItem::mouseDoubleClickEvent");
313 QtGuiContext::getQtCurrent()->getGMain()->_guiEditor->shrinkExpand(QApplication::keyboardModifiers());
316 void SceneNodeItem::setTopLeft(QPointF topLeft)
318 if (_shownState == shrinkHidden) {
319 _expandedPos = topLeft;
322 QPointF oldPos = pos();
330 if (SceneComposedNodeItem *bloc = dynamic_cast<SceneComposedNodeItem*>(_parent))
331 bloc->collisionResolv(this, oldPos);
332 _parent->checkGeometryChange();
334 _expandedPos = pos();
337 void SceneNodeItem::adjustHeader()
339 if (_header) _header->adjustGeometry();
342 void SceneNodeItem::updateState()
344 SubjectNode *snode = dynamic_cast<SubjectNode*>(_subject);
346 Node *node = snode->getNode();
348 switch (node->getState())
351 if (_header) _header->setValid(false);
354 if (_header) _header->setValid(true);
361 void SceneNodeItem::setExecState(int execState)
363 DEBTRACE("SceneNodeItem::setExecState " << execState);
364 _execState = execState;
365 if (_header) _header->setExecState(execState);
368 QString SceneNodeItem::getHeaderLabel()
370 DEBTRACE("SceneNodeItem::getHeaderLabel");
371 QString extLabel = _subject->getName().c_str();
373 SceneObserverItem *soi = 0;
374 SubjectSwitch* sswi = 0;
377 && (soi = dynamic_cast<SceneObserverItem*>(_parent))
378 && (sswi = dynamic_cast<SubjectSwitch*>(soi->getSubject())))
380 Switch *aswi = dynamic_cast<Switch*>(sswi->getNode());
381 SubjectNode *sno = dynamic_cast<SubjectNode*>(_subject);
382 int idcase = aswi->getRankOfNode(sno->getNode());
384 if (idcase == Switch::ID_FOR_DEFAULT_NODE)
389 //extLabel += aswi->getCaseId(sno->getNode()).c_str();
390 extLabel += caseid.str().c_str();
392 DEBTRACE(extLabel.toStdString());
398 void SceneNodeItem::updateLinks()
400 //update control links
401 std::list<SubjectControlLink*> lscl=dynamic_cast<SubjectNode*>(_subject)->getSubjectControlLinks();
402 for (std::list<SubjectControlLink*>::const_iterator it = lscl.begin(); it != lscl.end(); ++it)
404 SceneLinkItem* item = dynamic_cast<SceneLinkItem*>(QtGuiContext::getQtCurrent()->_mapOfSceneItem[*it]);
408 //update data links through child items update (SceneDataPortItem)
412 void SceneNodeItem::updateChildItems()
414 foreach (QGraphicsItem *child, childItems())
416 if (SceneItem *sci = dynamic_cast<SceneItem*>(child))
423 void SceneNodeItem::shrinkExpandLink(bool se)
425 foreach (QGraphicsItem *child, childItems())
427 if (SceneItem *sci = dynamic_cast<SceneItem*>(child))
429 sci->shrinkExpandLink(se);
434 void SceneNodeItem::showOutScopeLinks()
436 SubjectNode *snode = dynamic_cast<SubjectNode*>(_subject);
438 Node *node = snode->getNode();
440 vector<pair<OutPort *, InPort *> > listLeaving = node->getSetOfLinksLeavingCurrentScope();
441 vector<pair<InPort *, OutPort *> > listIncoming = node->getSetOfLinksComingInCurrentScope();
442 vector<pair<OutPort *, InPort *> > outScope = listLeaving;
443 vector<pair<InPort *, OutPort *> >::iterator it1;
444 for (it1 = listIncoming.begin(); it1 != listIncoming.end(); ++it1)
446 pair<OutPort *, InPort *> outin = pair<OutPort *, InPort *>((*it1).second, (*it1).first);
447 outScope.push_back(outin);
449 vector<pair<OutPort*, InPort*> >::const_iterator it = outScope.begin();
450 for( ; it != outScope.end(); ++it)
452 YASSERT(QtGuiContext::getQtCurrent()->_mapOfSubjectLink.count(*it));
453 SubjectLink* slink = QtGuiContext::getQtCurrent()->_mapOfSubjectLink[*it];
454 YASSERT(QtGuiContext::getQtCurrent()->_mapOfSceneItem.count(slink));
455 SceneItem *item = QtGuiContext::getQtCurrent()->_mapOfSceneItem[slink];
460 void SceneNodeItem::setShownState(shownState ss)
465 bool SceneNodeItem::hasProgressBar() const
467 return _progressItem != 0;