diff --git a/src/widgets/editorview.h b/src/widgets/editorview.h --- a/src/widgets/editorview.h +++ b/src/widgets/editorview.h @@ -29,6 +29,8 @@ #include +#include "domain/task.h" + class QAbstractButton; class QLabel; class QPlainTextEdit; @@ -62,6 +64,7 @@ void titleChanged(const QString &title); void startDateChanged(const QDateTime &start); void dueDateChanged(const QDateTime &due); + void recurrenceChanged(const Domain::Task::Recurrence recurrence); void doneChanged(bool done); protected: @@ -73,13 +76,15 @@ void onTextOrTitleChanged(); void onStartDateChanged(); void onDueDateChanged(); + void onRecurrenceChanged(); void onDoneChanged(); void onDelegateTextChanged(); void onTextEditChanged(); void onStartEditEntered(const QDate &start); void onDueEditEntered(const QDate &due); void onDoneButtonChanged(bool checked); + void onRecurrenceComboBoxChanged(int recurrence); void onStartTodayClicked(); void onDelegateEntered(); diff --git a/src/widgets/editorview.cpp b/src/widgets/editorview.cpp --- a/src/widgets/editorview.cpp +++ b/src/widgets/editorview.cpp @@ -68,17 +68,21 @@ ui->delegateLabel->setVisible(false); ui->taskGroup->setVisible(false); + ui->recurrenceComboBox->setEnabled(false); ui->textEdit->installEventFilter(this); ui->startDateEdit->installEventFilter(this); ui->dueDateEdit->installEventFilter(this); ui->doneButton->installEventFilter(this); m_delegateEdit->installEventFilter(this); + auto currentIndexSignal = static_cast(&QComboBox::currentIndexChanged); + connect(ui->textEdit, &QPlainTextEdit::textChanged, this, &EditorView::onTextEditChanged); connect(ui->startDateEdit, &KPIM::KDateEdit::dateEntered, this, &EditorView::onStartEditEntered); connect(ui->dueDateEdit, &KPIM::KDateEdit::dateEntered, this, &EditorView::onDueEditEntered); connect(ui->doneButton, &QAbstractButton::toggled, this, &EditorView::onDoneButtonChanged); + connect(ui->recurrenceComboBox, currentIndexSignal, this, &EditorView::onRecurrenceComboBoxChanged); connect(ui->startTodayButton, &QAbstractButton::clicked, this, &EditorView::onStartTodayClicked); connect(m_delegateEdit, &KLineEdit::returnPressed, this, &EditorView::onDelegateEntered); @@ -121,6 +125,7 @@ onStartDateChanged(); onDueDateChanged(); onDoneChanged(); + onRecurrenceChanged(); onDelegateTextChanged(); connect(m_model, SIGNAL(artifactChanged(Domain::Artifact::Ptr)), @@ -131,14 +136,19 @@ connect(m_model, SIGNAL(textChanged(QString)), this, SLOT(onTextOrTitleChanged())); connect(m_model, SIGNAL(startDateChanged(QDateTime)), this, SLOT(onStartDateChanged())); connect(m_model, SIGNAL(dueDateChanged(QDateTime)), this, SLOT(onDueDateChanged())); + connect(m_model, SIGNAL(recurrenceChanged(Domain::Task::Recurrence)), this, SLOT(onRecurrenceChanged())); connect(m_model, SIGNAL(doneChanged(bool)), this, SLOT(onDoneChanged())); connect(m_model, SIGNAL(delegateTextChanged(QString)), this, SLOT(onDelegateTextChanged())); connect(this, SIGNAL(titleChanged(QString)), m_model, SLOT(setTitle(QString))); connect(this, SIGNAL(textChanged(QString)), m_model, SLOT(setText(QString))); connect(this, SIGNAL(startDateChanged(QDateTime)), m_model, SLOT(setStartDate(QDateTime))); connect(this, SIGNAL(dueDateChanged(QDateTime)), m_model, SLOT(setDueDate(QDateTime))); + connect(this, SIGNAL(recurrenceChanged(Domain::Task::Recurrence)), m_model, SLOT(setRecurrence(Domain::Task::Recurrence))); connect(this, SIGNAL(doneChanged(bool)), m_model, SLOT(setDone(bool))); + + connect(m_model, SIGNAL(startDateChanged(QDateTime)), this, SLOT(onRecurrenceChanged())); + connect(this, SIGNAL(startDateChanged(QDateTime)), this, SLOT(onRecurrenceChanged())); } bool EditorView::eventFilter(QObject *watched, QEvent *event) @@ -193,6 +203,12 @@ ui->dueDateEdit->setDate(m_model->property("dueDate").toDateTime().date()); } +void EditorView::onRecurrenceChanged() +{ + ui->recurrenceComboBox->setEnabled(ui->startDateEdit->date().isValid()); + ui->recurrenceComboBox->setCurrentIndex(m_model->property("recurrence").toInt()); +} + void EditorView::onDoneChanged() { ui->doneButton->setChecked(m_model->property("done").toBool()); @@ -238,6 +254,11 @@ emit doneChanged(checked); } +void EditorView::onRecurrenceComboBoxChanged(int recurrence) +{ + emit recurrenceChanged(Domain::Task::Recurrence(recurrence)); +} + void EditorView::onStartTodayClicked() { QDate today(QDate::currentDate()); diff --git a/src/widgets/editorview.ui b/src/widgets/editorview.ui --- a/src/widgets/editorview.ui +++ b/src/widgets/editorview.ui @@ -30,18 +30,6 @@ - - 0 - - - 0 - - - 0 - - - 0 - @@ -83,7 +71,35 @@ - + + + + + + + + + No Recurrence + + + + + Daily + + + + + Weekly + + + + + MonthyDay + + + + + diff --git a/tests/units/widgets/editorviewtest.cpp b/tests/units/widgets/editorviewtest.cpp --- a/tests/units/widgets/editorviewtest.cpp +++ b/tests/units/widgets/editorviewtest.cpp @@ -64,6 +64,8 @@ emit startDateChanged(value.toDateTime()); else if (name == "dueDate") emit dueDateChanged(value.toDateTime()); + else if (name == "recurrence") + emit recurrenceChanged(value.value()); else if (name == "delegateText") emit delegateTextChanged(value.toString()); else if (name == "hasTaskProperties") @@ -79,6 +81,7 @@ void setDone(bool done) { setPropertyAndSignal("done", done); } void setStartDate(const QDateTime &start) { setPropertyAndSignal("startDate", start); } void setDueDate(const QDateTime &due) { setPropertyAndSignal("dueDate", due); } + void setRecurrence(const Domain::Task::Recurrence &recurrence) { setPropertyAndSignal("recurrence", QVariant::fromValue(recurrence)); } void setDelegateText(const QString &text) { setPropertyAndSignal("delegateText", text); } void makeTaskAvailable() { setArtifact(Domain::Artifact::Ptr(new Domain::Task)); } @@ -96,6 +99,7 @@ void doneChanged(bool done); void startDateChanged(const QDateTime &date); void dueDateChanged(const QDateTime &due); + void recurrenceChanged(const Domain::Task::Recurrence recurrence); void delegateTextChanged(const QString &delegateText); public: @@ -132,6 +136,11 @@ QVERIFY(dueDateEdit); QVERIFY(!dueDateEdit->isVisibleTo(&editor)); + auto recurrenceComboBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + QVERIFY(recurrenceComboBox); + QVERIFY(!recurrenceComboBox->isVisibleTo(&editor)); + QCOMPARE(recurrenceComboBox->isEnabled(), false); + auto doneButton = editor.findChild(QStringLiteral("doneButton")); QVERIFY(doneButton); QVERIFY(!doneButton->isVisibleTo(&editor)); @@ -164,6 +173,9 @@ auto dueDateEdit = editor.findChild(QStringLiteral("dueDateEdit")); QVERIFY(dueDateEdit); + auto recurrenceComboBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + QVERIFY(recurrenceComboBox); + auto doneButton = editor.findChild(QStringLiteral("doneButton")); QVERIFY(doneButton); @@ -181,6 +193,7 @@ QVERIFY(textEdit->toPlainText().isEmpty()); QVERIFY(!startDateEdit->isVisibleTo(&editor)); QVERIFY(!dueDateEdit->isVisibleTo(&editor)); + QVERIFY(!recurrenceComboBox->isVisibleTo(&editor)); QVERIFY(!doneButton->isVisibleTo(&editor)); QVERIFY(!delegateLabel->isVisibleTo(&editor)); QVERIFY(!delegateEdit->isVisibleTo(&editor)); @@ -199,6 +212,9 @@ auto dueDateEdit = editor.findChild(QStringLiteral("dueDateEdit")); QVERIFY(!dueDateEdit->isVisibleTo(&editor)); + auto recurrenceComboBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + QVERIFY(!recurrenceComboBox->isVisibleTo(&editor)); + auto doneButton = editor.findChild(QStringLiteral("doneButton")); QVERIFY(!doneButton->isVisibleTo(&editor)); @@ -215,6 +231,7 @@ QVERIFY(startDateEdit->isVisibleTo(&editor)); QVERIFY(dueDateEdit->isVisibleTo(&editor)); QVERIFY(doneButton->isVisibleTo(&editor)); + QVERIFY(recurrenceComboBox->isVisibleTo(&editor)); QVERIFY(!delegateLabel->isVisibleTo(&editor)); QVERIFY(delegateEdit->isVisibleTo(&editor)); } @@ -292,6 +309,9 @@ auto dueDateEdit = editor.findChild(QStringLiteral("dueDateEdit")); QVERIFY(!dueDateEdit->isVisibleTo(&editor)); + auto recurrenceComboBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + QVERIFY(!recurrenceComboBox->isVisibleTo(&editor)); + auto doneButton = editor.findChild(QStringLiteral("doneButton")); QVERIFY(!doneButton->isVisibleTo(&editor)); @@ -301,6 +321,7 @@ // THEN QVERIFY(startDateEdit->isVisibleTo(&editor)); QVERIFY(dueDateEdit->isVisibleTo(&editor)); + QVERIFY(recurrenceComboBox->isVisibleTo(&editor)); QVERIFY(doneButton->isVisibleTo(&editor)); } @@ -315,11 +336,13 @@ model.setProperty("text", "\nMy text"); model.setProperty("startDate", QDateTime::currentDateTime()); model.setProperty("dueDate", QDateTime::currentDateTime().addDays(2)); + model.setProperty("recurrence", Domain::Task::NoRecurrence); model.setProperty("done", true); auto textEdit = editor.findChild(QStringLiteral("textEdit")); auto startDateEdit = editor.findChild(QStringLiteral("startDateEdit")); auto dueDateEdit = editor.findChild(QStringLiteral("dueDateEdit")); + auto recurrenceCombobox = editor.findChild(QStringLiteral("recurrenceComboBox")); auto doneButton = editor.findChild(QStringLiteral("doneButton")); // WHEN @@ -331,6 +354,7 @@ + model.property("text").toString())); QCOMPARE(startDateEdit->date(), model.property("startDate").toDateTime().date()); QCOMPARE(dueDateEdit->date(), model.property("dueDate").toDateTime().date()); + QCOMPARE(recurrenceCombobox->currentIndex(), model.property("recurrence").toInt()); // use userItemData QCOMPARE(doneButton->isChecked(), model.property("done").toBool()); } @@ -344,6 +368,7 @@ model.setProperty("text", "\nMy text"); model.setProperty("startDate", QDateTime::currentDateTime()); model.setProperty("dueDate", QDateTime::currentDateTime().addDays(2)); + model.setProperty("recurrence", Domain::Task::NoRecurrence); model.setProperty("done", true); editor.setModel(&model); @@ -392,6 +417,7 @@ model.setProperty("text", "\nMy text"); model.setProperty("startDate", QDateTime::currentDateTime()); model.setProperty("dueDate", QDateTime::currentDateTime().addDays(2)); + model.setProperty("recurrence", Domain::Task::NoRecurrence); model.setProperty("done", true); editor.setModel(&model); @@ -416,6 +442,7 @@ model.setProperty("text", "\nMy text"); model.setProperty("startDate", QDateTime::currentDateTime()); model.setProperty("dueDate", QDateTime::currentDateTime().addDays(2)); + model.setProperty("recurrence", Domain::Task::NoRecurrence); model.setProperty("done", true); editor.setModel(&model); @@ -471,6 +498,7 @@ model.setProperty("text", "\nMy text"); model.setProperty("startDate", QDateTime::currentDateTime()); model.setProperty("dueDate", QDateTime::currentDateTime().addDays(2)); + model.setProperty("recurrence", Domain::Task::NoRecurrence); model.setProperty("done", false); editor.setModel(&model); @@ -511,6 +539,7 @@ model.setProperty("text", "\nMy text"); model.setProperty("startDate", QDateTime::currentDateTime()); model.setProperty("dueDate", QDateTime::currentDateTime().addDays(2)); + model.setProperty("recurrence", Domain::Task::NoRecurrence); model.setProperty("done", false); editor.setModel(&model); @@ -607,6 +636,70 @@ QCOMPARE(model.property("startDate").toDateTime().date(), today); } + void shouldReactToRecurrenceChanged() + { + // GIVEN + Widgets::EditorView editor; + EditorModelStub model; + model.makeTaskAvailable(); + model.setProperty("title", "My title"); + model.setProperty("startDate", QDateTime::currentDateTime()); + model.setProperty("recurrence", Domain::Task::NoRecurrence); + model.setProperty("done", false); + editor.setModel(&model); + + auto recurrenceCombBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + + // WHEN + Domain::Task::Recurrence newRecurrence = Domain::Task::Daily; + model.setPropertyAndSignal("recurrence", newRecurrence); + + // THEN + QCOMPARE(Domain::Task::Recurrence(recurrenceCombBox->currentIndex()), newRecurrence); + } + + void shouldReactToRecurrenceChanges() + { + // GIVEN + Widgets::EditorView editor; + EditorModelStub model; + model.makeTaskAvailable(); + editor.setModel(&model); + + const auto dailyRecurrence = static_cast(Domain::Task::Daily); + auto recurrenceCombBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + QVERIFY(recurrenceCombBox); + + // WHEN + recurrenceCombBox->setCurrentIndex(dailyRecurrence); + + // THEN + QCOMPARE(model.property("recurrence").value(), Domain::Task::Daily); + } + + void shouldSyncRecurrenceAndStartDateInputField() + { + // GIVEN + Widgets::EditorView editor; + EditorModelStub model; + model.makeTaskAvailable(); + model.setProperty("startDate", QDateTime::currentDateTime()); + editor.setModel(&model); + + auto recurrenceCombBox = editor.findChild(QStringLiteral("recurrenceComboBox")); + QVERIFY(recurrenceCombBox); + auto startDateEdit = editor.findChild(QStringLiteral("startDateEdit")); + QVERIFY(startDateEdit); + + QVERIFY(recurrenceCombBox->isEnabled()); + + // WHEN + model.setPropertyAndSignal("startDate", QDateTime()); + + // THEN + QVERIFY(!recurrenceCombBox->isEnabled()); + } + void shouldReactToDelegateTextChanges() { // GIVEN