From c536b7a8fe531f42f615b79a9eccad3b9093c33a Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 27 Mar 2017 11:24:51 +0200 Subject: [PATCH] #1327 Added filter field used to limit available items in the selection list --- .../RimEclipseResultDefinition.cpp | 99 ++++++++++++++++++- .../RimEclipseResultDefinition.h | 4 + 2 files changed, 99 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp index f0d7e7f7e0..212c5c436b 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -105,6 +105,8 @@ RimEclipseResultDefinition::RimEclipseResultDefinition() m_selectedTracersUiField.xmlCapability()->setIOReadable(false); m_selectedTracersUiField.xmlCapability()->setIOWritable(false); m_selectedTracersUiField.uiCapability()->setUiEditorTypeName(caf::PdmUiListEditor::uiEditorTypeName()); + + CAF_PDM_InitFieldNoDefault(&m_selectedTracersUiFieldFilter, "SelectedTracersFilter", "Filter", "", "", ""); } //-------------------------------------------------------------------------------------------------- @@ -202,10 +204,56 @@ void RimEclipseResultDefinition::fieldChangedByUi(const caf::PdmFieldHandle* cha if ( &m_selectedTracersUiField == changedField ) { m_flowSolution = m_flowSolutionUiField(); - m_selectedTracers = m_selectedTracersUiField(); + + if (m_selectedTracersUiFieldFilter().isEmpty()) + { + m_selectedTracers = m_selectedTracersUiField(); + } + else + { + auto filteredTracerNames = tracerNamesMatchingFilter(); + + // Keep selected strings not part of currently visible selection items + std::vector newSelection; + for (auto selectedTracer : m_selectedTracers()) + { + if (std::find(begin(filteredTracerNames), end(filteredTracerNames), selectedTracer) == end(filteredTracerNames)) + { + newSelection.push_back(selectedTracer); + } + } + + for (auto selectedTracerUi : m_selectedTracersUiField()) + { + newSelection.push_back(selectedTracerUi); + } + + m_selectedTracers = newSelection; + } + loadDataAndUpdate(); } + if (&m_selectedTracersUiFieldFilter == changedField) + { + auto visibleTracerNames = tracerNamesMatchingFilter(); + + std::vector subSelection; + + // Remove hidden items from selection + for (auto selectedTracer : m_selectedTracers()) + { + if (std::find(begin(visibleTracerNames), end(visibleTracerNames), selectedTracer) != end(visibleTracerNames)) + { + subSelection.push_back(selectedTracer); + } + } + + m_selectedTracersUiField = subSelection; + + updateConnectedEditors(); + } + updateAnyFieldHasChanged(); } @@ -347,6 +395,19 @@ void RimEclipseResultDefinition::loadDataAndUpdate() } } +bool isStringMatch(const QString& filterString, const QString& value) +{ + if (filterString.isEmpty()) return true; + if (filterString.trimmed() == "*") + { + if (!value.isEmpty()) return true; + else return false; + } + + QRegExp searcher(filterString, Qt::CaseInsensitive, QRegExp::WildcardUnix); + return searcher.exactMatch(value); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -356,7 +417,6 @@ QList RimEclipseResultDefinition::calculateValueOptions( if ( fieldNeedingOptions == &m_resultTypeUiField ) { - bool hasFlowDiagFluxes = false; RimEclipseResultCase* eclResCase = dynamic_cast(m_eclipseCase.p()); if ( eclResCase && eclResCase->eclipseCaseData() ) @@ -389,7 +449,7 @@ QList RimEclipseResultDefinition::calculateValueOptions( { if ( fieldNeedingOptions == &m_resultVariableUiField ) { - options = calcOptionsForVariableUiFieldStandard(); + options = calcOptionsForVariableUiFieldStandard(); } } else @@ -419,7 +479,7 @@ QList RimEclipseResultDefinition::calculateValueOptions( RimFlowDiagSolution* flowSol = m_flowSolutionUiField(); if (flowSol) { - std::vector tracerNames = flowSol->tracerNames(); + std::vector tracerNames = tracerNamesMatchingFilter(); std::map prefixedTracerNamesMap; for ( const QString& tracerName : tracerNames ) { @@ -935,6 +995,7 @@ void RimEclipseResultDefinition::defineUiOrdering(QString uiConfigName, caf::Pdm if (m_flowTracerSelectionMode == FLOW_TR_BY_SELECTION) { + uiOrdering.add(&m_selectedTracersUiFieldFilter); uiOrdering.add(&m_selectedTracersUiField); } @@ -973,3 +1034,33 @@ void RimEclipseResultDefinition::removePerCellFaceOptionItems(QList RimEclipseResultDefinition::tracerNamesMatchingFilter() const +{ + std::vector matchingNames; + + RimFlowDiagSolution* flowSol = m_flowSolutionUiField(); + if (flowSol) + { + std::vector tracerNames = flowSol->tracerNames(); + if (m_selectedTracersUiFieldFilter().isEmpty()) + { + matchingNames = tracerNames; + } + else + { + for (const QString& tracerName : tracerNames) + { + if (isStringMatch(m_selectedTracersUiFieldFilter, tracerName)) + { + matchingNames.push_back(tracerName); + } + } + } + } + + return matchingNames; +} + diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.h b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.h index 0f9df36fac..1a6aa67832 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.h @@ -122,6 +122,8 @@ protected: caf::PdmField< caf::AppEnum< FlowTracerSelectionType > > m_flowTracerSelectionMode; caf::PdmPtrField m_flowSolutionUiField; + + caf::PdmField m_selectedTracersUiFieldFilter; caf::PdmField > m_selectedTracersUiField; @@ -136,5 +138,7 @@ private: QList calcOptionsForVariableUiFieldStandard(); QStringList getResultNamesForCurrentUiResultType(); static void removePerCellFaceOptionItems(QList& optionItems); + + std::vector tracerNamesMatchingFilter() const; };