diff --git a/src/presentation/runningtaskmodel.h b/src/presentation/runningtaskmodel.h --- a/src/presentation/runningtaskmodel.h +++ b/src/presentation/runningtaskmodel.h @@ -45,6 +45,8 @@ Domain::Task::Ptr runningTask() const Q_DECL_OVERRIDE; void setRunningTask(const Domain::Task::Ptr &runningTask) Q_DECL_OVERRIDE; + void taskDeleted(const Domain::Task::Ptr &task) Q_DECL_OVERRIDE; + public slots: void stopTask() Q_DECL_OVERRIDE; void doneTask() Q_DECL_OVERRIDE; diff --git a/src/presentation/runningtaskmodel.cpp b/src/presentation/runningtaskmodel.cpp --- a/src/presentation/runningtaskmodel.cpp +++ b/src/presentation/runningtaskmodel.cpp @@ -70,6 +70,12 @@ emit runningTaskChanged(m_runningTask); } +void RunningTaskModel::taskDeleted(const Domain::Task::Ptr &task) +{ + if (m_runningTask == task) + setRunningTask({}); +} + void RunningTaskModel::stopTask() { setRunningTask(Domain::Task::Ptr()); diff --git a/src/presentation/runningtaskmodelinterface.h b/src/presentation/runningtaskmodelinterface.h --- a/src/presentation/runningtaskmodelinterface.h +++ b/src/presentation/runningtaskmodelinterface.h @@ -45,6 +45,8 @@ virtual Domain::Task::Ptr runningTask() const = 0; virtual void setRunningTask(const Domain::Task::Ptr &runningTask) = 0; + virtual void taskDeleted(const Domain::Task::Ptr &task) = 0; + signals: void runningTaskChanged(const Domain::Task::Ptr &task); diff --git a/src/widgets/pageview.cpp b/src/widgets/pageview.cpp --- a/src/widgets/pageview.cpp +++ b/src/widgets/pageview.cpp @@ -369,6 +369,12 @@ continue; QMetaObject::invokeMethod(m_model, "removeItem", Q_ARG(QModelIndex, currentIndex)); + const auto data = currentIndex.data(Presentation::QueryTreeModelBase::ObjectRole); + if (data.isValid()) { + auto task = data.value().objectCast(); + if (task) + m_runningTaskModel->taskDeleted(task); + } } } diff --git a/tests/units/presentation/runningtaskmodeltest.cpp b/tests/units/presentation/runningtaskmodeltest.cpp --- a/tests/units/presentation/runningtaskmodeltest.cpp +++ b/tests/units/presentation/runningtaskmodeltest.cpp @@ -162,6 +162,45 @@ QCOMPARE(spy.at(0).at(0).value(), task2); } + void shouldHandleTaskDeletion() + { + // GIVEN + TestDependencies deps; + Presentation::RunningTaskModel model(deps.m_taskQueriesMockInstance, deps.m_taskRepositoryMockInstance); + Domain::Task::Ptr task = Domain::Task::Ptr::create(); + model.setRunningTask(task); + QSignalSpy spy(&model, &Presentation::RunningTaskModel::runningTaskChanged); + + // WHEN + model.taskDeleted(task); + + // THEN + QCOMPARE(model.runningTask(), Domain::Task::Ptr()); + QVERIFY(!task->isRunning()); + QVERIFY(!task->isDone()); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.at(0).at(0).value(), Domain::Task::Ptr()); + } + + void shouldIgnoreDeletionOfAnotherTask() + { + // GIVEN + TestDependencies deps; + Presentation::RunningTaskModel model(deps.m_taskQueriesMockInstance, deps.m_taskRepositoryMockInstance); + Domain::Task::Ptr task = Domain::Task::Ptr::create(); + model.setRunningTask(task); + QSignalSpy spy(&model, &Presentation::RunningTaskModel::runningTaskChanged); + Domain::Task::Ptr task2 = Domain::Task::Ptr::create(); + + // WHEN + model.taskDeleted(task2); + + // THEN + QCOMPARE(model.runningTask(), task); + QVERIFY(task->isRunning()); + QCOMPARE(spy.count(), 0); + } + private: }; diff --git a/tests/units/widgets/pageviewtest.cpp b/tests/units/widgets/pageviewtest.cpp --- a/tests/units/widgets/pageviewtest.cpp +++ b/tests/units/widgets/pageviewtest.cpp @@ -118,10 +118,12 @@ public: Domain::Task::Ptr runningTask() const Q_DECL_OVERRIDE { return m_runningTask; } void setRunningTask(const Domain::Task::Ptr &task) Q_DECL_OVERRIDE { m_runningTask = task; } + void taskDeleted(const Domain::Task::Ptr &task) { m_deletedTask = task; } void stopTask() Q_DECL_OVERRIDE {} void doneTask() Q_DECL_OVERRIDE {} private: Domain::Task::Ptr m_runningTask; + Domain::Task::Ptr m_deletedTask; }; class PageViewTest : public QObject diff --git a/tests/units/widgets/runningtaskwidgettest.cpp b/tests/units/widgets/runningtaskwidgettest.cpp --- a/tests/units/widgets/runningtaskwidgettest.cpp +++ b/tests/units/widgets/runningtaskwidgettest.cpp @@ -51,6 +51,13 @@ stopTask(); } + void taskDeleted(const Domain::Task::Ptr &task) Q_DECL_OVERRIDE + { + Q_ASSERT(task); + if (m_runningTask == task) + setRunningTask(Domain::Task::Ptr()); + } + private: Domain::Task::Ptr m_runningTask; }; @@ -167,6 +174,22 @@ // THEN QVERIFY(widget.isHidden()); } + + void shouldHideOnDeletion() + { + // GIVEN + Widgets::RunningTaskWidget widget; + auto task = Domain::Task::Ptr::create(); + RunningTaskModelStub model; + widget.setModel(&model); + model.setRunningTask(task); + + // WHEN + model.taskDeleted(task); + + // THEN + QVERIFY(widget.isHidden()); + } }; ZANSHIN_TEST_MAIN(RunningTaskWidgetTest) diff --git a/tests/units/widgets/taskapplicationcomponentstest.cpp b/tests/units/widgets/taskapplicationcomponentstest.cpp --- a/tests/units/widgets/taskapplicationcomponentstest.cpp +++ b/tests/units/widgets/taskapplicationcomponentstest.cpp @@ -36,6 +36,7 @@ public: Domain::Task::Ptr runningTask() const Q_DECL_OVERRIDE { return {}; } void setRunningTask(const Domain::Task::Ptr &) Q_DECL_OVERRIDE {} + void taskDeleted(const Domain::Task::Ptr &) Q_DECL_OVERRIDE {} void stopTask() Q_DECL_OVERRIDE {} void doneTask() Q_DECL_OVERRIDE {} };