Salome HOME
Fix for selection of groups features
[modules/shaper.git] / src / XGUI / XGUI_ObjectsBrowser.cpp
index 913d35eef5e7dceb1875ec4838da09c30a727a74..75543ff5c9d92d572f1c6357e80a01c3429c264e 100644 (file)
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultField.h>
 
 #include <ModuleBase_Tools.h>
 #include <ModuleBase_ITreeNode.h>
 
 #include <XGUI_Workshop.h>
+#include <XGUI_Displayer.h>
 
 #include <QLayout>
 #include <QLineEdit>
@@ -49,7 +51,6 @@
 #define FIRST_COL_WIDTH 20
 #define SECOND_COL_WIDTH 30
 
-
 /**
 * \ingroup GUI
 * Tree item delegate for definition of data in column items editor
@@ -227,34 +228,34 @@ void XGUI_DataTree::processHistoryChange(const QModelIndex& theIndex)
     update(aModel->index(i, 1, aParent));
     update(aModel->index(i, 2, aParent));
   }
+  XGUI_ObjectsBrowser* aObjBrowser = qobject_cast<XGUI_ObjectsBrowser*>(parent());
+  aObjBrowser->workshop()->displayer()->updateViewer();
 }
 
 void XGUI_DataTree::processEyeClick(const QModelIndex& theIndex)
 {
+  XGUI_ObjectsBrowser* aObjBrowser = qobject_cast<XGUI_ObjectsBrowser*>(parent());
   XGUI_DataModel* aModel = dataModel();
   ObjectPtr aObj = aModel->object(theIndex);
   if (aObj.get()) {
-    ResultPtr aResObj = std::dynamic_pointer_cast<ModelAPI_Result>(aObj);
-    XGUI_ObjectsBrowser* aObjBrowser = qobject_cast<XGUI_ObjectsBrowser*>(parent());
-    if (aResObj.get()) {
-      std::set<ObjectPtr> anObjects;
-      anObjects.insert(aResObj);
-
-      bool hasHiddenState = aModel->hasHiddenState(theIndex);
-      if (aObjBrowser && hasHiddenState && !aObjBrowser->workshop()->prepareForDisplay(anObjects))
-        return;
-      if (hasHiddenState) { // #issue 2335(hide all faces then show solid problem)
-        if (aResObj->isDisplayed())
-          aResObj->setDisplayed(false);
-        aResObj->setDisplayed(true);
-      }
-      else
-        aResObj->setDisplayed(!aResObj->isDisplayed());
-      Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
-      update(theIndex);
+    std::set<ObjectPtr> anObjects;
+    anObjects.insert(aObj);
+
+    bool hasHiddenState = aModel->hasHiddenState(theIndex);
+    if (aObjBrowser && hasHiddenState && !aObjBrowser->workshop()->prepareForDisplay(anObjects))
+      return;
+    if (hasHiddenState) { // #issue 2335(hide all faces then show solid problem)
+      if (aObj->isDisplayed())
+        aObj->setDisplayed(false);
+      aObj->setDisplayed(true);
     }
+    else
+      aObj->setDisplayed(!aObj->isDisplayed());
+
     // Update list of selected objects because this event happens after
     // selection event in object browser
+    Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+    update(theIndex);
     if (aObjBrowser) {
       aObjBrowser->onSelectionChanged();
     }
@@ -416,7 +417,7 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent, XGUI_Workshop* theW
   aLabelWgt->setPalette(aPalet);
 
   myDocModel = new XGUI_DataModel(this);
-  connect(myDocModel, SIGNAL(modelAboutToBeReset()), SLOT(onBeforeReset()));
+  connect(myDocModel, SIGNAL(beforeTreeRebuild()), SLOT(onBeforeReset()));
   connect(myDocModel, SIGNAL(treeRebuilt()), SLOT(onAfterModelReset()));
 
   connect(myTreeView, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
@@ -509,16 +510,17 @@ void XGUI_ObjectsBrowser::onEditItem()
 }
 
 //***************************************************
-QModelIndexList XGUI_ObjectsBrowser::expandedItems(const QModelIndex& theParent) const
+QList<ModuleBase_ITreeNode*> XGUI_ObjectsBrowser::expandedItems(const QModelIndex& theParent) const
 {
-  QModelIndexList aIndexes;
+  QList<ModuleBase_ITreeNode*> aIndexes;
   QModelIndex aIndex;
-  for (int i = 0; i < myDocModel->rowCount(theParent); i++) {
+  int aCount = myDocModel->rowCount(theParent);
+  for (int i = 0; i < aCount; i++) {
     aIndex = myDocModel->index(i, 0, theParent);
     if (myDocModel->hasChildren(aIndex)) {
       if (myTreeView->isExpanded(aIndex)) {
-        aIndexes.append(aIndex);
-        QModelIndexList aSubIndexes = expandedItems(aIndex);
+        aIndexes.append((ModuleBase_ITreeNode*)aIndex.internalPointer());
+        QList<ModuleBase_ITreeNode*> aSubIndexes = expandedItems(aIndex);
         if (!aSubIndexes.isEmpty())
           aIndexes.append(aSubIndexes);
       }
@@ -655,10 +657,16 @@ void XGUI_ObjectsBrowser::onBeforeReset()
 
 void XGUI_ObjectsBrowser::onAfterModelReset()
 {
-  foreach(QModelIndex aIndex, myExpandedItems) {
-    if (myTreeView->dataModel()->hasIndex(aIndex))
-      myTreeView->setExpanded(aIndex, true);
+  XGUI_DataModel* aModel = myTreeView->dataModel();
+  QModelIndex aIndex;
+  foreach(ModuleBase_ITreeNode* aNode, myExpandedItems) {
+    if (aModel->hasNode(aNode)) {
+      aIndex = aModel->getIndex(aNode, 0);
+      if (aIndex.isValid() && (myTreeView->dataModel()->hasIndex(aIndex)))
+        myTreeView->setExpanded(aIndex, true);
+    }
   }
+  myExpandedItems.clear();
 }
 
 std::list<bool> XGUI_ObjectsBrowser::getStateForDoc(DocumentPtr theDoc) const
@@ -727,3 +735,10 @@ void XGUI_ObjectsBrowser::setFoldersState(const QMap<ObjectPtr, bool>& theStates
     myTreeView->setExpanded(aIdx, aIt.value());
   }
 }
+
+
+void XGUI_ObjectsBrowser::resizeEvent(QResizeEvent* theEvent)
+{
+  QWidget::resizeEvent(theEvent);
+  emit sizeChanged();
+}