tr("shrink/expand"), tr("shrink or expand the selected node"),
0, _parent, false, this, SLOT(onShrinkExpand()));
+ _shrinkExpandChildren = _wrapper->createAction(getMenuId(), tr("shrink or expand direct children of the selected node"), QIcon("icons:shrinkExpand.png"),
+ tr("shrink/expand children"), tr("shrink or expand direct children of the selected node"),
+ 0, _parent, false, this, SLOT(onShrinkExpandChildren()));
+
+ _shrinkExpandElementaryRecursively = _wrapper->createAction(getMenuId(), tr("shrink or expand elementary nodes of the selected node recursively"), QIcon("icons:shrinkExpand.png"),
+ tr("shrink/expand elementary"), tr("shrink or expand elementary nodes of the selected node recursively"),
+ 0, _parent, false, this, SLOT(onShrinkExpandElementaryRecursively()));
+
_toggleStraightLinksAct = _wrapper->createAction(getMenuId(), tr("draw straight or orthogonal links"), QIcon("icons:straightLink.png"),
tr("straight/orthogonal"), tr("draw straight or orthogonal links"),
0, _parent, true, this, SLOT(onToggleStraightLinks(bool)));
_guiEditor->shrinkExpand();
}
+void GenericGui::onShrinkExpandChildren() {
+ DEBTRACE("GenericGui::onShrinkExpandChildren");
+ _guiEditor->shrinkExpand(Qt::ControlModifier|Qt::ShiftModifier);
+}
+
+void GenericGui::onShrinkExpandElementaryRecursively() {
+ DEBTRACE("GenericGui::onShrinkExpandElementaryRecursively");
+ _guiEditor->shrinkExpand(Qt::ControlModifier);
+}
+
void GenericGui::onToggleStraightLinks(bool checked)
{
Scene::_straightLinks = checked;
QAction *_zoomToBlocAct;
QAction *_centerOnNodeAct;
QAction *_shrinkExpand;
+ QAction *_shrinkExpandChildren;
+ QAction *_shrinkExpandElementaryRecursively;
QAction *_toggleStraightLinksAct;
QAction *_toggleAutomaticComputeLinkAct;
void onZoomToBloc();
void onCenterOnNode();
void onShrinkExpand();
+ void onShrinkExpandChildren();
+ void onShrinkExpandElementaryRecursively();
void onToggleStraightLinks(bool checked);
void onToggleAutomaticComputeLinks(bool checked);
void onToggleSimplifyLinks(bool checked);
/*!
* Subject shrink or expand, command from popup menu: needs a valid selection
*/
-void GuiEditor::shrinkExpand() {
+void GuiEditor::shrinkExpand(Qt::KeyboardModifiers kbModifiers) {
DEBTRACE("GuiEditor::shrinkExpand");
Subject* sub = QtGuiContext::getQtCurrent()->getSelectedSubject();
return;
};
- if (sni->isExpanded()) {
- sni->setExpanded(false);
- } else {
- sni->setExpanded(true);
- };
- sni->reorganizeShrinkExpand();
+ ShrinkMode aShrinkMode = CurrentNode;
+ if (kbModifiers == Qt::ControlModifier) {
+ aShrinkMode = ElementaryNodes;
+ } else if (kbModifiers == (Qt::ShiftModifier|Qt::ControlModifier)) {
+ aShrinkMode = ChildrenNodes;
+ }
+
+ sni->reorganizeShrinkExpand(aShrinkMode);
sni->showOutScopeLinks();
sni->updateLinks();
}
void PutSubjectInBloc();
std::string PutGraphInBloc();
void PutGraphInNode(std::string typeNode);
- void shrinkExpand();
+ void shrinkExpand(Qt::KeyboardModifiers kbModifiers = Qt::NoModifier);
void rebuildLinks();
void arrangeNodes(bool isRecursive);
void arrangeProc();
menu.addAction(gmain->_zoomToBlocAct);
menu.addAction(gmain->_centerOnNodeAct);
menu.addAction(gmain->_shrinkExpand);
+ menu.addAction(gmain->_shrinkExpandChildren);
+ menu.addAction(gmain->_shrinkExpandElementaryRecursively);
menu.addAction(gmain->_computeLinkAct);
// menu.addAction(gmain->_toggleAutomaticComputeLinkAct);
// menu.addAction(gmain->_toggleSimplifyLinkAct);
menu.addAction(gmain->_zoomToBlocAct);
menu.addAction(gmain->_centerOnNodeAct);
menu.addAction(gmain->_shrinkExpand);
+ menu.addAction(gmain->_shrinkExpandChildren);
+ menu.addAction(gmain->_shrinkExpandElementaryRecursively);
menu.addAction(gmain->_computeLinkAct);
// menu.addAction(gmain->_toggleAutomaticComputeLinkAct);
// menu.addAction(gmain->_toggleSimplifyLinkAct);
_children.remove(child);
}
-void SceneComposedNodeItem::reorganizeShrinkExpand() {
- DEBTRACE("SceneComposedNodeItem::reorganizeShrinkExpand " << _expanded << " " << _label.toStdString());
- bool isExpanding = isExpanded();
-
+void SceneComposedNodeItem::updateControlLinks(bool toExpand)
+{
//update control links
- std::list<SubjectControlLink*> lscl=dynamic_cast<SubjectNode*>(_subject)->getSubjectControlLinks();
+ std::list<SubjectControlLink*> lscl=dynamic_cast<SubjectNode*>(getSubject())->getSubjectControlLinks();
for (std::list<SubjectControlLink*>::const_iterator it = lscl.begin(); it != lscl.end(); ++it) {
SceneLinkItem* lk = dynamic_cast<SceneLinkItem*>(QtGuiContext::getQtCurrent()->_mapOfSceneItem[*it]);
};
if (b1 && b2) {
- if (isExpanding) {
+ if (toExpand) {
lk->show();
} else {
lk->hide();
};
};
};
+}
+
+void SceneComposedNodeItem::reorganizeShrinkExpand(ShrinkMode theShrinkMode) {
+ DEBTRACE("SceneComposedNodeItem::reorganizeShrinkExpand " << _expanded << " " << _label.toStdString());
+
+ bool toExpand = true;
+ if (theShrinkMode == CurrentNode) {
+ // shrink/expand current node only
+ toExpand = !isExpanded();
+
+ updateControlLinks(toExpand);
+ shrinkExpandRecursive(toExpand, true, theShrinkMode);
+
+ } else {
+ if (!isExpanded())
+ return;
+ // shrink/expand child nodes
+ toExpand = !hasExpandedChildren(theShrinkMode == ElementaryNodes);
+ for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it) {
+ SceneItem* item = dynamic_cast<SceneItem*>(*it);
+ SceneNodeItem *sni = dynamic_cast<SceneNodeItem*>(item);
+ item->shrinkExpandRecursive(toExpand, true, theShrinkMode);
+ }
+ _ancestorShrinked = !toExpand;
+ _width = _expandedWidth;
+ _height = _expandedHeight;
+ _shownState = expandShown;
+ adjustHeader();
+ rebuildLinks();
+ }
- shrinkExpandRecursive(isExpanding, true);
if (Scene::_autoComputeLinks)
{
SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
}
}
-void SceneComposedNodeItem::shrinkExpandRecursive(bool isExpanding, bool fromHere)
+bool SceneComposedNodeItem::hasExpandedChildren(bool recursively)
+{
+ bool res = false;
+ for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end() && !res; ++it) {
+ SceneItem* item = dynamic_cast<SceneItem*>(*it);
+ SceneNodeItem *sni = dynamic_cast<SceneNodeItem*>(item);
+ if (sni->isExpanded()) {
+ res = true;
+ if (recursively)
+ if (SceneComposedNodeItem *scni = dynamic_cast<SceneComposedNodeItem*>(sni))
+ res = scni->hasExpandedChildren(recursively);
+ }
+ }
+ return res;
+}
+
+void SceneComposedNodeItem::shrinkExpandRecursive(bool toExpand, bool fromHere, ShrinkMode theShrinkMode)
{
DEBTRACE("SceneComposedNodeItem::shrinkExpandRecursive " << isExpanding << " " << fromHere << " " << isExpanded() << " " << _label.toStdString());
- if (!isExpanding)
+ bool toChangeShrinkState = false;
+ switch (theShrinkMode) {
+ case CurrentNode:
+ if (fromHere)
+ toChangeShrinkState = true;
+ break;
+ case ChildrenNodes:
+ if (fromHere)
+ toChangeShrinkState = true;
+ break;
+ case ElementaryNodes:
+ toChangeShrinkState = false;
+ break;
+ }
+ if (toChangeShrinkState) {
+ if (toExpand != isExpanded())
+ setExpanded(toExpand);
+ } else if (!isExpanded() && theShrinkMode == ElementaryNodes) {
+ return;
+ }
+
+ updateControlLinks(toExpand);
+
+ if (!toExpand)
{ // ---collapsing: hide first children , then resize
for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
{
SceneItem* item = dynamic_cast<SceneItem*>(*it);
- item->shrinkExpandRecursive(false, false);
- item->hide();
- DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
- item->shrinkExpandLink(false);
+ item->shrinkExpandRecursive(toExpand, false, theShrinkMode);
+ if (theShrinkMode != ElementaryNodes) {
+ item->hide();
+ DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
+ item->shrinkExpandLink(false);
+ }
}
- if (_shownState == expandShown)
- {
- _expandedWidth = _width;
- _expandedHeight = _height;
- }
+ if (toChangeShrinkState || theShrinkMode != ElementaryNodes) {
+ if (_shownState == expandShown)
+ {
+ _expandedWidth = _width;
+ _expandedHeight = _height;
+ }
- if (fromHere)
- {
- _shownState = shrinkShown;
- }
- else
- {
- _ancestorShrinked = true;
- _shownState = shrinkHidden;
- }
+ if (fromHere)
+ {
+ _shownState = shrinkShown;
+ }
+ else
+ {
+ _ancestorShrinked = true;
+ _shownState = shrinkHidden;
+ }
- _width = 2*Resource::Corner_Margin + 2*Resource::DataPort_Width + Resource::Space_Margin;
- if (_shownState == shrinkShown)
- _height = getHeaderBottom() + Resource::Corner_Margin;
- else
- _height = Resource::Header_Height + Resource::Corner_Margin;
+ _width = 2*Resource::Corner_Margin + 2*Resource::DataPort_Width + Resource::Space_Margin;
+ if (_shownState == shrinkShown)
+ _height = getHeaderBottom() + Resource::Corner_Margin;
+ else
+ _height = Resource::Header_Height + Resource::Corner_Margin;
- if (_shownState == shrinkHidden) // shrink of ancestor
- setPos(0 ,0);
- else
- setPos(_expandedPos);
- adjustHeader();
- if (_progressItem)
- _progressItem->adjustGeometry();
+ if (_shownState == shrinkHidden) // shrink of ancestor
+ setPos(0 ,0);
+ else
+ setPos(_expandedPos);
+ adjustHeader();
+ if (_progressItem)
+ _progressItem->adjustGeometry();
+ }
}
else
{ // --- expanding: resize, then show children
- _ancestorShrinked = false;
+ if (toChangeShrinkState)
+ _ancestorShrinked = false;
for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
{
SceneItem* item = dynamic_cast<SceneItem*>(*it);
- item->shrinkExpandRecursive(isExpanded(), false);
- if (isExpanded())
- {
- item->show();
- DEBTRACE("------------------------------- Show " << item->getLabel().toStdString());
- }
- else
- {
- item->hide();
- DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
- }
- item->shrinkExpandLink(fromHere);
+ item->shrinkExpandRecursive(isExpanded(), false, theShrinkMode);
+ if (theShrinkMode != ElementaryNodes) {
+ if (isExpanded())
+ {
+ item->show();
+ DEBTRACE("------------------------------- Show " << item->getLabel().toStdString());
+ }
+ else
+ {
+ item->hide();
+ DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
+ }
+ item->shrinkExpandLink(fromHere);
+ }
}
if (isExpanded())
virtual std::list<AbstractSceneItem*> getChildren();
virtual void removeChildFromList(AbstractSceneItem* child);
virtual void reorganize();
- virtual void reorganizeShrinkExpand();
- virtual void shrinkExpandRecursive(bool isExpanding, bool fromHere);
+ virtual void reorganizeShrinkExpand(ShrinkMode theShrinkMode);
+ virtual void shrinkExpandRecursive(bool isExpanding, bool fromHere, ShrinkMode theShrinkMode);
virtual void shrinkExpandLink(bool se);
virtual void collisionResolv(SceneItem* child, QPointF oldPos);
virtual void rebuildLinks();
virtual void arrangeChildNodes();
virtual void adjustColors();
virtual void setShownState(shownState ss);
+ virtual bool hasExpandedChildren(bool recursively);
protected:
void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
void dropEvent(QGraphicsSceneDragDropEvent *event);
+ void updateControlLinks(bool toExpand);
virtual QColor getPenColor();
virtual QColor getBrushColor();
m.popupMenu(caller, globalPos);
}
-void SceneElementaryNodeItem::reorganizeShrinkExpand()
+void SceneElementaryNodeItem::reorganizeShrinkExpand(ShrinkMode theShrinkMode)
{
DEBTRACE("SceneElementaryNodeItem::reorganizeShrinkExpand " << isExpanded() << " " << _label.toStdString());
- shrinkExpandRecursive(isExpanded(), true);
+ if (theShrinkMode != CurrentNode)
+ return;
+ shrinkExpandRecursive(!isExpanded(), true, theShrinkMode);
if (Scene::_autoComputeLinks)
{
SubjectProc* subproc = QtGuiContext::getQtCurrent()->getSubjectProc();
}
}
-void SceneElementaryNodeItem::shrinkExpandRecursive(bool isExpanding, bool fromHere)
+void SceneElementaryNodeItem::shrinkExpandRecursive(bool toExpand, bool fromHere, ShrinkMode theShrinkMode)
{
- DEBTRACE("SceneElementaryNodeItem::shrinkExpandRecursive " << isExpanding << " " << fromHere << " " << isExpanded() << " " << _label.toStdString());
- if (isExpanding)
- {
+ DEBTRACE("SceneElementaryNodeItem::shrinkExpandRecursive " << toExpand << " " << fromHere << " " << isExpanded() << " " << _label.toStdString());
+
+ bool toChangeShrinkState = false;
+ switch (theShrinkMode) {
+ case CurrentNode:
+ if (fromHere)
+ toChangeShrinkState = true;
+ break;
+ case ChildrenNodes:
+ if (fromHere)
+ toChangeShrinkState = true;
+ break;
+ case ElementaryNodes:
+ toChangeShrinkState = true;
+ break;
+ }
+ if (toChangeShrinkState && toExpand != isExpanded())
+ setExpanded(toExpand);
+
+ if (toExpand) {
+ if (toChangeShrinkState) {
_ancestorShrinked = false;
+ _shownState = expandShown;
+ } else {
if (isExpanded())
_shownState = expandShown;
else
_shownState = shrinkShown;
}
- else
- {
- if (fromHere)
- _shownState = shrinkShown;
- else
- {
- _ancestorShrinked = true;
- _shownState = shrinkHidden;
- }
+ } else {
+ if (fromHere || theShrinkMode==ElementaryNodes) {
+ _shownState = shrinkShown;
+ } else {
+ _ancestorShrinked = true;
+ _shownState = shrinkHidden;
}
+ }
if (_shownState == shrinkHidden) // shrink of ancestor
- setPos(0 ,0);
+ setPos(0, 0);
else
setPos(_expandedPos);
virtual void popupMenu(QWidget *caller, const QPoint &globalPos);
virtual void autoPosNewPort(AbstractSceneItem *item, int nbPorts);
virtual void reorganize();
- virtual void reorganizeShrinkExpand();
- virtual void shrinkExpandRecursive(bool isExpanding, bool fromHere);
+ virtual void reorganizeShrinkExpand(ShrinkMode theShrinkMode);
+ virtual void shrinkExpandRecursive(bool isExpanding, bool fromHere, ShrinkMode theShrinkMode);
virtual void setShownState(shownState ss);
protected:
int _maxPorts;
}
-void SceneItem::shrinkExpandRecursive(bool isExpanding, bool fromHere)
+void SceneItem::shrinkExpandRecursive(bool isExpanding, bool fromHere, ShrinkMode theShrinkMode)
{
}
{
namespace HMI
{
+ typedef enum
+ {
+ CurrentNode,
+ ChildrenNodes,
+ ElementaryNodes
+ } ShrinkMode;
+
class Scene;
class RootSceneItem: public GuiObserver
virtual void updateChildItems();
virtual void updateLinks();
virtual void shrinkExpandLink(bool se);
- virtual void shrinkExpandRecursive(bool isExpanding, bool fromHere);
+ virtual void shrinkExpandRecursive(bool isExpanding, bool fromHere, ShrinkMode theShrinkMode);
bool isAncestorShrinked() { return _ancestorShrinked; };
bool _blocX;
bool _blocY;
{
}
-void SceneNodeItem::reorganizeShrinkExpand()
+void SceneNodeItem::reorganizeShrinkExpand(ShrinkMode theShrinkMode)
{
}
void SceneNodeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
DEBTRACE("SceneNodeItem::mouseDoubleClickEvent");
- QtGuiContext::getQtCurrent()->getGMain()->_guiEditor->shrinkExpand();
+ QtGuiContext::getQtCurrent()->getGMain()->_guiEditor->shrinkExpand(QApplication::keyboardModifiers());
}
void SceneNodeItem::setTopLeft(QPointF topLeft)
virtual void updateName();
virtual void arrangeNodes(bool isRecursive);
virtual void arrangeChildNodes();
- virtual void reorganizeShrinkExpand();
+ virtual void reorganizeShrinkExpand(ShrinkMode theShrinkMode);
virtual void updateChildItems();
virtual void shrinkExpandLink(bool se);
virtual void showOutScopeLinks();
m.popupMenu(caller, globalPos);
}
-void SceneProcItem::reorganizeShrinkExpand() {
- if (_children.size() == 0)
- return;
- bool isExpanding = true;
- DEBTRACE("SceneProcItem::reorganizeShrinkExpand " << _expanded << " " << _label.toStdString());
- for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
- {
- SceneItem* item = dynamic_cast<SceneItem*>(*it);
- SceneNodeItem *sni = dynamic_cast<SceneNodeItem*>(item);
- if (sni->isExpanded()) {
- isExpanding = false;
- break;
- }
- }
- for (list<AbstractSceneItem*>::const_iterator it=_children.begin(); it!=_children.end(); ++it)
- {
- SceneItem* item = dynamic_cast<SceneItem*>(*it);
- SceneNodeItem *sni = dynamic_cast<SceneNodeItem*>(item);
- if (!isExpanding && sni->isExpanded()) {
- sni->setExpanded(false);
- item->shrinkExpandRecursive(false, true);
- DEBTRACE("------------------------------- Hide " << item->getLabel().toStdString());
- }
- if (isExpanding && !sni->isExpanded()) {
- sni->setExpanded(true);
- item->shrinkExpandRecursive(true, false);
- DEBTRACE("------------------------------- Show " << item->getLabel().toStdString());
- }
- item->shrinkExpandLink(isExpanding);
- }
- _ancestorShrinked = !isExpanding;
- _width = _expandedWidth;
- _height = _expandedHeight;
- _shownState = expandShown;
- adjustHeader();
- rebuildLinks();
-}
-
QString label, Subject *subject);
virtual ~SceneProcItem();
virtual void popupMenu(QWidget *caller, const QPoint &globalPos);
- virtual void reorganizeShrinkExpand();
};
}
}
<source>shrink or expand the selected node</source>
<translation>contracter ou étendre le noeud choisi</translation>
</message>
+ <message>
+ <source>shrink or expand direct children of the selected node</source>
+ <translation type="unfinished">contracter ou étendre le noeud choisi</translation>
+ </message>
+ <message>
+ <source>shrink or expand elementary nodes of the selected node recursively</source>
+ <translation type="unfinished">contracter ou étendre le noeud choisi</translation>
+ </message>
<message>
<source>shrink/expand</source>
<translation>contracter/étendre</translation>
</message>
+ <message>
+ <source>shrink/expand children</source>
+ <translation type="unfinished">contracter/étendre</translation>
+ </message>
+ <message>
+ <source>shrink/expand elementary</source>
+ <translation type="unfinished">contracter/étendre</translation>
+ </message>
<message>
<source>draw straight or orthogonal links</source>
<translation>Créer les liens droits ou orthogonaux</translation>
<source>shrink or expand the selected node</source>
<translation>選択中のノードを展開または縮小</translation>
</message>
+ <message>
+ <source>shrink or expand direct children of the selected node</source>
+ <translation type="unfinished">選択中のノードを展開または縮小</translation>
+ </message>
+ <message>
+ <source>shrink or expand elementary nodes of the selected node recursively</source>
+ <translation type="unfinished">選択中のノードを展開または縮小</translation>
+ </message>
<message>
<source>shrink/expand</source>
<translation>展開/縮小</translation>
</message>
+ <message>
+ <source>shrink/expand children</source>
+ <translation type="unfinished">展開/縮小</translation>
+ </message>
+ <message>
+ <source>shrink/expand elementary</source>
+ <translation type="unfinished">展開/縮小</translation>
+ </message>
<message>
<source>draw straight or orthogonal links</source>
<translation>直線または直交リンクを描画</translation>