Salome HOME
Fixed crash in Object Browser on creation of feature Object
authorvsv <vitaly.smetannikov@opencascade.com>
Mon, 19 May 2014 11:30:38 +0000 (15:30 +0400)
committervsv <vitaly.smetannikov@opencascade.com>
Mon, 19 May 2014 11:30:38 +0000 (15:30 +0400)
src/XGUI/XGUI_PartDataModel.cpp
src/XGUI/XGUI_Workshop.cpp

index 2ce2c5a26ffc773a40cde820cfc84b9cb513bdb8..532d88d787202869ce3140e6f6a22152097cc2e2 100644 (file)
 #include <QIcon>
 #include <QBrush>
 
+
+FeaturePtr featureObj(const FeaturePtr& theFeature)
+{
+  ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
+  if (aObject)
+    return aObject->featureRef();
+  return theFeature;
+}
+
+
 XGUI_TopDataModel::XGUI_TopDataModel(const DocumentPtr& theDocument, QObject* theParent)
   : XGUI_FeaturesModel(theDocument, theParent)
 {
@@ -31,7 +41,7 @@ QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
       return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
     case ParamObject:
       {
-        FeaturePtr aFeature = myDocument->feature(PARAMETERS_GROUP, theIndex.row());
+        FeaturePtr aFeature = featureObj(myDocument->feature(PARAMETERS_GROUP, theIndex.row()));
         if (aFeature)
           return aFeature->data()->getName().c_str();
       } 
@@ -39,7 +49,7 @@ QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
         return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
     case ConstructObject:
       {
-        FeaturePtr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+        FeaturePtr aFeature = featureObj(myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
         if (aFeature)
           return aFeature->data()->getName().c_str();
       }
@@ -55,7 +65,7 @@ QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
       return QIcon(":pictures/constr_folder.png");
     case ConstructObject:
       {
-        FeaturePtr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+        FeaturePtr aFeature = featureObj(myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
         if (aFeature)
           return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
       }
@@ -142,9 +152,9 @@ FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
   case ConstructFolder:
     return FeaturePtr();
   case ParamObject:
-    return myDocument->feature(PARAMETERS_GROUP, theIndex.row());
+    return featureObj(myDocument->feature(PARAMETERS_GROUP, theIndex.row()));
   case ConstructObject:
-    return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+    return featureObj(myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
   }
   return FeaturePtr();
 }
@@ -192,7 +202,7 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
     switch (theIndex.internalId()) {
     case MyRoot:
       {
-        FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId);
+        FeaturePtr aFeature = featureObj(myDocument->feature(PARTS_GROUP, myId));
         if (aFeature)
           return aFeature->data()->getName().c_str();
       }
@@ -204,19 +214,19 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
       return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
     case ParamObject:
       {
-        FeaturePtr aFeature = featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
+        FeaturePtr aFeature = featureObj(featureDocument()->feature(PARAMETERS_GROUP, theIndex.row()));
         if (aFeature)
           return aFeature->data()->getName().c_str();
       }
     case ConstructObject:
       {
-        FeaturePtr aFeature = featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+        FeaturePtr aFeature = featureObj(featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
         if (aFeature)
           return aFeature->data()->getName().c_str();
       }
     case HistoryObject:
       {
-        FeaturePtr aFeature = featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
+        FeaturePtr aFeature = featureObj(featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3));
         if (aFeature)
           return aFeature->data()->getName().c_str();
       }
@@ -234,7 +244,7 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
       return QIcon(":pictures/constr_folder.png");
     case ConstructObject:
       {
-        FeaturePtr aFeature = featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+        FeaturePtr aFeature = featureObj(featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
         if (aFeature)
           return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
       }
@@ -340,10 +350,7 @@ bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
 
 DocumentPtr XGUI_PartDataModel::featureDocument() const
 {
-  FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId);
-  ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature);
-  if (aObject)
-    return aObject->featureRef()->data()->docRef("PartDocument")->value();
+  FeaturePtr aFeature = featureObj(myDocument->feature(PARTS_GROUP, myId));
   return aFeature->data()->docRef("PartDocument")->value();
 }
  
@@ -351,17 +358,17 @@ FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
 {
   switch (theIndex.internalId()) {
   case MyRoot:
-    if (theIndex.row() < 3)
-      return myDocument->feature(PARTS_GROUP, myId);
-    else 
+    if (theIndex.row() < 3) {
+      return featureObj(myDocument->feature(PARTS_GROUP, myId));
+    else 
       return featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
   case ParamsFolder:
   case ConstructFolder:
     return FeaturePtr();
   case ParamObject:
-    return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
+    return featureObj(featureDocument()->feature(PARAMETERS_GROUP, theIndex.row()));
   case ConstructObject:
-    return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+    return featureObj(featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
   }
   return FeaturePtr();
 }
@@ -394,5 +401,5 @@ QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
 
 FeaturePtr XGUI_PartDataModel::part() const
 {
-  return myDocument->feature(PARTS_GROUP, myId);
+  return featureObj(myDocument->feature(PARTS_GROUP, myId));
 }
\ No newline at end of file
index a2cd536ec9e066c74a316508fa2c77bfae3083ab..1a11dca832d2f22f545eea46e1305eaef5722ffd 100644 (file)
@@ -26,6 +26,7 @@
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_AttributeDocRef.h>
+#include <ModelAPI_Object.h>
 
 #include <Events_Loop.h>
 #include <Events_Error.h>
@@ -208,8 +209,8 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage)
   {
     const Model_FeatureUpdatedMessage* anUpdateMsg =
         dynamic_cast<const Model_FeatureUpdatedMessage*>(theMessage);
-    boost::shared_ptr<ModelAPI_Feature> aNewFeature = anUpdateMsg->feature();
-    boost::shared_ptr<ModelAPI_Feature> aCurrentFeature = myOperationMgr->currentOperation()->feature();
+    FeaturePtr aNewFeature = anUpdateMsg->feature();
+    FeaturePtr aCurrentFeature = myOperationMgr->currentOperation()->feature();
     if(aNewFeature == aCurrentFeature) {
       myPropertyPanel->updateContentWidget(aCurrentFeature);
     }
@@ -355,8 +356,8 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation)
 void XGUI_Workshop::saveDocument(QString theName)
 {
   QApplication::restoreOverrideCursor();
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
-  boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
+  DocumentPtr aDoc = aMgr->rootDocument();
   aDoc->save(theName.toLatin1().constData());
   QApplication::restoreOverrideCursor();
 }
@@ -364,8 +365,8 @@ void XGUI_Workshop::saveDocument(QString theName)
 //******************************************************
 void XGUI_Workshop::onExit()
 {
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
-  boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
+  DocumentPtr aDoc = aMgr->rootDocument();
   if(aDoc->isModified()) {
     int anAnswer = QMessageBox::question(
         myMainWindow, tr("Save current file"),
@@ -403,8 +404,8 @@ void XGUI_Workshop::onNew()
 void XGUI_Workshop::onOpen()
 {
   //save current file before close if modified
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
-  boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
+  DocumentPtr aDoc = aMgr->rootDocument();
   if(aDoc->isModified()) {
     //TODO(sbh): re-launch the app?
     int anAnswer = QMessageBox::question(
@@ -468,8 +469,8 @@ void XGUI_Workshop::onSaveAs()
 void XGUI_Workshop::onUndo()
 {
   objectBrowser()->treeView()->setCurrentIndex(QModelIndex());
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
-  boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
+  DocumentPtr aDoc = aMgr->rootDocument();
   if (aDoc->isOperation())
     operationMgr()->abortOperation();
   aDoc->undo();
@@ -480,8 +481,8 @@ void XGUI_Workshop::onUndo()
 void XGUI_Workshop::onRedo()
 {
   objectBrowser()->treeView()->setCurrentIndex(QModelIndex());
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
-  boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
+  DocumentPtr aDoc = aMgr->rootDocument();
   aDoc->redo();
   updateCommandStatus();
 }
@@ -569,7 +570,7 @@ void XGUI_Workshop::updateCommandStatus()
   QList<XGUI_Command*> aCommands = aMenuBar->features();
   QList<XGUI_Command*>::const_iterator aIt;
 
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
   if (aMgr->hasRootDocument()) {
     XGUI_Command* aUndoCmd;
     XGUI_Command* aRedoCmd;
@@ -581,7 +582,7 @@ void XGUI_Workshop::updateCommandStatus()
       else // Enable all commands
         aCmd->enable();
     }
-    boost::shared_ptr<ModelAPI_Document> aDoc = aMgr->rootDocument();
+    DocumentPtr aDoc = aMgr->rootDocument();
     aUndoCmd->setEnabled(aDoc->canUndo());
     aRedoCmd->setEnabled(aDoc->canRedo());
   } else {
@@ -678,7 +679,7 @@ void XGUI_Workshop::onFeatureTriggered()
 //******************************************************
 void XGUI_Workshop::changeCurrentDocument(FeaturePtr thePart)
 {
-  boost::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
+  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
   if (thePart) {
     boost::shared_ptr<ModelAPI_AttributeDocRef> aDocRef = thePart->data()->docRef("PartDocument");
     if (aDocRef)