Salome HOME
Issue #1412: Make possible to switch on/off sub-shapes modes selection in AND condition.
[modules/shaper.git] / src / XGUI / XGUI_Workshop.cpp
index 75de3174c1dcee76aeccae7f357bb40172a20d8f..9da518760816e3a10c6610188e63963b066a69a8 100755 (executable)
@@ -4,6 +4,7 @@
 #include "XGUI_Workshop.h"
 
 #include "XGUI_ActionsMgr.h"
+#include "XGUI_MenuMgr.h"
 #include "XGUI_ColorDialog.h"
 #include "XGUI_ContextMenuMgr.h"
 #include "XGUI_Displayer.h"
@@ -68,6 +69,7 @@
 #include <ModuleBase_OperationAction.h>
 #include <ModuleBase_PagedContainer.h>
 #include <ModuleBase_WidgetValidated.h>
+#include <ModuleBase_ModelWidget.h>
 
 #include <Config_Common.h>
 #include <Config_FeatureMessage.h>
@@ -75,6 +77,7 @@
 #include <Config_PointerMessage.h>
 #include <Config_PropManager.h>
 #include <Config_SelectionFilterMessage.h>
+#include <Config_DataModelReader.h>
 
 #include <SUIT_ResourceMgr.h>
 
@@ -119,8 +122,8 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
       mySalomeConnector(theConnector),
       myPropertyPanel(0),
       myObjectBrowser(0),
-      myDisplayer(0),
-      myViewerSelMode(TopAbs_FACE)
+      myDisplayer(0)
+      //myViewerSelMode(TopAbs_FACE)
 {
 #ifndef HAVE_SALOME
   myMainWindow = new AppElements_MainWindow();
@@ -133,6 +136,11 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
     QLocale::setDefault( QLocale::system() );
 #endif
 
+  myViewerSelMode << TopAbs_FACE << TopAbs_EDGE << TopAbs_VERTEX;
+
+  myDataModelXMLReader = new Config_DataModelReader();
+  myDataModelXMLReader->readAll();
+
   myDisplayer = new XGUI_Displayer(this);
 
   mySelector = new XGUI_SelectionMgr(this);
@@ -140,14 +148,15 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
 
   myOperationMgr = new XGUI_OperationMgr(this, 0);
   myActionsMgr = new XGUI_ActionsMgr(this);
+  myMenuMgr = new XGUI_MenuMgr(this);
   myErrorDlg = new XGUI_ErrorDialog(QApplication::desktop());
   myContextMenuMgr = new XGUI_ContextMenuMgr(this);
   connect(myContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this,
           SLOT(onContextMenuCommand(const QString&, bool)));
 
   myViewerProxy = new XGUI_ViewerProxy(this);
-  connect(myViewerProxy, SIGNAL(selectionChanged()),
-          myActionsMgr,  SLOT(updateOnViewSelection()));
+  //connect(myViewerProxy, SIGNAL(selectionChanged()),
+  //        myActionsMgr,  SLOT(updateOnViewSelection()));
 
   myModuleConnector = new XGUI_ModuleConnector(this);
 
@@ -189,14 +198,15 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
   Config_PropManager::registerProp("Visualization", "result_part_color", "Part color",
                                    Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR());
   
-  myViewerSelMode = 
-    ModuleBase_Preferences::resourceMgr()->integerValue("Viewer", "selection", TopAbs_FACE);
+  //myViewerSelMode = 
+  //  ModuleBase_Preferences::resourceMgr()->integerValue("Viewer", "selection", TopAbs_FACE);
 }
 
 //******************************************************
 XGUI_Workshop::~XGUI_Workshop(void)
 {
   delete myDisplayer;
+  delete myDataModelXMLReader;
 }
 
 //******************************************************
@@ -408,8 +418,15 @@ void XGUI_Workshop::onAcceptActionClicked()
 }
 
 //******************************************************
-void XGUI_Workshop::onPreivewActionClicked()
+void XGUI_Workshop::onPreviewActionClicked()
 {
+  ModuleBase_IPropertyPanel* aPanel = propertyPanel();
+  if (aPanel) {
+    ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
+    if (anActiveWidget && anActiveWidget->getValueState() == ModuleBase_ModelWidget::ModifiedInPP) {
+      anActiveWidget->storeValue();
+    }
+  }
   std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
                 new Events_Message(Events_Loop::eventByName(EVENT_PREVIEW_REQUESTED)));
   Events_Loop::loop()->send(aMsg);
@@ -475,21 +492,26 @@ void XGUI_Workshop::setPropertyPanel(ModuleBase_Operation* theOperation)
       return;
     }
   }
+  // for performance purpose, flush should be done after all controls are filled
+  bool isUpdateFlushed = false;
   foreach (ModuleBase_ModelWidget* aWidget, aWidgets) {
     bool isStoreValue = !aFOperation->isEditOperation() &&
                         !aWidget->getDefaultValue().empty() &&
                         !aWidget->isComputedDefault();
-    aWidget->setFeature(aFeature, isStoreValue);
+    aWidget->setFeature(aFeature, isStoreValue, isUpdateFlushed);
+    if (!isStoreValue)
+      aWidget->restoreValue();
     aWidget->enableFocusProcessing();
   }
+  ModuleBase_Tools::flushUpdated(aFeature);
 
   // update visible state of Preview button
 #ifdef HAVE_SALOME
-  bool anIsAutoPreview = true;//mySalomeConnector->featureInfo(aFeatureKind)->isAutoPreview();
+  bool anIsAutoPreview = mySalomeConnector->featureInfo(aFeatureKind.c_str())->isAutoPreview();
 #else
   AppElements_MainMenu* aMenuBar = mainWindow()->menuObject();
   AppElements_Command* aCommand = aMenuBar->feature(aFeatureKind.c_str());
-  bool anIsAutoPreview = aCommand && aCommand->isAutoPreview();
+  bool anIsAutoPreview = aCommand && aCommand->featureMessage()->isAutoPreview();
 #endif
   if (!anIsAutoPreview) {
     myPropertyPanel->findButton(PROP_PANEL_PREVIEW)->setVisible(true);
@@ -525,10 +547,12 @@ void XGUI_Workshop::connectToPropertyPanel(const bool isToConnect)
        if (isToConnect) {
         connect(aWidget, SIGNAL(valueStateChanged(int)), this, SLOT(onWidgetStateChanged(int)));
         connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged()));
-      }
+        connect(aWidget, SIGNAL(objectUpdated()), this, SLOT(onWidgetObjectUpdated()));
+       }
       else {
         disconnect(aWidget, SIGNAL(valueStateChanged(int)), this, SLOT(onWidgetStateChanged(int)));
         disconnect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged()));
+        disconnect(aWidget, SIGNAL(objectUpdated()), this, SLOT(onWidgetObjectUpdated()));
       }
     }
   }
@@ -612,8 +636,13 @@ void XGUI_Workshop::setGrantedFeatures(ModuleBase_Operation* theOperation)
     return;
 
   QStringList aGrantedIds;
-  if (isSalomeMode())
-    aGrantedIds = mySalomeConnector->nestedActions(theOperation->id());
+  if (isSalomeMode()) {
+    const std::shared_ptr<Config_FeatureMessage>& anInfo =
+                         mySalomeConnector->featureInfo(theOperation->id());
+    if (anInfo.get())
+      aGrantedIds = QString::fromStdString(anInfo->nestedFeatures())
+                                   .split(" ", QString::SkipEmptyParts);
+  }
   else
     aGrantedIds = myActionsMgr->nestedCommands(theOperation->id());
 
@@ -914,6 +943,11 @@ void XGUI_Workshop::onValuesChanged()
   }
 }
 
+void XGUI_Workshop::onWidgetObjectUpdated()
+{
+  operationMgr()->onValidateOperation();
+}
+
 ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule)
 {
   QString libName = QString::fromStdString(library(theModule.toStdString()));
@@ -987,6 +1021,9 @@ bool XGUI_Workshop::createModule()
   //  myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr)));
 
   myModule->createFeatures();
+#ifdef HAVE_SALOME
+  salomeConnector()->createFeatureActions();
+#endif
   //myActionsMgr->update();
   return true;
 }
@@ -1050,6 +1087,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent)
   aObjDock->setStyleSheet(
       "::title { position: relative; padding-left: 5px; text-align: left center }");
   myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock);
+  myObjectBrowser->setXMLReader(myDataModelXMLReader);
   myModule->customizeObjectBrowser(myObjectBrowser);
   aObjDock->setWidget(myObjectBrowser);
 
@@ -1083,7 +1121,7 @@ void XGUI_Workshop::createDockWidgets()
   connect(aCancelAct, SIGNAL(triggered()), myOperationMgr, SLOT(onAbortOperation()));
 
   QAction* aPreviewAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Preview);
-  connect(aPreviewAct, SIGNAL(triggered()), this, SLOT(onPreivewActionClicked()));
+  connect(aPreviewAct, SIGNAL(triggered()), this, SLOT(onPreviewActionClicked()));
 
   connect(myPropertyPanel, SIGNAL(keyReleased(QObject*, QKeyEvent*)),
           myOperationMgr,  SLOT(onKeyReleased(QObject*, QKeyEvent*)));
@@ -1197,13 +1235,22 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked)
     setViewerSelectionMode(-1);
   } else if (theId == "SHOW_RESULTS_CMD") {
     highlightResults(aObjects);
+  } else if (theId == "SHOW_FEATURE_CMD") {
+    highlightFeature(aObjects);
   }
 }
 
 //**************************************************************
 void XGUI_Workshop::setViewerSelectionMode(int theMode)
 {
-  myViewerSelMode = theMode;
+  if (theMode == -1)
+    myViewerSelMode.clear();
+  else {
+    if (myViewerSelMode.contains(theMode))
+      myViewerSelMode.removeAll(theMode);
+    else
+      myViewerSelMode.append(theMode);
+  }
   activateObjectsSelection(myDisplayer->displayedObjects());
 }
 
@@ -1212,7 +1259,7 @@ void XGUI_Workshop::activateObjectsSelection(const QObjectPtrList& theList)
 {
   QIntList aModes;
   module()->activeSelectionModes(aModes);
-  if (aModes.isEmpty() && (myViewerSelMode != -1))
+  if (aModes.isEmpty() && (myViewerSelMode.length() > 0))
     aModes.append(myViewerSelMode);
   myDisplayer->activateObjects(aModes, theList);
 }
@@ -1246,14 +1293,14 @@ void XGUI_Workshop::deleteObjects()
   // 3. delete objects
   std::set<FeaturePtr> anIgnoredFeatures;
   std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
-  findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
+  ModuleBase_Tools::findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
 
   bool doDeleteReferences = true;
-  if (isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures,
-                                    desktop(), doDeleteReferences)) {
+  if (ModuleBase_Tools::isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures, 
+      aIndirectRefFeatures, desktop(), doDeleteReferences)) {
     // start operation
-    QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text();
-    aDescription += " " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", "));
+    QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text() + " %1";
+    aDescription = aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", "));
     ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, module());
     operationMgr()->startOperation(anOpAction);
 
@@ -1301,7 +1348,7 @@ void XGUI_Workshop::cleanHistory()
     if (aFeature.get()) {
       std::set<FeaturePtr> alreadyProcessed;
       aDirectRefFeatures.clear();
-      XGUI_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
+      ModuleBase_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
                                                     aDirectRefFeatures, alreadyProcessed);
       if (aDirectRefFeatures.empty() && !anUnusedObjects.contains(aFeature))
         anUnusedObjects.append(aFeature);
@@ -1358,7 +1405,7 @@ void XGUI_Workshop::cleanHistory()
     mySelector->clearSelection();
 
     std::set<FeaturePtr> anIgnoredFeatures;
-    if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId)) {
+    if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId, true)) {
       operationMgr()->commitOperation();
     }
     else {
@@ -1423,110 +1470,11 @@ void XGUI_Workshop::moveObjects()
 }
 
 //**************************************************************
-void XGUI_Workshop::findReferences(const QObjectPtrList& theList,
-                                   std::set<FeaturePtr>& aDirectRefFeatures,
-                                   std::set<FeaturePtr>& aIndirectRefFeatures)
-{
-  foreach (ObjectPtr aDeletedObj, theList) {
-    std::set<FeaturePtr> alreadyProcessed;
-    XGUI_Tools::refsToFeatureInAllDocuments(aDeletedObj, aDeletedObj, theList, aDirectRefFeatures,
-                                            aIndirectRefFeatures, alreadyProcessed);
-    std::set<FeaturePtr> aDifference;
-    std::set_difference(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end(), 
-                        aDirectRefFeatures.begin(), aDirectRefFeatures.end(), 
-                        std::inserter(aDifference, aDifference.begin()));
-    aIndirectRefFeatures = aDifference;
-  }
-}
-
-bool XGUI_Workshop::isDeleteFeatureWithReferences(const QObjectPtrList& theList,
-                                   const std::set<FeaturePtr>& aDirectRefFeatures,
-                                   const std::set<FeaturePtr>& aIndirectRefFeatures,
-                                   QWidget* theParent,
-                                   bool& doDeleteReferences)
-{
-  doDeleteReferences = true;
-
-  QString aDirectNames, aIndirectNames;
-  if (!aDirectRefFeatures.empty()) {
-    QStringList aDirectRefNames;
-    foreach (const FeaturePtr& aFeature, aDirectRefFeatures)
-      aDirectRefNames.append(aFeature->name().c_str());
-    aDirectNames = aDirectRefNames.join(", ");
-
-    QStringList aIndirectRefNames;
-    foreach (const FeaturePtr& aFeature, aIndirectRefFeatures)
-      aIndirectRefNames.append(aFeature->name().c_str());
-    aIndirectNames = aIndirectRefNames.join(", ");
-  }
-
-  bool aCanReplaceParameters = !aDirectRefFeatures.empty();
-  QStringList aPartFeatureNames;
-  foreach (ObjectPtr aObj, theList) {
-    FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
-    // invalid feature data means that the feature is already removed in model,
-    // we needn't process it. E.g. delete of feature from create operation. The operation abort
-    // will delete the operation
-    if (!aFeature->data()->isValid())
-      continue;
-    ResultPtr aFirstResult = aFeature->firstResult();
-    if (!aFirstResult.get())
-      continue;
-    std::string aResultGroupName = aFirstResult->groupName();
-    if (aResultGroupName == ModelAPI_ResultPart::group())
-      aPartFeatureNames.append(aFeature->name().c_str());
-
-    if (aCanReplaceParameters && aResultGroupName != ModelAPI_ResultParameter::group())
-      aCanReplaceParameters = false;
-  }
-  QString aPartNames = aPartFeatureNames.join(", ");
-
-  QMessageBox aMessageBox(theParent);
-  aMessageBox.setWindowTitle(tr("Delete features"));
-  aMessageBox.setIcon(QMessageBox::Warning);
-  aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
-  aMessageBox.setDefaultButton(QMessageBox::No);
-
-  QString aText;
-  if (!aDirectNames.isEmpty() || !aIndirectNames.isEmpty()) {
-    if (aCanReplaceParameters) {
-      aText = QString(tr("Selected parameters are used in the following features: %1.\nThese features will be deleted.\nOr parameters could be replaced by their values.\n")
-                      .arg(aDirectNames));
-      if (!aIndirectNames.isEmpty())
-        aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
-      QPushButton *aReplaceButton = aMessageBox.addButton(tr("Replace"), QMessageBox::ActionRole);
-    } else {
-      aText = QString(tr("Selected features are used in the following features: %1.\nThese features will be deleted.\n")).arg(aDirectNames);
-      if (!aIndirectNames.isEmpty())
-        aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
-    }
-  }
-  if (!aPartNames.isEmpty())
-    aText += QString(tr("The following parts will be deleted: %1.\n")).arg(aPartNames);
-
-  if (!aText.isEmpty()) {
-    aText += "Would you like to continue?";
-    aMessageBox.setText(aText);
-    aMessageBox.exec();
-    QMessageBox::ButtonRole aButtonRole = aMessageBox.buttonRole(aMessageBox.clickedButton());
-
-    if (aButtonRole == QMessageBox::NoRole)
-      return false;
-
-    if (aButtonRole == QMessageBox::ActionRole) {
-      foreach (ObjectPtr aObj, theList)
-        ModelAPI_ReplaceParameterMessage::send(aObj, this);
-      doDeleteReferences = false;
-    }
-  }
-  return true;
-}
-
 bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theFeatures,
                                    const std::set<FeaturePtr>& theIgnoredFeatures)
 {
   std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
-  findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
+  ModuleBase_Tools::findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
   return deleteFeaturesInternal(theFeatures, aDirectRefFeatures, aIndirectRefFeatures,
                                 theIgnoredFeatures);
 }
@@ -1537,6 +1485,7 @@ bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
                                            const std::set<FeaturePtr>& theIgnoredFeatures,
                                            const bool doDeleteReferences)
 {
+  bool isDone = false;
   if (doDeleteReferences) {
     std::set<FeaturePtr> aFeaturesToDelete = aDirectRefFeatures;
     aFeaturesToDelete.insert(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end());
@@ -1549,7 +1498,9 @@ bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
       FeaturePtr aFeature = (*anIt);
       DocumentPtr aDoc = aFeature->document();
       if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) {
+        // flush REDISPLAY signal after remove feature
         aDoc->removeFeature(aFeature);
+        isDone = true;
 #ifdef DEBUG_DELETE
         anInfo.append(ModuleBase_Tools::objectInfo(aFeature).toStdString().c_str());
 #endif
@@ -1562,13 +1513,21 @@ bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
   }
 
   QString anActionId = "DELETE_CMD";
-  return removeFeatures(theList, theIgnoredFeatures, anActionId);
+  isDone = removeFeatures(theList, theIgnoredFeatures, anActionId, false) || isDone;
+
+  if (isDone) {
+    // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+    // if should be done after removeFeature() of document
+    Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  }
+  return isDone;
 }
 
 //**************************************************************
 bool XGUI_Workshop::removeFeatures(const QObjectPtrList& theList,
                                    const std::set<FeaturePtr>& theIgnoredFeatures,
-                                   const QString& theActionId)
+                                   const QString& theActionId,
+                                   const bool theFlushRedisplay)
 {
   bool isDone = false;
 
@@ -1596,11 +1555,18 @@ bool XGUI_Workshop::removeFeatures(const QObjectPtrList& theList,
         anInfo.append(anInfoStr);
         qDebug(QString("remove feature :%1").arg(anInfoStr).toStdString().c_str());
 #endif
+        // flush REDISPLAY signal after remove feature
         aDoc->removeFeature(aFeature);
         isDone = true;
       }
     }
   }
+  if (isDone && theFlushRedisplay) {
+    // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+    // if should be done after removeFeature() of document
+    Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  }
+
 #ifdef DEBUG_DELETE
   qDebug(QString("remove features:%1").arg(anInfo.join("; ")).toStdString().c_str());
 #endif
@@ -1706,7 +1672,7 @@ bool XGUI_Workshop::canMoveFeature()
       std::set<FeaturePtr> aPlacedFeatures(aFeaturesBetween.begin(), aFeaturesBetween.end());
       // 2. Get all reference features to the selected object in the document 
       std::set<FeaturePtr> aRefFeatures;
-      XGUI_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
+      ModuleBase_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
 
       if (aRefFeatures.empty())
         continue;
@@ -2026,12 +1992,14 @@ void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects)
   FeaturePtr aFeature;
   QObjectPtrList aSelList = theObjects;
   std::list<ResultPtr> aResList;
+  bool aHasHidden = false;
   foreach(ObjectPtr aObj, theObjects) {
     aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObj);
     if (aFeature.get()) {
       aResList = aFeature->results();
       std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aIt;
       for(aIt = aResList.cbegin(); aIt != aResList.cend(); aIt++) {
+        aHasHidden |= (*aIt)->isConcealed();
         aSelList.append(*aIt);
       }
     }
@@ -2042,4 +2010,29 @@ void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects)
     objectBrowser()->setObjectsSelected(aSelList);
     objectBrowser()->blockSignals(aBlocked);
   }
+  if (aHasHidden) 
+    QMessageBox::information(desktop(), tr("Find results"), 
+                             tr("Results not found"), QMessageBox::Ok);
+}
+
+void XGUI_Workshop::highlightFeature(const QObjectPtrList& theObjects)
+{
+  ResultPtr aResult;
+  QObjectPtrList aSelList = theObjects;
+  FeaturePtr aFeature;
+  foreach(ObjectPtr aObj, theObjects) {
+    aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aObj);
+    if (aResult.get()) {
+      aFeature = ModelAPI_Feature::feature(aResult);
+      if (aFeature.get()) {
+        aSelList.append(aFeature);
+      }
+    }
+  }
+  if (aSelList.count() > theObjects.count()) {
+    // if something was found
+    bool aBlocked = objectBrowser()->blockSignals(true);
+    objectBrowser()->setObjectsSelected(aSelList);
+    objectBrowser()->blockSignals(aBlocked);
+  }
 }