Salome HOME
AutoGIL.hxx has been factorized to KERNEL PythonCppUtils.hxx
[modules/yacs.git] / src / genericgui / SceneComposedNodeItem.cxx
index 83f89e5e1b36bf158743b873956fe5f509fdebf1..9b31f68ed37a5d76f8d5f9fe078883194cd20c85 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2006-2013  CEA/DEN, EDF R&D
+// Copyright (C) 2006-2021  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
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -30,6 +30,7 @@
 #include "SceneLinkItem.hxx"
 #include "SceneDSLinkItem.hxx"
 #include "SceneCtrlLinkItem.hxx"
+#include "SceneProgressItem.hxx"
 #include "LinkMatrix.hxx"
 #include "LinkAStar.hxx"
 #include "ItemMimeData.hxx"
@@ -144,6 +145,11 @@ void SceneComposedNodeItem::update(GuiEvent event, int type, Subject* son)
                                             son->getName().c_str(),
                                             son);
           item->addHeader();
+          if ( !QtGuiContext::getQtCurrent()->isEdition()
+            && (type == YACS::HMI::FORLOOP || type == YACS::HMI::FOREACHLOOP) )
+            {
+              item->addProgressItem();
+            }
           autoPosNewChild(item, _children, true);
           break;
         case YACS::HMI::PYTHONNODE:
@@ -316,6 +322,15 @@ void SceneComposedNodeItem::update(GuiEvent event, int type, Subject* son)
         autoPosNewChild(sinode, _children, true);
       }
       break;
+    case PROGRESS:
+      {
+        if (dynamic_cast<SubjectForLoop*>(son) || dynamic_cast<SubjectForEachLoop*>(son))
+        {
+          if (SceneProgressItem* spitem = getProgressItem())
+            spitem->setProgress(son->getProgress().c_str());
+        }
+      }
+      break;
     default:
        ;
 //       DEBTRACE("SceneComposedNodeItem::update(), event not handled: "<< eventName(event));
@@ -376,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<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]);
 
@@ -404,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<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();
@@ -422,68 +464,116 @@ void SceneComposedNodeItem::reorganizeShrinkExpand() {
     }
 }
 
-void SceneComposedNodeItem::shrinkExpandRecursive(bool isExpanding, bool fromHere)
+bool SceneComposedNodeItem::hasExpandedChildren(bool recursively)
 {
-  DEBTRACE("SceneComposedNodeItem::shrinkExpandRecursive " << isExpanding << " " << fromHere << " " << isExpanded() << " " << _label.toStdString());
+  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 " << 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<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 (_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())
@@ -500,6 +590,8 @@ void SceneComposedNodeItem::shrinkExpandRecursive(bool isExpanding, bool fromHer
         }
       setPos(_expandedPos);
       adjustHeader();
+      if (_progressItem)
+        _progressItem->adjustGeometry();
     }
 }
 
@@ -538,6 +630,8 @@ void SceneComposedNodeItem::setShownState(shownState ss)
       show();
     }
   adjustHeader();
+  if (_progressItem)
+    _progressItem->adjustGeometry();
 }
 
 void SceneComposedNodeItem::collisionResolv(SceneItem* child, QPointF oldPos)