Salome HOME
Updated copyright comment
[modules/shaper.git] / src / PartSet / PartSet_TreeNodes.cpp
index c08539925ec34de2a67ea6c9985c940525bc0739..54dc64c1052326b70af7e1d41b22e45f8bfa4dd6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2024  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 #include <ModelAPI_Folder.h>
 #include <ModelAPI_AttributeReference.h>
 
+#include <Config_PropManager.h>
+
 #include <QBrush>
 #include <QMap>
+#include <QPalette>
 
 
 #define ACTIVE_COLOR QColor(Qt::black)
@@ -85,11 +88,20 @@ QVariant PartSet_TreeNode::data(int theColumn, int theRole) const
       return QBrush(DISABLED_COLOR);
     if (!aFlags.testFlag(Qt::ItemIsEditable))
       return QBrush(SELECTABLE_COLOR);
-    return ACTIVE_COLOR;
+    return activeItemColor();
   }
   return ModuleBase_ITreeNode::data(theColumn, theRole);
 }
 
+QColor PartSet_TreeNode::activeItemColor() const
+{
+  // instead of ACTIVE_COLOR (black),
+  // use the color text of the current theme (white or black or other)
+  // to make it readable in dark theme (and light theme as well)
+  QColor color = QPalette().text().color() ;
+  return color;
+}
+
 
 //////////////////////////////////////////////////////////////////////////////////
 QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const
@@ -102,10 +114,10 @@ QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const
         AttributeDoublePtr aValueAttribute =
           aParam->data()->real(ModelAPI_ResultParameter::VALUE());
         QString aVal = QString::number(aValueAttribute->value());
-        QString aTitle = QString(myObject->data()->name().c_str());
+        QString aTitle = QString::fromStdWString(myObject->data()->name());
         return aTitle + " = " + aVal;
       }
-      return myObject->data()->name().c_str();
+      return QString::fromStdWString(myObject->data()->name());
     }
     break;
   case Qt::DecorationRole:
@@ -133,6 +145,17 @@ QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const
   return PartSet_TreeNode::data(theColumn, theRole);
 }
 
+QColor PartSet_ObjectNode::activeItemColor() const
+{
+  if (myObject.get() && myObject->groupName() == ModelAPI_Feature::group()) {
+    std::vector<int> aColor =
+      Config_PropManager::color("Visualization", "feature_objectbrowser_color");
+    return QColor(aColor[0], aColor[1], aColor[2]);
+  }
+  return PartSet_TreeNode::activeItemColor();
+}
+
+
 Qt::ItemFlags PartSet_ObjectNode::flags(int theColumn) const
 {
   if (myObject->isDisabled()) {
@@ -140,6 +163,17 @@ Qt::ItemFlags PartSet_ObjectNode::flags(int theColumn) const
   } else {
     DocumentPtr aDoc = myObject->document();
     SessionPtr aSession = ModelAPI_Session::get();
+
+    FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(myObject);
+    if (aFeature.get() && aFeature->getKind() == "Group")
+    {
+      std::shared_ptr<ModelAPI_CompositeFeature> anOwner =
+        ModelAPI_Tools::compositeOwner (aFeature);
+
+      if (anOwner.get() && anOwner->getKind() == "ImportResult")
+        return aDefaultFlag;
+    }
+
     if (aSession->activeDocument() == aDoc)
       return aEditingFlag;
   }
@@ -232,6 +266,9 @@ void PartSet_ObjectNode::update()
 
     // If the object is a field result then delete extra sub-objects
     if (aFieldRes.get()) {
+      // Call shape in order to update content of Field.
+      // It is necessary to do for cases when field was created by script when module is inactive.
+      aFieldRes->shape();
       while (myChildren.size() > aNb) {
         ModuleBase_ITreeNode* aNode = myChildren.last();
         myChildren.removeAll(aNode);
@@ -273,16 +310,18 @@ void PartSet_ObjectNode::update()
         }
       }
       else if (aFieldRes.get()) {
-        ModelAPI_ResultField::ModelAPI_FieldStep* aStep = aFieldRes->step(i);
-        if (i < myChildren.size()) {
-          PartSet_StepNode* aStepNode = static_cast<PartSet_StepNode*>(myChildren.at(i));
-          if (aStepNode->entity() != aStep) {
-            aStepNode->setEntity(aStep);
+        FieldStepPtr aStep = aFieldRes->step(i);
+        if (aStep.get()) {
+          if (i < myChildren.size()) {
+            PartSet_StepNode* aStepNode = static_cast<PartSet_StepNode*>(myChildren.at(i));
+            if (aStepNode->object() != aStep) {
+              aStepNode->setObject(aStep);
+            }
+          }
+          else {
+            aNode = new PartSet_StepNode(aStep, this);
+            myChildren.append(aNode);
           }
-        }
-        else {
-          aNode = new PartSet_StepNode(aStep, this);
-          myChildren.append(aNode);
         }
       }
     }
@@ -291,8 +330,8 @@ void PartSet_ObjectNode::update()
       aNode = myChildren.takeLast();
       delete aNode;
     }
-    foreach(ModuleBase_ITreeNode* aNode, myChildren) {
-      aNode->update();
+    foreach(ModuleBase_ITreeNode* aChildNode, myChildren) {
+      aChildNode->update();
     }
   }
   else {
@@ -309,6 +348,10 @@ QTreeNodesList PartSet_ObjectNode::objectCreated(const QObjectPtrList& theObject
     ResultFieldPtr aFieldRes = std::dynamic_pointer_cast<ModelAPI_ResultField>(myObject);
     ObjectPtr aBody;
     int i;
+    // Call shape in order to update content of Field.
+    // It is necessary to do for cases when field was created by script when module is inactive.
+    if (aFieldRes.get())
+      aFieldRes->shape();
     for (i = 0; i < aNb; i++) {
       aBody = subObject(i);
       if (aBody.get()) {
@@ -327,21 +370,23 @@ QTreeNodesList PartSet_ObjectNode::objectCreated(const QObjectPtrList& theObject
         }
       }
       else {
-        ModelAPI_ResultField::ModelAPI_FieldStep* aStep = aFieldRes->step(i);
-        if (i < myChildren.size()) {
-          PartSet_StepNode* aStepNode = static_cast<PartSet_StepNode*>(myChildren.at(i));
-          if (aStepNode->entity() != aStep) {
-            aStepNode->setEntity(aStep);
+        FieldStepPtr aStep = aFieldRes->step(i);
+        if (aStep.get()) {
+          if (i < myChildren.size()) {
+            PartSet_StepNode* aStepNode = static_cast<PartSet_StepNode*>(myChildren.at(i));
+            if (aStepNode->object() != aStep) {
+              aStepNode->setObject(aStep);
+            }
+          }
+          else {
+            aNode = new PartSet_StepNode(aStep, this);
+            myChildren.append(aNode);
           }
-        }
-        else {
-          aNode = new PartSet_StepNode(aStep, this);
-          myChildren.append(aNode);
         }
       }
     }
-    foreach(ModuleBase_ITreeNode* aNode, myChildren) {
-      aResult.append(aNode->objectCreated(theObjects));
+    foreach(ModuleBase_ITreeNode* aChildNode, myChildren) {
+      aResult.append(aChildNode->objectCreated(theObjects));
     }
   }
   return aResult;
@@ -378,10 +423,10 @@ QTreeNodesList PartSet_ObjectNode::objectsDeleted(
         aResult.append(this);
       int i = 0;
       ObjectPtr aBody;
-      foreach(ModuleBase_ITreeNode* aNode, myChildren) {
+      foreach(ModuleBase_ITreeNode* aChildNode, myChildren) {
         aBody = subObject(i);
-        ((PartSet_ObjectNode*)aNode)->setObject(aBody);
-        aResult.append(aNode->objectsDeleted(theDoc, theGroup));
+        ((PartSet_ObjectNode*)aChildNode)->setObject(aBody);
+        aResult.append(aChildNode->objectsDeleted(theDoc, theGroup));
         i++;
       }
     }
@@ -954,9 +999,9 @@ QVariant PartSet_PartRootNode::data(int theColumn, int theRole) const
       ResultPartPtr aPartRes = getPartResult(myObject);
       if (aPartRes.get()) {
         if (aPartRes->partDoc().get() == NULL)
-          return QString(myObject->data()->name().c_str()) + " (Not loaded)";
+          return QString::fromStdWString(myObject->data()->name()) + " (Not loaded)";
       }
-      return QString(myObject->data()->name().c_str());
+      return QString::fromStdWString(myObject->data()->name());
     }
     case Qt::DecorationRole:
       return ModuleBase_IconFactory::get()->getIcon(myObject);
@@ -1072,7 +1117,7 @@ void PartSet_ObjectFolderNode::update()
     int aNbOfFeatures = aDoc->size(ModelAPI_Feature::group(), true);
     while (aId < myChildren.size()) {
       ModuleBase_ITreeNode* aNode = myChildren.at(aId);
-      if ((aFirst + aId) < aNbOfFeatures) {
+      if ((aId < aNbItems) && ((aFirst + aId) < aNbOfFeatures)) {
         if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) {
           myChildren.removeAll(aNode);
           delete aNode;
@@ -1108,7 +1153,7 @@ void PartSet_ObjectFolderNode::update()
   }
 }
 
-QTreeNodesList PartSet_ObjectFolderNode::objectCreated(const QObjectPtrList& theObjects)
+QTreeNodesList PartSet_ObjectFolderNode::objectCreated(const QObjectPtrList& /*theObjects*/)
 {
   QTreeNodesList aResult;
   int aFirst = -1, aLast = -1;
@@ -1142,8 +1187,8 @@ QTreeNodesList PartSet_ObjectFolderNode::objectCreated(const QObjectPtrList& the
   return aResult;
 }
 
-QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDoc,
-  const QString& theGroup)
+QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& /*theDoc*/,
+  const QString& /*theGroup*/)
 {
   QTreeNodesList aResult;
   int aFirst = -1, aLast = -1;
@@ -1188,17 +1233,41 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo
   return aResult;
 }
 
+QVariant PartSet_ObjectFolderNode::data(int theColumn, int theRole) const
+{
+  if (theRole == Qt::ForegroundRole) {
+    if (!myObject->isDisabled()) {
+      std::vector<int> aColor =
+        Config_PropManager::color("Visualization", "feature_objectbrowser_color");
+      return QColor(aColor[0], aColor[1], aColor[2]);
+    }
+  }
+  return PartSet_ObjectNode::data(theColumn, theRole);
 
+}
 
 //////////////////////////////////////////////////////////////////////////////////
 QVariant PartSet_StepNode::data(int theColumn, int theRole) const
 {
   if ((theColumn == 1) && (theRole == Qt::DisplayRole)) {
-    ModelAPI_ResultField::ModelAPI_FieldStep* aStep =
-      dynamic_cast<ModelAPI_ResultField::ModelAPI_FieldStep*>(myEntity);
+    FieldStepPtr aStep =
+      std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(myObject);
 
     return "Step " + QString::number(aStep->id() + 1) + " " +
       aStep->field()->textLine(aStep->id()).c_str();
   }
-  return PartSet_TreeNode::data(theColumn, theRole);
+  return PartSet_ObjectNode::data(theColumn, theRole);
+}
+
+ModuleBase_ITreeNode::VisibilityState PartSet_StepNode::visibilityState() const
+{
+  Qt::ItemFlags aFlags = flags(1);
+  if (aFlags == Qt::ItemFlags())
+    return NoneState;
+
+  ModuleBase_IWorkshop* aWork = workshop();
+  if (aWork->isVisible(myObject))
+    return Visible;
+  else
+    return Hidden;
 }