Salome HOME
Issue #389 Undo/redo problem on sketch line creation
[modules/shaper.git] / src / XGUI / XGUI_PartDataModel.cpp
index 42d22cce9ed799b35889a657a8a086d5c7055677..567ad5677e050e0d4923001afdbc3a23f2a75709 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
 #include "XGUI_PartDataModel.h"
 #include "XGUI_Workshop.h"
 
@@ -19,7 +21,7 @@
 
 //ObjectPtr featureObj(const ObjectPtr& theFeature)
 //{
-//  ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
+//  ObjectPtr aObject = std::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
 //  if (aObject)
 //    return aObject->featureRef();
 //  return theFeature;
@@ -259,7 +261,7 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
           DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
           ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
           if (aObject)
-            return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
+            return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
         }
         case ParamsFolder:
           return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
@@ -273,14 +275,14 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
           ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(),
                                                      theIndex.row());
           if (aObject)
-            return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
+            return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
         }
           break;
         case ConstructObject: {
           ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(),
                                                      theIndex.row());
           if (aObject)
-            return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
+            return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
         }
           break;
         case BodiesObject: {
@@ -295,7 +297,7 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
             return aObject->data()->name().c_str();
         }
         case HistoryObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 4);
+          ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
           if (aObject)
             return aObject->data()->name().c_str();
         }
@@ -319,16 +321,17 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
           std::string aGroup = theIndex.internalId() == ConstructObject ?
             ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
           ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row());
-          if (anObject && anObject->data() && anObject->data()->mustBeUpdated()) {
+          if (anObject && anObject->data() && 
+              anObject->data()->execState() == ModelAPI_StateMustBeUpdated) {
             return QIcon(":pictures/constr_object_modified.png");
           }
           return QIcon(":pictures/constr_object.png");
         }
         case HistoryObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 4);
-          FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
+          ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
+          FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
           if (aFeature)
-            return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
+            return XGUI_Workshop::featureIcon(aFeature);
         }
       }
       break;
@@ -360,9 +363,9 @@ int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
     case MyRoot:
       {
         DocumentPtr aDoc = partDocument();
-        if (aDoc)
-          return 4 + aDoc->size(ModelAPI_Feature::group());
-        else 
+        if (aDoc) {
+          return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
+        else 
           return 0;
       }
     case ParamsFolder:
@@ -398,7 +401,13 @@ QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelInd
         case 2:
           return createIndex(theRow, 0, (qint32) BodiesFolder);
         case 3:
-          return createIndex(theRow, 0, (qint32) GroupsFolder);
+          {
+          int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
+          if (aSize > 0)
+            return createIndex(theRow, 0, (qint32) GroupsFolder);
+          else
+            return createIndex(theRow, theColumn, (qint32) HistoryObject);
+          }
         default:
           return createIndex(theRow, theColumn, (qint32) HistoryObject);
       }
@@ -447,8 +456,10 @@ DocumentPtr XGUI_PartDataModel::partDocument() const
 {
   DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
   ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
-  ResultPartPtr aPart = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
-  return aPart->partDoc();
+  ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
+  if (aPart)
+    return aPart->partDoc();
+  return DocumentPtr(); // null if not found
 }
 
 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
@@ -473,7 +484,7 @@ ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
     case GroupObject:
       return partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
     case HistoryObject:
-      return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 4);
+      return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
   }
   return ObjectPtr();
 }
@@ -490,13 +501,13 @@ QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
 
 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
 {
-  if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
+  if (theGroup == ModelAPI_ResultParameters::group())
     return createIndex(0, 0, (qint32) ParamsFolder);
-  if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
+  if (theGroup == ModelAPI_ResultConstruction::group())
     return createIndex(1, 0, (qint32) ConstructFolder);
-  if (theGroup.compare(ModelAPI_ResultBody::group()) == 0)
+  if (theGroup == ModelAPI_ResultBody::group())
     return createIndex(2, 0, (qint32) BodiesFolder);
-  if (theGroup.compare(ModelAPI_ResultGroup::group()) == 0)
+  if (theGroup == ModelAPI_ResultGroup::group())
     return createIndex(3, 0, (qint32) GroupsFolder);
   return QModelIndex();
 }
@@ -505,7 +516,7 @@ ResultPartPtr XGUI_PartDataModel::part() const
 {
   DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
   ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
-  return boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
+  return std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
 }
 
 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
@@ -536,7 +547,16 @@ QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
     else if (aGroup == ModelAPI_ResultGroup::group())
       return createIndex(aRow, 0, (qint32) GroupObject);
     else
-      return createIndex(aRow + 4, 0, (qint32) HistoryObject);
+      return createIndex(aRow + getRowsNumber(), 0, (qint32) HistoryObject);
   }
   return aIndex;
 }
+
+
+int XGUI_PartDataModel::getRowsNumber() const
+{
+  int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
+  if (aSize == 0) // If there are no groups then do not show group folder
+    return 3;
+  return 4;
+}
\ No newline at end of file