X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2Fgenericgui%2FSceneComposedNodeItem.cxx;h=311e4c6c64b706ca0a359602537af4cedaf44db2;hb=984382dbfa6345634e11f4a12bffa40e51a00cd8;hp=ddd78059592241b8441ff0e709d0b39d84f918f1;hpb=b797825313f7af9fd691d137c7c6df4950e7de2c;p=modules%2Fyacs.git diff --git a/src/genericgui/SceneComposedNodeItem.cxx b/src/genericgui/SceneComposedNodeItem.cxx old mode 100755 new mode 100644 index ddd780595..311e4c6c6 --- a/src/genericgui/SceneComposedNodeItem.cxx +++ b/src/genericgui/SceneComposedNodeItem.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2006-2014 CEA/DEN, EDF R&D +// Copyright (C) 2006-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -391,12 +391,10 @@ void SceneComposedNodeItem::removeChildFromList(AbstractSceneItem* child) _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 lscl=dynamic_cast(_subject)->getSubjectControlLinks(); + std::list lscl=dynamic_cast(getSubject())->getSubjectControlLinks(); for (std::list::const_iterator it = lscl.begin(); it != lscl.end(); ++it) { SceneLinkItem* lk = dynamic_cast(QtGuiContext::getQtCurrent()->_mapOfSceneItem[*it]); @@ -419,15 +417,44 @@ void SceneComposedNodeItem::reorganizeShrinkExpand() { }; 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::const_iterator it=_children.begin(); it!=_children.end(); ++it) { + SceneItem* item = dynamic_cast(*it); + SceneNodeItem *sni = dynamic_cast(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(); @@ -437,70 +464,116 @@ void SceneComposedNodeItem::reorganizeShrinkExpand() { } } -void SceneComposedNodeItem::shrinkExpandRecursive(bool isExpanding, bool fromHere) +bool SceneComposedNodeItem::hasExpandedChildren(bool recursively) +{ + bool res = false; + for (list::const_iterator it=_children.begin(); it!=_children.end() && !res; ++it) { + SceneItem* item = dynamic_cast(*it); + SceneNodeItem *sni = dynamic_cast(item); + if (sni->isExpanded()) { + res = true; + if (recursively) + if (SceneComposedNodeItem *scni = dynamic_cast(sni)) + res = scni->hasExpandedChildren(recursively); + } + } + return res; +} + +void SceneComposedNodeItem::shrinkExpandRecursive(bool toExpand, bool fromHere, ShrinkMode theShrinkMode) { - DEBTRACE("SceneComposedNodeItem::shrinkExpandRecursive " << isExpanding << " " << fromHere << " " << isExpanded() << " " << _label.toStdString()); + DEBTRACE("SceneComposedNodeItem::shrinkExpandRecursive " << toExpand << " " << 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::const_iterator it=_children.begin(); it!=_children.end(); ++it) { SceneItem* item = dynamic_cast(*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::const_iterator it=_children.begin(); it!=_children.end(); ++it) { SceneItem* item = dynamic_cast(*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())