diff --git a/src/presentation/artifacteditormodel.h b/src/presentation/artifacteditormodel.h --- a/src/presentation/artifacteditormodel.h +++ b/src/presentation/artifacteditormodel.h @@ -50,6 +50,7 @@ Q_PROPERTY(bool done READ isDone WRITE setDone NOTIFY doneChanged) Q_PROPERTY(QDateTime startDate READ startDate WRITE setStartDate NOTIFY startDateChanged) Q_PROPERTY(QDateTime dueDate READ dueDate WRITE setDueDate NOTIFY dueDateChanged) + Q_PROPERTY(Domain::Task::Recurrence recurrence READ recurrence WRITE setRecurrence NOTIFY recurrenceChanged) Q_PROPERTY(QAbstractItemModel* attachmentModel READ attachmentModel CONSTANT) Q_PROPERTY(QString delegateText READ delegateText NOTIFY delegateTextChanged) Q_PROPERTY(bool hasTaskProperties READ hasTaskProperties NOTIFY hasTaskPropertiesChanged) @@ -78,6 +79,7 @@ bool isDone() const; QDateTime startDate() const; QDateTime dueDate() const; + Domain::Task::Recurrence recurrence() const; QAbstractItemModel *attachmentModel() const; QString delegateText() const; @@ -91,6 +93,7 @@ void setDone(bool done); void setStartDate(const QDateTime &start); void setDueDate(const QDateTime &due); + void setRecurrence(Domain::Task::Recurrence recurrence); void delegate(const QString &name, const QString &email); void openAttachment(const QModelIndex &index); @@ -104,14 +107,16 @@ void doneChanged(bool done); void startDateChanged(const QDateTime &date); void dueDateChanged(const QDateTime &due); + void recurrenceChanged(Domain::Task::Recurrence recurrence); void delegateTextChanged(const QString &delegateText); private slots: void onTextChanged(const QString &text); void onTitleChanged(const QString &title); void onDoneChanged(bool done); void onStartDateChanged(const QDateTime &start); void onDueDateChanged(const QDateTime &due); + void onRecurrenceChanged(Domain::Task::Recurrence recurrence); void onDelegateChanged(const Domain::Task::Delegate &delegate); void save(); @@ -124,6 +129,7 @@ void applyNewDone(bool done); void applyNewStartDate(const QDateTime &start); void applyNewDueDate(const QDateTime &due); + void applyNewRecurrence(Domain::Task::Recurrence recurrence); Domain::Artifact::Ptr m_artifact; SaveFunction m_saveFunction; @@ -134,6 +140,7 @@ bool m_done; QDateTime m_start; QDateTime m_due; + Domain::Task::Recurrence m_recurrence; AttachmentModel *m_attachmentModel; QString m_delegateText; diff --git a/src/presentation/artifacteditormodel.cpp b/src/presentation/artifacteditormodel.cpp --- a/src/presentation/artifacteditormodel.cpp +++ b/src/presentation/artifacteditormodel.cpp @@ -106,6 +106,7 @@ ArtifactEditorModel::ArtifactEditorModel(QObject *parent) : QObject(parent), m_done(false), + m_recurrence(Domain::Task::NoRecurrence), m_attachmentModel(new AttachmentModel(this)), m_saveTimer(new QTimer(this)), m_saveNeeded(false), @@ -137,6 +138,7 @@ m_done = false; m_start = QDateTime(); m_due = QDateTime(); + m_recurrence = Domain::Task::NoRecurrence; m_attachmentModel->setTask(Domain::Task::Ptr()); m_delegateText = QString(); @@ -157,20 +159,23 @@ m_done = task->isDone(); m_start = task->startDate(); m_due = task->dueDate(); + m_recurrence = task->recurrence(); m_attachmentModel->setTask(task); m_delegateText = task->delegate().display(); connect(task.data(), &Domain::Task::doneChanged, this, &ArtifactEditorModel::onDoneChanged); connect(task.data(), &Domain::Task::startDateChanged, this, &ArtifactEditorModel::onStartDateChanged); connect(task.data(), &Domain::Task::dueDateChanged, this, &ArtifactEditorModel::onDueDateChanged); + connect(task.data(), &Domain::Task::recurrenceChanged, this, &ArtifactEditorModel::onRecurrenceChanged); connect(task.data(), &Domain::Task::delegateChanged, this, &ArtifactEditorModel::onDelegateChanged); } emit textChanged(m_text); emit titleChanged(m_title); emit doneChanged(m_done); emit startDateChanged(m_start); emit dueDateChanged(m_due); + emit recurrenceChanged(m_recurrence); emit delegateTextChanged(m_delegateText); emit hasTaskPropertiesChanged(hasTaskProperties()); emit artifactChanged(m_artifact); @@ -226,6 +231,11 @@ return m_due; } +Domain::Task::Recurrence ArtifactEditorModel::recurrence() const +{ + return m_recurrence; +} + QAbstractItemModel *ArtifactEditorModel::attachmentModel() const { return m_attachmentModel; @@ -286,6 +296,14 @@ setSaveNeeded(true); } +void ArtifactEditorModel::setRecurrence(Domain::Task::Recurrence recurrence) +{ + if (m_recurrence == recurrence) + return; + applyNewRecurrence(recurrence); + setSaveNeeded(true); +} + void ArtifactEditorModel::delegate(const QString &name, const QString &email) { auto task = m_artifact.objectCast(); @@ -348,6 +366,12 @@ applyNewDueDate(due); } +void ArtifactEditorModel::onRecurrenceChanged(Domain::Task::Recurrence recurrence) +{ + if (!m_editingInProgress) + applyNewRecurrence(recurrence); +} + void ArtifactEditorModel::onDelegateChanged(const Domain::Task::Delegate &delegate) { m_delegateText = delegate.display(); @@ -369,6 +393,7 @@ task->setDone(m_done); task->setStartDate(m_start); task->setDueDate(m_due); + task->setRecurrence(m_recurrence); } const auto job = m_saveFunction(m_artifact); @@ -421,4 +446,10 @@ emit dueDateChanged(m_due); } +void ArtifactEditorModel::applyNewRecurrence(Domain::Task::Recurrence recurrence) +{ + m_recurrence = recurrence; + emit recurrenceChanged(m_recurrence); +} + #include "artifacteditormodel.moc" diff --git a/tests/units/presentation/artifacteditormodeltest.cpp b/tests/units/presentation/artifacteditormodeltest.cpp --- a/tests/units/presentation/artifacteditormodeltest.cpp +++ b/tests/units/presentation/artifacteditormodeltest.cpp @@ -51,6 +51,13 @@ class ArtifactEditorModelTest : public QObject { Q_OBJECT +public: + explicit ArtifactEditorModelTest(QObject *parent = Q_NULLPTR) + : QObject(parent) + { + qRegisterMetaType(); + } + private slots: void shouldHaveEmptyDefaultState() { @@ -68,6 +75,7 @@ QVERIFY(!model.isDone()); QVERIFY(model.startDate().isNull()); QVERIFY(model.dueDate().isNull()); + QCOMPARE(model.recurrence(), Domain::Task::NoRecurrence); QVERIFY(model.attachmentModel() != nullptr); QVERIFY(model.delegateText().isNull()); QVERIFY(!model.hasSaveFunction()); @@ -83,6 +91,7 @@ QSignalSpy doneSpy(&model, &Presentation::ArtifactEditorModel::doneChanged); QSignalSpy startSpy(&model, &Presentation::ArtifactEditorModel::startDateChanged); QSignalSpy dueSpy(&model, &Presentation::ArtifactEditorModel::dueDateChanged); + QSignalSpy recurrenceSpy(&model, &Presentation::ArtifactEditorModel::recurrenceChanged); QSignalSpy attachmentSpy(model.attachmentModel(), &QAbstractItemModel::modelReset); QSignalSpy delegateSpy(&model, &Presentation::ArtifactEditorModel::delegateTextChanged); @@ -108,6 +117,7 @@ task->setDone(true); task->setStartDate(QDateTime::currentDateTime()); task->setDueDate(QDateTime::currentDateTime().addDays(2)); + task->setRecurrence(Domain::Task::RecursDaily); task->setAttachments(attachments); task->setDelegate(Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("john@doe.com"))); @@ -119,6 +129,7 @@ model.setDone(task->isDone()); model.setStartDate(task->startDate()); model.setDueDate(task->dueDate()); + model.setRecurrence(task->recurrence()); // THEN QVERIFY(model.hasTaskProperties()); @@ -143,6 +154,10 @@ QCOMPARE(dueSpy.takeFirst().at(0).toDateTime(), task->dueDate()); QCOMPARE(model.property("dueDate").toDateTime(), task->dueDate()); + QCOMPARE(recurrenceSpy.size(), 1); + QCOMPARE(recurrenceSpy.takeFirst().at(0).value(), task->recurrence()); + QCOMPARE(model.property("recurrence").value(), task->recurrence()); + QCOMPARE(delegateSpy.size(), 1); QCOMPARE(delegateSpy.takeFirst().at(0).toString(), task->delegate().display()); QCOMPARE(model.property("delegateText").toString(), task->delegate().display()); @@ -246,6 +261,11 @@ << QByteArray("dueDate") << QVariant(QDateTime::currentDateTime().addDays(2)) << QByteArray(SIGNAL(dueDateChanged(QDateTime))); + + QTest::newRow("task recurrence") << Domain::Artifact::Ptr(Domain::Task::Ptr::create()) + << QByteArray("recurrence") + << QVariant::fromValue(Domain::Task::RecursDaily) + << QByteArray(SIGNAL(recurrenceChanged(Domain::Task::Recurrence))); } void shouldReactToArtifactPropertyChanges()