diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp index 26e4cb8ffc..122e6db73e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp @@ -205,9 +205,6 @@ void RimEnsembleCurveFilter::fieldChangedByUi(const caf::PdmFieldHandle* changed curveSet->filterCollection()->removeFilter(this); curveSet->filterCollection()->updateConnectedEditors(); curveSet->updateAllCurves(); - - // Must be last statement before return - delete this; } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.cpp index 12c890a0b0..2f7fe8a94c 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.cpp @@ -25,12 +25,20 @@ #include #include +#include #include CAF_PDM_SOURCE_INIT(RimEnsembleCurveFilterCollection, "RimEnsembleCurveFilterCollection"); +//-------------------------------------------------------------------------------------------------- +/// Internal variables +//-------------------------------------------------------------------------------------------------- +static std::vector _removedFilters; + +static void garbageCollectFilters(); + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -44,6 +52,11 @@ RimEnsembleCurveFilterCollection::RimEnsembleCurveFilterCollection() m_filters.uiCapability()->setUiTreeChildrenHidden(true); //m_filters.uiCapability()->setUiEditorTypeName(caf::PdmUiTableViewEditor::uiEditorTypeName()); m_filters.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN); + + CAF_PDM_InitFieldNoDefault(&m_newFilterButton, "NewEnsembleFilter", "New Filter", "", "", ""); + m_newFilterButton = false; + m_newFilterButton.uiCapability()->setUiEditorTypeName(caf::PdmUiPushButtonEditor::uiEditorTypeName()); + m_newFilterButton.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN); } //-------------------------------------------------------------------------------------------------- @@ -51,6 +64,8 @@ RimEnsembleCurveFilterCollection::RimEnsembleCurveFilterCollection() //-------------------------------------------------------------------------------------------------- RimEnsembleCurveFilter* RimEnsembleCurveFilterCollection::addFilter(const QString& ensembleParameterName) { + garbageCollectFilters(); + auto newFilter = new RimEnsembleCurveFilter(ensembleParameterName); m_filters.push_back(newFilter); return newFilter; @@ -61,7 +76,13 @@ RimEnsembleCurveFilter* RimEnsembleCurveFilterCollection::addFilter(const QStrin //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveFilterCollection::removeFilter(RimEnsembleCurveFilter* filter) { + garbageCollectFilters(); + + size_t sizeBefore = m_filters.size(); m_filters.removeChildObject(filter); + size_t sizeAfter = m_filters.size(); + + if(sizeAfter < sizeBefore) _removedFilters.push_back(filter); } //-------------------------------------------------------------------------------------------------- @@ -95,11 +116,22 @@ QList RimEnsembleCurveFilterCollection::calculateValueOp //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveFilterCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { + RimEnsembleCurveSet* curveSet; + firstAncestorOrThisOfType(curveSet); + if (!curveSet) return; + if (changedField == &m_active) { - RimEnsembleCurveSet* curveSet; - firstAncestorOrThisOfType(curveSet); - if (curveSet) curveSet->updateAllCurves(); + curveSet->updateAllCurves(); + } + else if (changedField == &m_newFilterButton) + { + m_newFilterButton = false; + + addFilter(); + updateConnectedEditors(); + curveSet->updateAllCurves(); + } } @@ -108,6 +140,8 @@ void RimEnsembleCurveFilterCollection::fieldChangedByUi(const caf::PdmFieldHandl //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveFilterCollection::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) { + uiOrdering.add(&m_newFilterButton); + for (auto& filter : m_filters) { QString groupTitle; @@ -149,6 +183,20 @@ void RimEnsembleCurveFilterCollection::defineUiTreeOrdering(caf::PdmUiTreeOrderi uiTreeOrdering.skipRemainingChildren(true); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleCurveFilterCollection::defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) +{ + if (field == &m_newFilterButton) + { + caf::PdmUiPushButtonEditorAttribute* attr = dynamic_cast(attribute); + if (!attr) return; + + attr->m_buttonText = "Add Ensemble Curve Filter"; + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -164,3 +212,15 @@ caf::PdmFieldHandle* RimEnsembleCurveFilterCollection::objectToggleField() { return &m_active; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void garbageCollectFilters() +{ + for (auto filter : _removedFilters) + { + delete filter; + } + _removedFilters.clear(); +} diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.h index da1acecf89..cb6e6f2b6e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveFilterCollection.h @@ -48,10 +48,12 @@ private: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; virtual void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /* = "" */); + virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute); virtual caf::PdmFieldHandle* objectToggleField(); private: caf::PdmField m_active; caf::PdmChildArrayField m_filters; + caf::PdmField m_newFilterButton; };