Salome HOME
Merge branch 'Dev_1.1.1' of newgeom:newgeom into Dev_1.2.0
[modules/shaper.git] / src / PartSet / PartSet_PartDataModel.cpp
index 21896e81a388f3d428758b5457d48406b278ef22..d124d80fc5272b0b2955a1074a38da7999387e5f 100644 (file)
@@ -33,6 +33,9 @@ PartSet_TopDataModel::~PartSet_TopDataModel()
 
 QVariant PartSet_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
 {
+  if (theIndex.column() == 1)
+    return QVariant();
+
   switch (theRole) {
     case Qt::DisplayRole:
       // return a name
@@ -253,16 +256,32 @@ PartSet_PartDataModel::~PartSet_PartDataModel()
 
 QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
 {
+  DocumentPtr aPartDoc = partDocument();
+  if (theIndex.column() == 1) {
+    DocumentPtr aActiveDoc = ModelAPI_Session::get()->activeDocument();
+    QModelIndex aParent = theIndex.parent();
+    if (aActiveDoc == aPartDoc) {
+      if (!aParent.isValid()) {
+        switch (theRole) {
+        case Qt::DecorationRole:
+          if (theIndex.row() == lastHistoryRow())
+            return QIcon(":pictures/arrow.png");
+        }
+      }
+    }
+    return QVariant();
+  }
+
   switch (theRole) {
     case Qt::DisplayRole:
       // return a name
       switch (theIndex.internalId()) {
-        case MyRoot: {
-          DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
-          ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
-          if (aObject)
-            return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
-        }
+        //case MyRoot: {
+        //  DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
+        //  ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
+        //  if (aObject)
+        //    return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
+        //}
         case ParamsFolder:
           return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
         case ConstructFolder:
@@ -272,8 +291,7 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c
         case GroupsFolder:
           return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
         case ParamObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameter::group(),
-                                                     theIndex.row());
+          ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
           if (aObject) {
             ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObject);
             AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
@@ -284,25 +302,24 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c
         }
           break;
         case ConstructObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(),
-                                                     theIndex.row());
+          ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
           if (aObject)
             return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
         }
           break;
         case BodiesObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
+          ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
           if (aObject)
             return aObject->data()->name().c_str();
         }
           break;
         case GroupObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
+          ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultGroup::group(), theIndex.row());
           if (aObject)
             return aObject->data()->name().c_str();
         }
         case HistoryObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
+          ObjectPtr aObject = aPartDoc->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
           if (aObject)
             return aObject->data()->name().c_str();
         }
@@ -311,8 +328,8 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c
     case Qt::DecorationRole:
       // return an Icon
       switch (theIndex.internalId()) {
-        case MyRoot:
-          return QIcon(":pictures/part_ico.png");
+        //case MyRoot:
+        //  return QIcon(":pictures/part_ico.png");
         case ParamsFolder:
           return QIcon(":pictures/params_folder.png");
         case ConstructFolder:
@@ -325,7 +342,7 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c
         case BodiesObject: {
           std::string aGroup = theIndex.internalId() == ConstructObject ?
             ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
-          ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row());
+          ObjectPtr anObject = aPartDoc->object(aGroup, theIndex.row());
           if (anObject && anObject->data() && 
               anObject->data()->execState() == ModelAPI_StateMustBeUpdated) {
             return QIcon(":pictures/constr_object_modified.png");
@@ -333,7 +350,7 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c
           return QIcon(":pictures/constr_object.png");
         }
         case HistoryObject: {
-          ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
+          ObjectPtr aObject = aPartDoc->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
           FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
           if (aFeature)
             return PartSet_DocumentDataModel::featureIcon(aFeature);
@@ -344,8 +361,11 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c
       // return Tooltip
       break;
     case Qt::ForegroundRole:
+      if (theIndex.internalId() == HistoryObject) {
+        if (theIndex.row() > lastHistoryRow())
+          return QBrush(Qt::lightGray);
+      }
       return QBrush(myItemsColor);
-      break;
   }
   return QVariant();
 }
@@ -358,21 +378,13 @@ QVariant PartSet_PartDataModel::headerData(int section, Qt::Orientation orientat
 int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const
 {
   if (!parent.isValid()) {
-    DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
-    if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
-      return 1;
-    else
+    DocumentPtr aDoc = partDocument();
+    if (aDoc.get()) {
+      return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
+    } else 
       return 0;
   }
   switch (parent.internalId()) {
-    case MyRoot:
-      {
-        DocumentPtr aDoc = partDocument();
-        if (aDoc) {
-          return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
-        } else 
-          return 0;
-      }
     case ParamsFolder:
       return partDocument()->size(ModelAPI_ResultParameter::group());
     case ConstructFolder:
@@ -387,43 +399,42 @@ int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const
 
 int PartSet_PartDataModel::columnCount(const QModelIndex &parent) const
 {
-  return 1;
+  return 2;
 }
 
 QModelIndex PartSet_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
 {
-  if (!theParent.isValid())
-    return createIndex(theRow, 0, (qint32) MyRoot);
-
-  int aId = (int) theParent.internalId();
-  switch (aId) {
-    case MyRoot:
-      switch (theRow) {
-        case 0:
-          return createIndex(theRow, 0, (qint32) ParamsFolder);
-        case 1:
-          return createIndex(theRow, 0, (qint32) ConstructFolder);
-        case 2:
-          return createIndex(theRow, 0, (qint32) BodiesFolder);
-        case 3:
-          {
-          int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
-          if (aSize > 0)
-            return createIndex(theRow, 0, (qint32) GroupsFolder);
-          else
-            return createIndex(theRow, theColumn, (qint32) HistoryObject);
-          }
-        default:
+  if (!theParent.isValid()) {
+    switch (theRow) {
+      case 0:
+        return createIndex(theRow, theColumn, (qint32) ParamsFolder);
+      case 1:
+        return createIndex(theRow, theColumn, (qint32) ConstructFolder);
+      case 2:
+        return createIndex(theRow, theColumn, (qint32) BodiesFolder);
+      case 3:
+        {
+        int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
+        if (aSize > 0)
+          return createIndex(theRow, theColumn, (qint32) GroupsFolder);
+        else
           return createIndex(theRow, theColumn, (qint32) HistoryObject);
-      }
-    case ParamsFolder:
-      return createIndex(theRow, 0, (qint32) ParamObject);
-    case ConstructFolder:
-      return createIndex(theRow, 0, (qint32) ConstructObject);
-    case BodiesFolder:
-      return createIndex(theRow, 0, (qint32) BodiesObject);
-    case GroupsFolder:
-      return createIndex(theRow, 0, (qint32) GroupObject);
+        }
+      default:
+        return createIndex(theRow, theColumn, (qint32) HistoryObject);
+    }
+  } else {
+    int aId = (int) theParent.internalId();
+    switch (aId) {
+      case ParamsFolder:
+        return createIndex(theRow, theColumn, (qint32) ParamObject);
+      case ConstructFolder:
+        return createIndex(theRow, theColumn, (qint32) ConstructObject);
+      case BodiesFolder:
+        return createIndex(theRow, theColumn, (qint32) BodiesObject);
+      case GroupsFolder:
+        return createIndex(theRow, theColumn, (qint32) GroupObject);
+    }
   }
   return QModelIndex();
 }
@@ -431,14 +442,12 @@ QModelIndex PartSet_PartDataModel::index(int theRow, int theColumn, const QModel
 QModelIndex PartSet_PartDataModel::parent(const QModelIndex& theIndex) const
 {
   switch (theIndex.internalId()) {
-    case MyRoot:
-      return QModelIndex();
     case ParamsFolder:
     case ConstructFolder:
     case BodiesFolder:
     case GroupsFolder:
     case HistoryObject:
-      return createIndex(0, 0, (qint32) MyRoot);
+      return QModelIndex();
 
     case ParamObject:
       return createIndex(0, 0, (qint32) ParamsFolder);
@@ -459,21 +468,15 @@ bool PartSet_PartDataModel::hasChildren(const QModelIndex& theParent) const
 
 DocumentPtr PartSet_PartDataModel::partDocument() const
 {
-  DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
-  ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
-  ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
-  if (aPart)
+  ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(myPart->firstResult()); 
+  if (aPart.get()) // this may be null is Part feature is disabled
     return aPart->partDoc();
-  return DocumentPtr(); // null if not found
+  return DocumentPtr();
 }
 
 ObjectPtr PartSet_PartDataModel::object(const QModelIndex& theIndex) const
 {
   switch (theIndex.internalId()) {
-    case MyRoot: {
-      DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
-      return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
-    }
     case ParamsFolder:
     case ConstructFolder:
     case BodiesFolder:
@@ -517,13 +520,6 @@ QModelIndex PartSet_PartDataModel::findGroup(const std::string& theGroup) const
   return QModelIndex();
 }
 
-ResultPartPtr PartSet_PartDataModel::part() const
-{
-  DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
-  ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
-  return std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
-}
-
 QModelIndex PartSet_PartDataModel::objectIndex(const ObjectPtr& theObject) const
 {
   QModelIndex aIndex;
@@ -564,4 +560,50 @@ int PartSet_PartDataModel::getRowsNumber() const
   if (aSize == 0) // If there are no groups then do not show group folder
     return 3;
   return 4;
-}
\ No newline at end of file
+}
+
+int PartSet_PartDataModel::lastHistoryRow() const
+{
+  DocumentPtr aDoc = partDocument();
+  FeaturePtr aFeature = aDoc->currentFeature(true);
+  if (aFeature.get())
+    return getRowsNumber() + aDoc->index(aFeature);
+  else
+    return getRowsNumber() - 1;
+}
+
+void PartSet_PartDataModel::setLastHistoryItem(const QModelIndex& theIndex)
+{
+  SessionPtr aMgr = ModelAPI_Session::get();
+  DocumentPtr aDoc = partDocument();
+  std::string aOpName = tr("History change").toStdString();
+  if (theIndex.internalId() == HistoryObject) {
+    ObjectPtr aObject = object(theIndex);
+    aMgr->startOperation(aOpName);
+    aDoc->setCurrentFeature(std::dynamic_pointer_cast<ModelAPI_Feature>(aObject), true);
+    aMgr->finishOperation();
+  } else {
+    aMgr->startOperation(aOpName);
+    aDoc->setCurrentFeature(FeaturePtr(), true);
+    aMgr->finishOperation();
+  }
+}
+
+QModelIndex PartSet_PartDataModel::lastHistoryItem() const
+{
+  return index(lastHistoryRow(), 1);
+}
+
+Qt::ItemFlags PartSet_PartDataModel::flags(const QModelIndex& theIndex) const
+{
+  Qt::ItemFlags aFlags = Qt::ItemIsSelectable;
+  if (object(theIndex)) {
+    aFlags |= Qt::ItemIsEditable;
+  }
+  if (theIndex.internalId() == HistoryObject) {
+    if (theIndex.row() <= lastHistoryRow() || (theIndex.column() == 1))
+      aFlags |= Qt::ItemIsEnabled;
+  } else
+    aFlags |= Qt::ItemIsEnabled;
+  return aFlags;
+}