]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Update document in Data tree model on loading a new document
authorvsv <vitaly.smetannikov@opencascade.com>
Thu, 5 Jun 2014 14:18:15 +0000 (18:18 +0400)
committervsv <vitaly.smetannikov@opencascade.com>
Thu, 5 Jun 2014 14:18:15 +0000 (18:18 +0400)
src/XGUI/XGUI_DataTreeModel.h
src/XGUI/XGUI_DocumentDataModel.cpp
src/XGUI/XGUI_DocumentDataModel.h
src/XGUI/XGUI_ObjectsBrowser.cpp
src/XGUI/XGUI_ObjectsBrowser.h
src/XGUI/XGUI_PartDataModel.cpp
src/XGUI/XGUI_PartDataModel.h
src/XGUI/XGUI_Viewer.cpp
src/XGUI/XGUI_Workshop.cpp

index 05c5f7e123961d7bea1ebad2ff907413198172eb..5b9f5a8394f4c2ec8c6d8fc74cab6db593ba8252 100644 (file)
@@ -18,8 +18,8 @@
 class XGUI_EXPORT XGUI_FeaturesModel : public QAbstractItemModel
 {
 public:
-  XGUI_FeaturesModel(const DocumentPtr& theDocument, QObject* theParent):
-      QAbstractItemModel(theParent), myDocument(theDocument), myItemsColor(Qt::black) {}
+  XGUI_FeaturesModel(QObject* theParent):
+      QAbstractItemModel(theParent), myItemsColor(Qt::black) {}
 
   //! Returns Feature object by the given Model index.
   //! Returns 0 if the given index is not index of a feature
@@ -40,7 +40,6 @@ public:
   QColor itemsColor() const { return myItemsColor; }
 
 protected:
-  boost::shared_ptr<ModelAPI_Document> myDocument;
   QColor myItemsColor;
 };
 
@@ -52,8 +51,8 @@ protected:
 class XGUI_PartModel : public XGUI_FeaturesModel
 {
 public:
-  XGUI_PartModel(const DocumentPtr& theDocument, QObject* theParent):
-      XGUI_FeaturesModel(theDocument, theParent) {}
+  XGUI_PartModel(QObject* theParent):
+      XGUI_FeaturesModel(theParent) {}
 
   void setPartId(int theId) { myId = theId; }
 
index 066ebdcae6985bf5c7d038401f4f726f173f98fe..7c2529bd5974998c34aab10dff4b63d185ebc1bd 100644 (file)
 XGUI_DocumentDataModel::XGUI_DocumentDataModel(QObject* theParent)
   : QAbstractItemModel(theParent), myActivePart(0)
 {
-  // Find Document object
-  PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
-  myDocument = aMgr->currentDocument();
-
   // Register in event loop
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_CREATED));
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_UPDATED));
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_DELETED));
 
   // Create a top part of data tree model
-  myModel = new XGUI_TopDataModel(myDocument, this);
+  myModel = new XGUI_TopDataModel(this);
   myModel->setItemsColor(ACTIVE_COLOR);
 }
 
@@ -48,6 +44,8 @@ XGUI_DocumentDataModel::~XGUI_DocumentDataModel()
 
 void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage)
 {
+  DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+
   // Created object event *******************
   if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_CREATED)) {
     const Model_FeatureUpdatedMessage* aUpdMsg = dynamic_cast<const Model_FeatureUpdatedMessage*>(theMessage);
@@ -57,11 +55,11 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage)
     for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) {
       FeaturePtr aFeature = (*aIt);
       DocumentPtr aDoc = aFeature->document();
-      if (aDoc == myDocument) {  // If root objects
+      if (aDoc == aRootDoc) {  // If root objects
         if (aFeature->getGroup().compare(PARTS_GROUP) == 0) { // Update only Parts group
           // Add a new part
           int aStart = myPartModels.size();
-          XGUI_PartDataModel* aModel = new XGUI_PartDataModel(myDocument, this);
+          XGUI_PartDataModel* aModel = new XGUI_PartDataModel(this);
           aModel->setPartId(myPartModels.count());
           myPartModels.append(aModel);
           insertRow(aStart, partFolderNode());
@@ -97,7 +95,7 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage)
     std::set<std::string>::const_iterator aIt;
     for (aIt = aGroups.begin(); aIt != aGroups.end(); ++aIt) {
       std::string aGroup = (*aIt);
-      if (aDoc == myDocument) {  // If root objects
+      if (aDoc == aRootDoc) {  // If root objects
         if (aGroup.compare(PARTS_GROUP) == 0) { // Updsate only Parts group
           int aStart = myPartModels.size() - 1;
           removeSubModel(aStart);
@@ -142,22 +140,30 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage)
 
   // Reset whole tree **************************
   } else {  
-    beginResetModel();
-    int aNbParts = myDocument->size(PARTS_GROUP);
-    if (myPartModels.size() != aNbParts) { // resize internal models
-      while (myPartModels.size() > aNbParts) {
-        delete myPartModels.last();
-        myPartModels.removeLast();
-      }
-      while (myPartModels.size() < aNbParts) {
-        myPartModels.append(new XGUI_PartDataModel(myDocument, this));
-      }
-      for (int i = 0; i < myPartModels.size(); i++)
-        myPartModels.at(i)->setPartId(i);
+    rebuildDataTree();
+  }
+}
+
+void XGUI_DocumentDataModel::rebuildDataTree()
+{
+  DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+
+  beginResetModel();
+  clearModelIndexes();
+
+  int aNbParts = aRootDoc->size(PARTS_GROUP);
+  if (myPartModels.size() != aNbParts) { // resize internal models
+    while (myPartModels.size() > aNbParts) {
+      delete myPartModels.last();
+      myPartModels.removeLast();
+    }
+    while (myPartModels.size() < aNbParts) {
+      myPartModels.append(new XGUI_PartDataModel(this));
     }
-    clearModelIndexes();
-    endResetModel();
+    for (int i = 0; i < myPartModels.size(); i++)
+      myPartModels.at(i)->setPartId(i);
   }
+  endResetModel();
 }
 
 QVariant XGUI_DocumentDataModel::data(const QModelIndex& theIndex, int theRole) const
@@ -185,7 +191,8 @@ QVariant XGUI_DocumentDataModel::data(const QModelIndex& theIndex, int theRole)
   case HistoryNode:
     {
       int aOffset = historyOffset();
-      FeaturePtr aFeature = myDocument->feature(FEATURES_GROUP, theIndex.row() - aOffset);
+      DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+      FeaturePtr aFeature = aRootDoc->feature(FEATURES_GROUP, theIndex.row() - aOffset);
       if (!aFeature)
         return QVariant();
       switch (theRole) {
@@ -225,10 +232,11 @@ QVariant XGUI_DocumentDataModel::headerData(int theSection, Qt::Orientation theO
 int XGUI_DocumentDataModel::rowCount(const QModelIndex& theParent) const
 {
   if (!theParent.isValid()) {
+    DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
     // Size of external models
     int aVal = historyOffset();
     // Plus history size
-    aVal += myDocument->size(FEATURES_GROUP);
+    aVal += aRootDoc->size(FEATURES_GROUP);
     return aVal;
   }
   if (theParent.internalId() == PartsFolder) {
@@ -354,8 +362,9 @@ FeaturePtr XGUI_DocumentDataModel::feature(const QModelIndex& theIndex) const
   if (theIndex.internalId() == PartsFolder)
     return FeaturePtr();
   if (theIndex.internalId() == HistoryNode) {
-      int aOffset = historyOffset();
-      return myDocument->feature(FEATURES_GROUP, theIndex.row() - aOffset);
+    DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+    int aOffset = historyOffset();
+    return aRootDoc->feature(FEATURES_GROUP, theIndex.row() - aOffset);
   }
   QModelIndex* aIndex = toSourceModelIndex(theIndex);
   if (!isSubModel(aIndex->model())) 
index c43b99d19c42e5588b0aa859e2bac4e2cf03ed91..6683db4c9e228141c715ce603f98402f2f0279e4 100644 (file)
@@ -71,6 +71,8 @@ public:
   //! Deactivates a Part
   void deactivatePart();
 
+  void rebuildDataTree();
+
 private:
 
   enum {PartsFolder, HistoryNode};
@@ -103,9 +105,6 @@ private:
   int historyOffset() const;
 
 
-  //! Document
-  boost::shared_ptr<ModelAPI_Document> myDocument;
-
   //! Data model of top part of data tree (not parts object)
   XGUI_TopDataModel* myModel;
 
index 818e72210722732ae689684011070b0aa99dd668..f77f005e884fba1757c1566c3f71e51378c85d9a 100644 (file)
@@ -322,4 +322,11 @@ void XGUI_ObjectsBrowser::onSelectionChanged()
 {
   myFeaturesList = myTreeView->selectedFeatures();
   emit selectionChanged();
+}
+
+//***************************************************
+void XGUI_ObjectsBrowser::rebuildDataTree()
+{
+  myDocModel->rebuildDataTree();
+  update();
 }
\ No newline at end of file
index 8e4842df549e707f5bc29bc81f0bef552d023925..f9ae1fed396eebd1d8cd0c67675848eb252b04f1 100644 (file)
@@ -75,6 +75,8 @@ public:
   //! Activates currently selected part. Signal activePartChanged will not be sent
   void activatePart(const FeaturePtr& thePart);
 
+  void rebuildDataTree();
+
 signals:
   //! Emited when selection is changed
   void selectionChanged();
index dc09185cc52be72def60de75adb7ccdb4e99c953..ea8c1a51a9ebed97ff22272368516875ed531882 100644 (file)
@@ -21,8 +21,8 @@
 //}
 
 
-XGUI_TopDataModel::XGUI_TopDataModel(const DocumentPtr& theDocument, QObject* theParent)
-  : XGUI_FeaturesModel(theDocument, theParent)
+XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
+  : XGUI_FeaturesModel(theParent)
 {
 }
   
@@ -41,7 +41,8 @@ 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());
+        DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+        FeaturePtr aFeature = aRootDoc->feature(PARAMETERS_GROUP, theIndex.row());
         if (aFeature)
           return boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature)->getName().c_str();
       } 
@@ -49,7 +50,8 @@ 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());
+        DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+        FeaturePtr aFeature = aRootDoc->feature(CONSTRUCTIONS_GROUP, theIndex.row());
         if (aFeature)
           return boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature)->getName().c_str();
       }
@@ -65,7 +67,8 @@ 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());
+        DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+        FeaturePtr aFeature = aRootDoc->feature(CONSTRUCTIONS_GROUP, theIndex.row());
         if (aFeature)
           return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
       }
@@ -92,11 +95,12 @@ int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
   if (!theParent.isValid()) 
     return 2;
 
+  DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
   if (theParent.internalId() == ParamsFolder)
-    return myDocument->size(PARAMETERS_GROUP);
+    return aRootDoc->size(PARAMETERS_GROUP);
 
   if (theParent.internalId() == ConstructFolder)
-    return myDocument->size(CONSTRUCTIONS_GROUP);
+    return aRootDoc->size(CONSTRUCTIONS_GROUP);
 
   return 0;
 }
@@ -152,9 +156,15 @@ FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
   case ConstructFolder:
     return FeaturePtr();
   case ParamObject:
-    return myDocument->feature(PARAMETERS_GROUP, theIndex.row());
+    {
+      DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+      return aRootDoc->feature(PARAMETERS_GROUP, theIndex.row());
+    }
   case ConstructObject:
-    return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+    {
+      DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+      return aRootDoc->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+    }
   }
   return FeaturePtr();
 }
@@ -178,11 +188,12 @@ QModelIndex XGUI_TopDataModel::featureIndex(const FeaturePtr& theFeature) const
 {
   QModelIndex aIndex;
   if (theFeature) {
+    DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
     std::string aGroup = theFeature->getGroup();
-    int aNb = myDocument->size(aGroup);
+    int aNb = aRootDoc->size(aGroup);
     int aRow = -1;
     for (int i = 0; i < aNb; i++) {
-      if (myDocument->feature(aGroup, i) == theFeature) {
+      if (aRootDoc->feature(aGroup, i) == theFeature) {
         aRow = i;
         break;
       }
@@ -202,8 +213,8 @@ QModelIndex XGUI_TopDataModel::featureIndex(const FeaturePtr& theFeature) const
 //******************************************************************
 //******************************************************************
 //******************************************************************
-XGUI_PartDataModel::XGUI_PartDataModel(const DocumentPtr& theDocument, QObject* theParent)
-  : XGUI_PartModel(theDocument, theParent)
+XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
+  : XGUI_PartModel(theParent)
 {
 }
 
@@ -220,7 +231,8 @@ QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) cons
     switch (theIndex.internalId()) {
     case MyRoot:
       {
-        FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId);
+        DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+        FeaturePtr aFeature = aRootDoc->feature(PARTS_GROUP, myId);
         if (aFeature)
           return boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature)->getName().c_str();
       }
@@ -291,11 +303,13 @@ QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation
 
 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
 {
-  if (!parent.isValid()) 
-    if (myDocument->feature(PARTS_GROUP, myId))
+  if (!parent.isValid()) {
+    DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+    if (aRootDoc->feature(PARTS_GROUP, myId))
       return 1;
     else 
       return 0;
+  }
   switch (parent.internalId()) {
   case MyRoot:
     return 3 + featureDocument()->size(FEATURES_GROUP);
@@ -368,7 +382,8 @@ bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
 
 DocumentPtr XGUI_PartDataModel::featureDocument() const
 {
-  FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId, true);
+  DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+  FeaturePtr aFeature = aRootDoc->feature(PARTS_GROUP, myId, true);
   return aFeature->data()->docRef("PartDocument")->value();
 }
  
@@ -376,7 +391,10 @@ FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
 {
   switch (theIndex.internalId()) {
   case MyRoot:
-    return myDocument->feature(PARTS_GROUP, myId);
+    {
+      DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+      return aRootDoc->feature(PARTS_GROUP, myId);
+    }
   case ParamsFolder:
   case ConstructFolder:
   case BodiesFolder:
@@ -415,7 +433,8 @@ QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
 
 FeaturePtr XGUI_PartDataModel::part() const
 {
-  return myDocument->feature(PARTS_GROUP, myId, true);
+  DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+  return aRootDoc->feature(PARTS_GROUP, myId, true);
 }
 
 QModelIndex XGUI_PartDataModel::featureIndex(const FeaturePtr& theFeature) const
@@ -426,10 +445,11 @@ QModelIndex XGUI_PartDataModel::featureIndex(const FeaturePtr& theFeature) const
       return aIndex;
 
     std::string aGroup = theFeature->getGroup();
-    int aNb = myDocument->size(aGroup);
+    DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+    int aNb = aRootDoc->size(aGroup);
     int aRow = -1;
     for (int i = 0; i < aNb; i++) {
-      if (myDocument->feature(aGroup, i) == theFeature) {
+      if (aRootDoc->feature(aGroup, i) == theFeature) {
         aRow = i;
         break;
       }
index e1533ee0bfbd4a14b04628ca438a1715d1f6fa20..8d43fe46e440d067586f7747275ff883468696c9 100644 (file)
@@ -14,7 +14,7 @@ class XGUI_EXPORT XGUI_TopDataModel : public XGUI_FeaturesModel
 {
   Q_OBJECT
 public:
-  XGUI_TopDataModel(const DocumentPtr& theDocument, QObject* theParent);
+  XGUI_TopDataModel(QObject* theParent);
   virtual ~XGUI_TopDataModel();
 
   // Reimpl from QAbstractItemModel
@@ -67,7 +67,7 @@ class XGUI_PartDataModel : public XGUI_PartModel
 {
   Q_OBJECT
 public:
-  XGUI_PartDataModel(const DocumentPtr& theDocument, QObject* theParent);
+  XGUI_PartDataModel(QObject* theParent);
   virtual ~XGUI_PartDataModel();
 
   // Reimpl from QAbstractItemModel
index 3d5af347ade6fc484c4c3f65ec9856abe9ff698f..db719599f1fe25c91454020efc937b3d2ef5c9e3 100644 (file)
@@ -464,7 +464,6 @@ void XGUI_Viewer::addView(QMdiSubWindow* theView)
 void XGUI_Viewer::onWindowActivated(QMdiSubWindow* view)
 {
   if (view && (view != myActiveView) && (!view->isMinimized())) {
-    qDebug("onWindowActivated");
     myActiveView = view;
     ((XGUI_ViewWindow*)myActiveView->widget())->windowActivated();
     QList<QMdiSubWindow*>::iterator aIt;
index cdf0c42a5cf06512e9937562b8755867ebcaa84d..8ac845aaa1c8effe5d6fb8b6b6b4b812732f949e 100644 (file)
@@ -472,8 +472,9 @@ void XGUI_Workshop::onOpen()
   }
   QApplication::setOverrideCursor(Qt::WaitCursor);
   aDoc->load(myCurrentDir.toLatin1().constData());
-  QApplication::restoreOverrideCursor();
   updateCommandStatus();
+  myObjectBrowser->rebuildDataTree();
+  QApplication::restoreOverrideCursor();
 }
 
 //******************************************************