From: vsv Date: Fri, 1 Feb 2019 12:34:15 +0000 (+0300) Subject: Issue #2849: Provide filtering for cases when a feature and its result are selected X-Git-Tag: V9_3_0a1~20 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=27455bda4dddea4ea577403f4a79bb5fc25dbb4c;p=modules%2Fshaper.git Issue #2849: Provide filtering for cases when a feature and its result are selected --- diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 6962a47ac..8dda155d5 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -63,6 +63,7 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) QList XGUI_Selection::getSelected(const SelectionPlace& thePlace) const { QList aPresentations; + QList aToRemove; switch (thePlace) { case Browser: @@ -72,8 +73,62 @@ QList XGUI_Selection::getSelected(const SelectionPlace& getSelectedInViewer(aPresentations); break; case AllControls: - getSelectedInViewer(aPresentations); - getSelectedInBrowser(aPresentations); + // Get selection from object browser + getSelectedInBrowser(aPresentations); + + // Filter out all objects except feature if there is no selected results in object browser + // Filter out all features if in object browser there are selected features and their results + bool aHasFeature = false; + bool aHasResult = false; + foreach(ModuleBase_ViewerPrsPtr aVal, aPresentations) { + if (aVal->object().get()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aVal->object()); + if (aFeature.get()) { + aHasFeature = true; + std::list aResList = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); aIt++) { + foreach(ModuleBase_ViewerPrsPtr aSel, aPresentations) { + if (aSel->object() == (*aIt)) { + aHasResult = true; + break; + } + } + if (aHasResult) + break; + } + } + } + if (aHasFeature && aHasResult) + break; + } + //Get selection from a viewer + getSelectedInViewer(aPresentations); + + // Filter out extra objects + if (aHasFeature && aHasResult) { + foreach(ModuleBase_ViewerPrsPtr aVal, aPresentations) { + if (aVal->object().get()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aVal->object()); + if (aFeature.get()) { + aToRemove.append(aVal); + } + } + } + } + else if (aHasFeature && (!aHasResult)) { + foreach(ModuleBase_ViewerPrsPtr aVal, aPresentations) { + if (aVal->object().get()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aVal->object()); + if (!aFeature.get()) { + aToRemove.append(aVal); + } + } + } + } + foreach(ModuleBase_ViewerPrsPtr aVal, aToRemove) { + aPresentations.removeAll(aVal); + } break; } return aPresentations;