#3056 Ensemble curve filters. Add new filter button. Fix delete filter bug, use internal garbage collector to achieve delayed object delete

This commit is contained in:
Bjørn Erik Jensen 2018-06-18 15:19:24 +02:00
parent cbb467a4a4
commit bc28b4b8f1
3 changed files with 65 additions and 6 deletions

View File

@ -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;
}
}

View File

@ -25,12 +25,20 @@
#include <cafPdmUiTableViewEditor.h>
#include <cafPdmUiTreeOrdering.h>
#include <cafPdmUiPushButtonEditor.h>
#include <algorithm>
CAF_PDM_SOURCE_INIT(RimEnsembleCurveFilterCollection, "RimEnsembleCurveFilterCollection");
//--------------------------------------------------------------------------------------------------
/// Internal variables
//--------------------------------------------------------------------------------------------------
static std::vector<RimEnsembleCurveFilter*> _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);
}
//--------------------------------------------------------------------------------------------------
@ -94,12 +115,23 @@ QList<caf::PdmOptionItemInfo> RimEnsembleCurveFilterCollection::calculateValueOp
///
//--------------------------------------------------------------------------------------------------
void RimEnsembleCurveFilterCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
{
if (changedField == &m_active)
{
RimEnsembleCurveSet* curveSet;
firstAncestorOrThisOfType(curveSet);
if (curveSet) curveSet->updateAllCurves();
if (!curveSet) return;
if (changedField == &m_active)
{
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<caf::PdmUiPushButtonEditorAttribute*>(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();
}

View File

@ -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<bool> m_active;
caf::PdmChildArrayField<RimEnsembleCurveFilter*> m_filters;
caf::PdmField<bool> m_newFilterButton;
};