Salome HOME
Issue #3120: Show Empty panel if selection doesn't contain a shape
[modules/shaper.git] / src / XGUI / XGUI_DataModel.cpp
index a574c035332be147695d3b3f949daf78e229125a..d624d14ad7d06ceecef304ebe80dc6fb8225ab72 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019  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
 //
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
 #include "XGUI_DataModel.h"
@@ -68,18 +67,31 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
     for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) {
       if ((*aIt)->isInHistory())
         aCreated.append(*aIt);
+      if ((*aIt)->groupName() == ModelAPI_ResultPart::group()) {
+        emit beforeTreeRebuild();
+        myRoot->update();
+        rebuildDataTree();
+        emit treeRebuilt();
+        return;
+      }
     }
+    if (aCreated.length() == 0)
+      return;
+
+    emit beforeTreeRebuild();
     QTreeNodesList aNodes = myRoot->objectCreated(aCreated);
     ModuleBase_ITreeNode* aParent;
     int aRow = 0;
     QModelIndex aParentIndex1, aParentIndex2;
     ObjectPtr aObj;
+    bool aRebuildAll = false;
+
     foreach(ModuleBase_ITreeNode* aNode, aNodes) {
       aObj = aNode->object();
       aParent = aNode->parent();
       if (aObj.get() && (aObj->groupName() == ModelAPI_Folder::group())) {
         aParent->update();
-        rebuildDataTree();
+        aRebuildAll = true;
       }
       else {
         aRow = aParent->nodeRow(aNode);
@@ -89,6 +101,10 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
         dataChanged(aParentIndex1, aParentIndex2);
       }
     }
+    if (aRebuildAll)
+      rebuildDataTree();
+
+    emit treeRebuilt();
   }
   else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) {
     std::shared_ptr<ModelAPI_ObjectDeletedMessage> aUpdMsg =
@@ -97,6 +113,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
       aUpdMsg->groups();
     QTreeNodesList aList;
     std::list<std::pair<std::shared_ptr<ModelAPI_Document>, std::string>>::const_iterator aIt;
+    emit beforeTreeRebuild();
     for (aIt = aMsgGroups.cbegin(); aIt != aMsgGroups.cend(); aIt++) {
       aList.append(myRoot->objectsDeleted(aIt->first, aIt->second.c_str()));
     }
@@ -112,6 +129,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
         aNode->parent()->update();
     }
     rebuildDataTree();
+    emit treeRebuilt();
   }
   else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) {
     std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
@@ -121,6 +139,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
     QObjectPtrList aCreated;
     std::set<ObjectPtr>::const_iterator aIt;
     bool aRebuildAll = false;
+    emit beforeTreeRebuild();
     for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) {
       ObjectPtr aObj = (*aIt);
       if (!aObj->isInHistory())
@@ -136,7 +155,6 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
     }
     if (aRebuildAll) {
       myRoot->update();
-      rebuildDataTree();
     }
     else {
       QSet<ModuleBase_ITreeNode*> aParents;
@@ -159,8 +177,9 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
       foreach(ModuleBase_ITreeNode* aNode, aParents) {
         aNode->update();
       }
-      rebuildDataTree();
     }
+    rebuildDataTree();
+    emit treeRebuilt();
   }
   else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_ORDER_UPDATED)) {
     std::shared_ptr<ModelAPI_OrderUpdatedMessage> aUpdMsg =
@@ -170,8 +189,10 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
       std::string aGroup = aUpdMsg->reordered()->group();
       ModuleBase_ITreeNode* aNode = myRoot->findParent(aDoc, aGroup.c_str());
       if (aNode) {
+        emit beforeTreeRebuild();
         aNode->update();
         rebuildDataTree();
+        emit treeRebuilt();
       }
     }
   }
@@ -196,6 +217,9 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
         aCreated.append(aObj);
       }
     }
+    if (aCreated.length() == 0)
+      return;
+    emit beforeTreeRebuild();
     foreach(ObjectPtr aObj, aCreated) {
       ModuleBase_ITreeNode* aNode = myRoot->subNode(aObj);
       if (aNode) {
@@ -218,6 +242,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
         dataChanged(aFirstIdx, aLastIdx);
       }
     }
+    emit treeRebuilt();
   }
 }
 
@@ -233,7 +258,6 @@ void XGUI_DataModel::rebuildDataTree()
 {
   beginResetModel();
   endResetModel();
-  emit treeRebuilt();
 }
 
 //******************************************************
@@ -419,3 +443,10 @@ DocumentPtr XGUI_DataModel::document(const QModelIndex& theIndex) const
   ModuleBase_ITreeNode* aNode = (ModuleBase_ITreeNode*)theIndex.internalPointer();
   return aNode->document();
 }
+
+
+//******************************************************
+bool XGUI_DataModel::hasNode(ModuleBase_ITreeNode* theNode) const
+{
+  return myRoot->hasSubNode(theNode);
+}