From 27455bda4dddea4ea577403f4a79bb5fc25dbb4c Mon Sep 17 00:00:00 2001 From: vsv Date: Fri, 1 Feb 2019 15:34:15 +0300 Subject: [PATCH] Issue #2849: Provide filtering for cases when a feature and its result are selected --- src/XGUI/XGUI_Selection.cpp | 59 +++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) 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; -- 2.39.2