diff --git a/GUI/coregui/Models/FitParameterAbsModel.cpp b/GUI/coregui/Models/FitParameterAbsModel.cpp index 6baee34a11c7e26f3e1728040c2ae2d695ac5e94..f9276f582d39e55e7a09fb0b512de5336c93dccc 100644 --- a/GUI/coregui/Models/FitParameterAbsModel.cpp +++ b/GUI/coregui/Models/FitParameterAbsModel.cpp @@ -32,6 +32,13 @@ FitParameterAbsModel::FitParameterAbsModel(FitParameterContainerItem *fitParCont m_columnNames.insert(ITEM_MAX, FitParameterItem::P_MAX); connectModel(fitParContainer->model()); + + m_root_item->mapper()->setOnItemDestroy( + [this](SessionItem *parent) { + Q_ASSERT(parent == m_root_item); + m_root_item = 0; + }); + } Qt::ItemFlags FitParameterAbsModel::flags(const QModelIndex &index) const @@ -81,6 +88,8 @@ QModelIndex FitParameterAbsModel::index(int row, int column, const QModelIndex & QModelIndex FitParameterAbsModel::parent(const QModelIndex &child) const { + if(!m_root_item) return QModelIndex(); + if (!child.isValid()) return QModelIndex(); @@ -140,6 +149,8 @@ int FitParameterAbsModel::columnCount(const QModelIndex &parent) const QVariant FitParameterAbsModel::data(const QModelIndex &index, int role) const { + if(!m_root_item) return QVariant(); + if ( !index.isValid() || index.column() < 0 || index.column() >= MAX_COLUMNS) return QVariant(); @@ -158,6 +169,8 @@ QVariant FitParameterAbsModel::data(const QModelIndex &index, int role) const bool FitParameterAbsModel::setData(const QModelIndex &index, const QVariant &value, int role) { + if(!m_root_item) return false; + if (!index.isValid()) return false; if (SessionItem *item = itemForIndex(index)) { @@ -265,6 +278,7 @@ void FitParameterAbsModel::connectModel(QAbstractItemModel *sourceModel, bool is connect(sourceModel, SIGNAL(modelAboutToBeReset()), this, SLOT(onSourceAboutToBeReset())); + } else { diff --git a/GUI/coregui/Models/ModelMapper.cpp b/GUI/coregui/Models/ModelMapper.cpp index 55f3da04154c17c7893c85c0f31dc189072f44b6..3150fb6bf34cdf0e8f9b761abcd834ac4116f2f8 100644 --- a/GUI/coregui/Models/ModelMapper.cpp +++ b/GUI/coregui/Models/ModelMapper.cpp @@ -72,6 +72,11 @@ void ModelMapper::setOnAnyChildChange(std::function<void (SessionItem *)> f, con m_onAnyChildChange.push_back(call_item_t(f, caller)); } +void ModelMapper::setOnItemDestroy(std::function<void (SessionItem *)> f, const void *caller) +{ + m_onItemDestroy.push_back(call_item_t(f, caller)); +} + //! Cancells all subscribtion of given caller void ModelMapper::unsubscribe(const void *caller) { @@ -82,6 +87,7 @@ void ModelMapper::unsubscribe(const void *caller) clean_container(m_onChildrenChange, caller); clean_container(m_onSiblingsChange, caller); clean_container(m_onAnyChildChange, caller); + clean_container(m_onItemDestroy, caller); } void ModelMapper::setModel(SessionModel *model) @@ -128,7 +134,7 @@ void ModelMapper::callOnValueChange() f.first(); } } - if(m_active) emit valueChange(); +// if(m_active) emit valueChange(); } void ModelMapper::callOnPropertyChange(const QString &name) @@ -138,7 +144,7 @@ void ModelMapper::callOnPropertyChange(const QString &name) f.first(name); } } - if(m_active) emit propertyChange(name); +// if(m_active) emit propertyChange(name); } void ModelMapper::callOnChildPropertyChange(SessionItem *item, const QString &name) @@ -148,7 +154,7 @@ void ModelMapper::callOnChildPropertyChange(SessionItem *item, const QString &na f.first(item, name); } } - if(m_active) emit childPropertyChange(item, name); +// if(m_active) emit childPropertyChange(item, name); } void ModelMapper::callOnParentChange(SessionItem *new_parent) @@ -158,7 +164,7 @@ void ModelMapper::callOnParentChange(SessionItem *new_parent) f.first(new_parent); } } - if(m_active) emit parentChange(new_parent); +// if(m_active) emit parentChange(new_parent); } void ModelMapper::callOnChildrenChange(SessionItem *item) @@ -168,7 +174,7 @@ void ModelMapper::callOnChildrenChange(SessionItem *item) f.first(item); } } - if(m_active) emit childrenChange(item); +// if(m_active) emit childrenChange(item); } void ModelMapper::callOnSiblingsChange() @@ -178,7 +184,7 @@ void ModelMapper::callOnSiblingsChange() f.first(); } } - if(m_active) emit siblingsChange(); +// if(m_active) emit siblingsChange(); } void ModelMapper::callOnAnyChildChange(SessionItem *item) @@ -188,7 +194,18 @@ void ModelMapper::callOnAnyChildChange(SessionItem *item) f.first(item); } } - if(m_active) emit anyChildChange(item); +// if(m_active) emit anyChildChange(item); +} + +//! Notifies subscribers if an item owning given mapper is about to be destroyed +void ModelMapper::callOnItemDestroy() +{ + if (m_active && m_onItemDestroy.size() > 0) { + for (auto f : m_onItemDestroy) { + f.first(m_item); + } + } +// if(m_active) emit itemDestroy(new_parent); } void ModelMapper::clearMapper() @@ -202,6 +219,7 @@ void ModelMapper::clearMapper() m_onChildrenChange.clear(); m_onSiblingsChange.clear(); m_onAnyChildChange.clear(); + m_onItemDestroy.clear(); } void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h index d685d6ed2537f3547adda028da77e2494083f876..b7a8d4e4bc4afaed556edfb3407e72e53269ef9e 100644 --- a/GUI/coregui/Models/ModelMapper.h +++ b/GUI/coregui/Models/ModelMapper.h @@ -54,8 +54,12 @@ public: void setActive(bool state) {m_active = state;} + void setOnItemDestroy(std::function<void(SessionItem*)> f, const void *caller=0); + void unsubscribe(const void *caller); + void callOnItemDestroy(); + signals: void valueChange(); void propertyChange(const QString &name); @@ -64,6 +68,7 @@ signals: void childrenChange(SessionItem *item); void siblingsChange(); void anyChildChange(SessionItem *item); + void itemDestroy(SessionItem *item); public slots: void onDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, @@ -108,6 +113,7 @@ private: std::vector<call_item_t> m_onChildrenChange; std::vector<call_t> m_onSiblingsChange; std::vector<call_item_t> m_onAnyChildChange; + std::vector<call_item_t> m_onItemDestroy; QModelIndex m_aboutToDelete; }; diff --git a/GUI/coregui/Models/SessionItem.cpp b/GUI/coregui/Models/SessionItem.cpp index 3b6f71c934093a6422dc7bae6642b5c128334df5..cbb32dd60e761332b7075d3ff46fcbdde47a238b 100644 --- a/GUI/coregui/Models/SessionItem.cpp +++ b/GUI/coregui/Models/SessionItem.cpp @@ -57,6 +57,9 @@ SessionItem::SessionItem(const QString &modelType) SessionItem::~SessionItem() { + if(m_mapper) + m_mapper->callOnItemDestroy(); + QVector<SessionItem*>::const_iterator it; for (it = m_children.constBegin(); it != m_children.constEnd(); ++it) { SessionItem *child = *it;