diff --git a/GUI/coregui/Models/ModelMapper.cpp b/GUI/coregui/Models/ModelMapper.cpp index 75f1ed9a7541db6bb35597c803704a3dd5dbf39e..eadf4609925c8940c899445958ea918ea414e773 100644 --- a/GUI/coregui/Models/ModelMapper.cpp +++ b/GUI/coregui/Models/ModelMapper.cpp @@ -72,6 +72,11 @@ void ModelMapper::setOnItemDestroy(std::function<void (SessionItem *)> f, const m_onItemDestroy.push_back(call_item_t(f, caller)); } +void ModelMapper::setOnAboutToRemoveChild(std::function<void (SessionItem*)> f, const void* caller) +{ + m_onAboutToRemoveChild.push_back(call_item_t(f, caller)); +} + //! Cancells all subscribtion of given caller void ModelMapper::unsubscribe(const void *caller) { @@ -83,6 +88,7 @@ void ModelMapper::unsubscribe(const void *caller) clean_container(m_onSiblingsChange, caller); clean_container(m_onAnyChildChange, caller); clean_container(m_onItemDestroy, caller); + clean_container(m_onAboutToRemoveChild, caller); } void ModelMapper::setModel(SessionModel *model) @@ -189,7 +195,16 @@ void ModelMapper::callOnAnyChildChange(SessionItem *item) f.first(item); } } -// if(m_active) emit anyChildChange(item); + // if(m_active) emit anyChildChange(item); +} + +void ModelMapper::callOnAboutToRemoveChild(SessionItem* item) +{ + if (m_active && m_onAboutToRemoveChild.size() > 0) { + for (auto f : m_onAboutToRemoveChild) { + f.first(item); + } + } } //! Notifies subscribers if an item owning given mapper is about to be destroyed @@ -215,6 +230,7 @@ void ModelMapper::clearMapper() m_onSiblingsChange.clear(); m_onAnyChildChange.clear(); m_onItemDestroy.clear(); + m_onAboutToRemoveChild.clear(); } void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, @@ -309,6 +325,7 @@ void ModelMapper::onBeginRemoveRows(const QModelIndex &parent, int first, int /* if (nestling == 0) { callOnChildrenChange(0); + callOnAboutToRemoveChild(oldChild); // inform siblings about the change // if(SessionItem *parent = oldChild->parent()) { diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h index 6ff7158f7ff6bc40a2f87eb9244e3d5c9750ed4e..94a274d5aebdc611cce3328330ed3b4378d50105 100644 --- a/GUI/coregui/Models/ModelMapper.h +++ b/GUI/coregui/Models/ModelMapper.h @@ -51,6 +51,8 @@ public: void setOnItemDestroy(std::function<void(SessionItem*)> f, const void *caller=0); + void setOnAboutToRemoveChild(std::function<void(SessionItem*)> f, const void *caller=0); + void unsubscribe(const void *caller); void callOnItemDestroy(); @@ -89,6 +91,7 @@ private: void callOnChildrenChange(SessionItem *item); void callOnSiblingsChange(); void callOnAnyChildChange(SessionItem *item); + void callOnAboutToRemoveChild(SessionItem *item); void clearMapper(); @@ -109,6 +112,7 @@ private: std::vector<call_t> m_onSiblingsChange; std::vector<call_item_t> m_onAnyChildChange; std::vector<call_item_t> m_onItemDestroy; + std::vector<call_item_t> m_onAboutToRemoveChild; QModelIndex m_aboutToDelete; }; diff --git a/Tests/UnitTests/GUI/TestMapperForItem.h b/Tests/UnitTests/GUI/TestMapperForItem.h index 4d2ad7cea8c1828ec95bd22501d66bbc8aa828ab..271e728f125772d5745f3cfc72575a460a2559aa 100644 --- a/Tests/UnitTests/GUI/TestMapperForItem.h +++ b/Tests/UnitTests/GUI/TestMapperForItem.h @@ -16,6 +16,7 @@ public: , m_onParentChangeCount(0) , m_onChildrenChangeCount(0) , m_onSiblingsChangeCount(0) + , m_onAboutToRemoveChild(0) { } void clear() @@ -25,6 +26,7 @@ public: m_onParentChangeCount = 0; m_onChildrenChangeCount = 0; m_onSiblingsChangeCount = 0; + m_onAboutToRemoveChild = 0; m_reported_items.clear(); m_reported_names.clear(); } @@ -65,6 +67,13 @@ public: onSiblingsChange(); }, caller); + + mapper->setOnAboutToRemoveChild( + [this](SessionItem* item) + { + onAboutToRemoveChild(item); + }, caller); + } void onPropertyChange(const QString &name) @@ -100,11 +109,18 @@ public: mapper->unsubscribe(this); } + void onAboutToRemoveChild(SessionItem *item) + { + m_reported_items.append(item); + m_onAboutToRemoveChild++; + } + int m_onPropertyChangeCount; int m_onChildPropertyChangeCount; int m_onParentChangeCount; int m_onChildrenChangeCount; int m_onSiblingsChangeCount; + int m_onAboutToRemoveChild; QList<SessionItem *> m_reported_items; QStringList m_reported_names; }; @@ -141,6 +157,7 @@ private slots: void test_onSiblingsChange(); void test_Subscription(); void test_TwoWidgetsSubscription(); + void test_AboutToRemoveChild(); }; inline void TestMapperForItem::test_initialCondition() @@ -338,3 +355,22 @@ inline void TestMapperForItem::test_TwoWidgetsSubscription() QCOMPARE(w2.m_onPropertyChangeCount, 2); } + +inline void TestMapperForItem::test_AboutToRemoveChild() +{ + Widget w; + SampleModel model; + SessionItem *container = model.insertNewItem(Constants::ProjectionContainerType); + + SessionItem *line = model.insertNewItem(Constants::HorizontalLineMaskType, container->index()); + + setItem(container, &w); + QCOMPARE(w.m_onAboutToRemoveChild, 0); + QCOMPARE(w.m_reported_items.size(), 0); + + line->parent()->takeRow(line->parent()->rowOfChild(line)); + QCOMPARE(w.m_onAboutToRemoveChild, 1); + QCOMPARE(w.m_reported_items.size(), 1); + QCOMPARE(w.m_reported_items.back(), line); + +}