Salome HOME
Fix for the issue #2753 : error when dump/load script
[modules/shaper.git] / src / PartSet / PartSet_TreeNodes.cpp
index a57bb17759fae463f8b5554d59ddbf25cdaac06f..4e27874870454cd5d92b41e53db1e59c6dcc5ac1 100644 (file)
 //
 
 #include "PartSet_TreeNodes.h"
+#include "PartSet_Tools.h"
 
 #include <ModuleBase_IconFactory.h>
 #include <ModuleBase_IWorkshop.h>
+#include <ModuleBase_Tools.h>
 
 #include <PartSetPlugin_Part.h>
 
@@ -121,13 +123,12 @@ QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const
         return QIcon(":pictures/eyeclosed.png");
       }
     case 1:
-      if (myObject->groupName() == ModelAPI_Folder::group())
-        return QIcon(":pictures/features_folder.png");
-      else
-        return ModuleBase_IconFactory::get()->getIcon(myObject);
+      return ModuleBase_IconFactory::get()->getIcon(myObject);
     case 2:
       if (isCurrentFeature(myObject))
         return QIcon(":pictures/arrow.png");
+      else
+        return QIcon();
     }
   }
   return PartSet_TreeNode::data(theColumn, theRole);
@@ -440,6 +441,28 @@ QVariant PartSet_FolderNode::data(int theColumn, int theRole) const
       }
     }
   }
+  if ((theColumn == 2) && (theRole == Qt::DecorationRole)) {
+    if (document().get()) {
+      SessionPtr aSession = ModelAPI_Session::get();
+      if (document() != aSession->activeDocument())
+          return QIcon();
+
+      FeaturePtr aFeature = document()->currentFeature(true);
+      if (!aFeature.get()) { // There is no current feature
+        ModuleBase_ITreeNode* aLastFolder = 0;
+        foreach(ModuleBase_ITreeNode* aNode, parent()->children()) {
+          if (aNode->type() == PartSet_FolderNode::typeId())
+            aLastFolder = aNode;
+          else
+            break;
+        }
+        if (aLastFolder == this)
+          return QIcon(":pictures/arrow.png");
+        else
+          return QIcon();
+      }
+    }
+  }
   return PartSet_TreeNode::data(theColumn, theRole);
 }
 
@@ -836,11 +859,19 @@ void PartSet_PartRootNode::update()
 
   bool aHasFields = myFieldsFolder->childrenCount() > 0;
   bool aHasGroups = myGroupsFolder->childrenCount() > 0;
-  if (aHasFields && (!myChildren.contains(myFieldsFolder))) {
-    myChildren.insert(3, myFieldsFolder);
+  if (aHasFields) {
+    if (!myChildren.contains(myFieldsFolder)) {
+      myChildren.insert(3, myFieldsFolder);
+    }
+  } else if (myChildren.contains(myFieldsFolder)) {
+    myChildren.removeAll(myFieldsFolder);
   }
-  if (aHasGroups && (!myChildren.contains(myGroupsFolder))) {
-    myChildren.insert(aHasFields ? 4 : 3, myGroupsFolder);
+  if (aHasGroups) {
+    if (!myChildren.contains(myGroupsFolder)) {
+      myChildren.insert(aHasFields ? 4 : 3, myGroupsFolder);
+    }
+  } else if (myChildren.contains(myGroupsFolder)) {
+    myChildren.removeAll(myGroupsFolder);
   }
 
   // Update features content
@@ -848,7 +879,7 @@ void PartSet_PartRootNode::update()
 
   // Remove extra sub-nodes
   int aIndex = -1;
-  int aId = 0;
+  int aId = aRows;
   while (aId < myChildren.size()) {
     ModuleBase_ITreeNode* aNode = myChildren.at(aId);
     if (aNode->object().get()) {
@@ -911,15 +942,21 @@ QVariant PartSet_PartRootNode::data(int theColumn, int theRole) const
       return ModuleBase_IconFactory::get()->getIcon(myObject);
     }
   case 2:
-    if (theRole == Qt::DecorationRole)
+    if (theRole == Qt::DecorationRole) {
       if (isCurrentFeature(myObject))
         return QIcon(":pictures/arrow.png");
+      else
+        return QIcon();
+    }
   }
   return PartSet_TreeNode::data(theColumn, theRole);
 }
 
 Qt::ItemFlags PartSet_PartRootNode::flags(int theColumn) const
 {
+  if (myObject->isDisabled())
+    return (theColumn == 2) ? Qt::ItemIsSelectable : aNullFlag;
+
   SessionPtr aSession = ModelAPI_Session::get();
   DocumentPtr aActiveDoc = aSession->activeDocument();
   if ((aActiveDoc == document()) || (myObject->document() == aActiveDoc))
@@ -993,8 +1030,8 @@ QTreeNodesList PartSet_PartRootNode::objectsDeleted(const DocumentPtr& theDoc,
 //////////////////////////////////////////////////////////////////////////////////
 void PartSet_ObjectFolderNode::update()
 {
-  int aFirst, aLast;
-  getFirstAndLastIndex(aFirst, aLast);
+  int aFirst = -1, aLast = -1;
+  PartSet_Tools::getFirstAndLastIndexInFolder(myObject, aFirst, aLast);
   if ((aFirst == -1) || (aLast == -1)) {
     deleteChildren();
     return;
@@ -1007,37 +1044,42 @@ void PartSet_ObjectFolderNode::update()
   }
 
   DocumentPtr aDoc = myObject->document();
-  // Delete obsolete nodes
-  int aId = 0;
-  while (aId < myChildren.size()) {
-    ModuleBase_ITreeNode* aNode = myChildren.at(aId);
-    if ((aFirst + aId) < aDoc->size(ModelAPI_Feature::group(), true)) {
-      if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) {
+  if (aNbItems < myChildren.size()) {
+    // Delete obsolete nodes
+    int aId = 0;
+    int aNbOfFeatures = aDoc->size(ModelAPI_Feature::group(), true);
+    while (aId < myChildren.size()) {
+      ModuleBase_ITreeNode* aNode = myChildren.at(aId);
+      if ((aFirst + aId) < aNbOfFeatures) {
+        if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) {
+          myChildren.removeAll(aNode);
+          delete aNode;
+          continue;
+        }
+      }
+      else {
         myChildren.removeAll(aNode);
         delete aNode;
         continue;
       }
+      aId++;
     }
-    else {
-      myChildren.removeAll(aNode);
-      delete aNode;
-      continue;
-    }
-    aId++;
   }
-
-  // Add new nodes
-  ModuleBase_ITreeNode* aNode;
-  for (int i = 0; i < aNbItems; i++) {
-    ObjectPtr aObj = aDoc->object(ModelAPI_Feature::group(), aFirst + i);
-    if (i < myChildren.size()) {
-      if (aObj != myChildren.at(i)->object()) {
+  if (aNbItems > myChildren.size()) {
+    // Add new nodes
+    ModuleBase_ITreeNode* aNode;
+    for (int i = 0; i < aNbItems; i++) {
+      ObjectPtr aObj = aDoc->object(ModelAPI_Feature::group(), aFirst + i);
+      if (i < myChildren.size()) {
+        if (aObj != myChildren.at(i)->object()) {
+          aNode = new PartSet_ObjectNode(aObj, this);
+          myChildren.insert(i, aNode);
+        }
+      }
+      else {
         aNode = new PartSet_ObjectNode(aObj, this);
-        myChildren.insert(i, aNode);
+        myChildren.append(aNode);
       }
-    } else {
-      aNode = new PartSet_ObjectNode(aObj, this);
-      myChildren.append(aNode);
     }
   }
 }
@@ -1045,8 +1087,8 @@ void PartSet_ObjectFolderNode::update()
 QTreeNodesList PartSet_ObjectFolderNode::objectCreated(const QObjectPtrList& theObjects)
 {
   QTreeNodesList aResult;
-  int aFirst, aLast;
-  getFirstAndLastIndex(aFirst, aLast);
+  int aFirst = -1, aLast = -1;
+  PartSet_Tools::getFirstAndLastIndexInFolder(myObject, aFirst, aLast);
   if ((aFirst == -1) || (aLast == -1)) {
     return aResult;
   }
@@ -1078,8 +1120,8 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo
   const QString& theGroup)
 {
   QTreeNodesList aResult;
-  int aFirst, aLast;
-  getFirstAndLastIndex(aFirst, aLast);
+  int aFirst = -1, aLast = -1;
+  PartSet_Tools::getFirstAndLastIndexInFolder(myObject, aFirst, aLast);
   if ((aFirst == -1) || (aLast == -1)) {
     return aResult;
   }
@@ -1087,13 +1129,17 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo
   if (!aNbItems) {
     return aResult;
   }
+  if (aNbItems >= myChildren.size()) // Nothing was deleted here
+    return aResult;
+
   DocumentPtr aDoc = myObject->document();
   // Delete obsolete nodes
   bool aRemoved = false;
   int aId = 0;
+  int aNbOfFeatures = aDoc->size(ModelAPI_Feature::group(), true);
   while (aId < myChildren.size()) {
     ModuleBase_ITreeNode* aNode = myChildren.at(aId);
-    if ((aFirst + aId) < aDoc->size(ModelAPI_Feature::group(), true)) {
+    if ((aFirst + aId) < aNbOfFeatures) {
       if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) {
         myChildren.removeAll(aNode);
         delete aNode;
@@ -1103,6 +1149,7 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo
     }
     else {
       myChildren.removeAll(aNode);
+      aResult.removeAll(aNode);
       delete aNode;
       aRemoved = true;
       continue;
@@ -1115,34 +1162,6 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo
   return aResult;
 }
 
-FeaturePtr PartSet_ObjectFolderNode::getFeature(const std::string& theId) const
-{
-  FolderPtr aFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(myObject);
-  AttributeReferencePtr aFeatAttr = aFolder->data()->reference(theId);
-  if (aFeatAttr)
-    return ModelAPI_Feature::feature(aFeatAttr->value());
-  return FeaturePtr();
-}
-
-void PartSet_ObjectFolderNode::getFirstAndLastIndex(int& theFirst, int& theLast) const
-{
-  DocumentPtr aDoc = myObject->document();
-  FolderPtr aFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(myObject);
-
-  FeaturePtr aFirstFeatureInFolder = getFeature(ModelAPI_Folder::FIRST_FEATURE_ID());
-  if (!aFirstFeatureInFolder.get()) {
-    theFirst = -1;
-    return;
-  }
-  FeaturePtr aLastFeatureInFolder = getFeature(ModelAPI_Folder::LAST_FEATURE_ID());
-  if (!aLastFeatureInFolder.get()) {
-    theLast = -1;
-    return;
-  }
-
-  theFirst = aDoc->index(aFirstFeatureInFolder);
-  theLast = aDoc->index(aLastFeatureInFolder);
-}
 
 
 //////////////////////////////////////////////////////////////////////////////////