Salome HOME
Implement 'Show Only' button in group operation
authorvsv <vsv@opencascade.com>
Mon, 17 Jun 2019 12:29:31 +0000 (15:29 +0300)
committervsv <vsv@opencascade.com>
Mon, 17 Jun 2019 12:29:31 +0000 (15:29 +0300)
src/ModuleBase/ModuleBase_IWorkshop.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/XGUI/XGUI_ModuleConnector.cpp
src/XGUI/XGUI_ModuleConnector.h

index c3558145bc06342cd393e8b3a457183966168e04..66fbca9d8f817774327f3cbc1a5779666bfa6385 100644 (file)
@@ -115,6 +115,9 @@ Q_OBJECT
   //! \param theObject a data object
   virtual bool isVisible(const ObjectPtr& theObject) const = 0;
 
+  //! Returns list of currently displayed objects
+  virtual QObjectPtrList displayedObjects() const = 0;
+
   //! Select features clearing previous selection.
   //! If the list is empty then selection will be cleared
   //! \param theValues a list of presentations
@@ -140,6 +143,10 @@ Q_OBJECT
 
   virtual void deactivateCurrentSelector() = 0;
 
+  //! Temporary enable or disable viewer update. Returns previous state of updating
+  //! \param isEnabled new state of the viewer update
+  virtual bool enableUpdateViewer(bool isEnabled) = 0;
+
 signals:
   /// Signal selection changed.
   void selectionChanged();
index 11c502778c71fce36d3cd975b53af32620064191..c403a878039e777797e6050a7468cad8ac4aecd5 100644 (file)
@@ -180,7 +180,9 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
     aFltrLayout->addStretch();
 
     QPushButton* aShowBtn = new QPushButton(tr("Show only"), aFltrWgt);
-    connect(aShowBtn, SIGNAL(clicked(bool)), SLOT(onShowOnly()));
+    aShowBtn->setCheckable(true);
+    aShowBtn->setChecked(false);
+    connect(aShowBtn, SIGNAL(toggled(bool)), SLOT(onShowOnly(bool)));
     aFltrLayout->addWidget(aShowBtn);
 
     aMainLay->addWidget(aFltrWgt);
@@ -222,6 +224,8 @@ void ModuleBase_WidgetMultiSelector::activateCustom()
 void ModuleBase_WidgetMultiSelector::deactivate()
 {
   ModuleBase_WidgetSelector::deactivate();
+  if (myVisibleObjects.size())
+    onShowOnly(false);
 
   myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
   clearSelectedHistory();
@@ -1089,7 +1093,34 @@ void ModuleBase_WidgetMultiSelector::onSameTopology(bool theOn)
   }
 }
 
-void ModuleBase_WidgetMultiSelector::onShowOnly()
+void ModuleBase_WidgetMultiSelector::onShowOnly(bool theChecked)
 {
+  std::list<ResultPtr> aResults = myFeature->results();
+   std::list<ResultPtr>::const_iterator aIt;
+  if (theChecked) {
+    myVisibleObjects = myWorkshop->displayedObjects();
+    for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
+      myVisibleObjects.removeAll(*aIt);
+    }
+  }
+  foreach(ObjectPtr aObj, myVisibleObjects) {
+    aObj->setDisplayed(!theChecked);
+  }
+
+  if (!theChecked) {
+    // Hide and show the group result in order to make it above all objects
+    bool aOldState = myWorkshop->enableUpdateViewer(false);
+    for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
+      (*aIt)->setDisplayed(false);
+    }
+    Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+    for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
+      (*aIt)->setDisplayed(true);
+    }
+    Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+    myWorkshop->enableUpdateViewer(aOldState);
 
+    myVisibleObjects.clear();
+  } else
+    Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
 }
index 651526ea8d1de2809881d1a00bda405386a784fe..1dec34d90856dd41359d592c55bb0f7201b350cf 100644 (file)
@@ -135,7 +135,7 @@ protected slots:
 
   void onSameTopology(bool theOn);
 
-  void onShowOnly();
+  void onShowOnly(bool);
 
 protected:
   /// Returns true if the event is processed. The default implementation is empty, returns false.
@@ -255,6 +255,8 @@ protected:
 
   QCheckBox* myGeomCheck;
   ModuleBase_FilterStarter* myFiltersWgt;
+
+  QObjectPtrList myVisibleObjects;
 };
 
 #endif /* MODULEBASE_WIDGETFILESELECTOR_H_ */
index fee5e9fde70024d7cce1a4b48382182616137eb1..be83f401c0a653f9f4a03c7b4e6b2cd358273280 100644 (file)
@@ -216,3 +216,13 @@ void XGUI_ModuleConnector::deactivateCurrentSelector()
 {
   myWorkshop->deactivateCurrentSelector();
 }
+
+QObjectPtrList XGUI_ModuleConnector::displayedObjects() const
+{
+  return myWorkshop->displayer()->displayedObjects();
+}
+
+bool XGUI_ModuleConnector::enableUpdateViewer(bool isEnabled)
+{
+  return myWorkshop->displayer()->enableUpdateViewer(isEnabled);
+}
\ No newline at end of file
index 07fafe3839b1b565bac9cca9b172045af845798a..6080c893ea4e1cf5353838d890c4b4838b9607c8 100644 (file)
@@ -97,6 +97,9 @@ Q_OBJECT
   //! \param theObject a data object
   virtual bool isVisible(const ObjectPtr& theObject) const;
 
+  //! Returns list of currently displayed objects
+  virtual QObjectPtrList displayedObjects() const;
+
   //! Select features clearing previous selection.
   //! If the list is empty then selection will be cleared
   virtual void setSelected(const QList<std::shared_ptr<ModuleBase_ViewerPrs>>& theValues);
@@ -121,6 +124,10 @@ Q_OBJECT
 
   virtual void deactivateCurrentSelector();
 
+  //! Temporary enable or disable viewer update. Returns previous state of updating
+  //! \param isEnabled new state of the viewer update
+  virtual bool enableUpdateViewer(bool isEnabled);
+
   //! Returns workshop
   XGUI_Workshop* workshop() const { return myWorkshop; }