From 41927399c33eae952f78b8361d145c00c5f744d2 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 10 Jan 2017 12:45:30 +0100 Subject: Move to folder action --- framework/domain/foldercontroller.cpp | 18 ++++++++++++++---- framework/domain/foldercontroller.h | 2 ++ framework/domain/mailcontroller.cpp | 12 +++++++++++- framework/domain/mailcontroller.h | 2 ++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/framework/domain/foldercontroller.cpp b/framework/domain/foldercontroller.cpp index d06ccb52..65c34dba 100644 --- a/framework/domain/foldercontroller.cpp +++ b/framework/domain/foldercontroller.cpp @@ -23,20 +23,22 @@ SINK_DEBUG_AREA("foldercontroller"); +using namespace Sink; +using namespace Sink::ApplicationDomain; + FolderController::FolderController() : Kube::Controller(), - action_synchronize{new Kube::ControllerAction{this, &FolderController::synchronize}} + action_synchronize{new Kube::ControllerAction{this, &FolderController::synchronize}}, + action_moveToFolder{new Kube::ControllerAction{this, &FolderController::moveToFolder}} { } void FolderController::synchronize() { - using namespace Sink; - using namespace Sink::ApplicationDomain; auto job = [&] { if (auto folder = getFolder()) { SinkLog() << "Synchronizing folder " << folder->resourceInstanceIdentifier() << folder->identifier(); - auto scope = SyncScope().resourceFilter(folder->resourceInstanceIdentifier()).filter(QVariant::fromValue(folder->identifier())); + auto scope = SyncScope().resourceFilter(folder->resourceInstanceIdentifier()).filter(QVariant::fromValue(folder->identifier())); scope.setType(); return Store::synchronize(scope); } else { @@ -47,3 +49,11 @@ void FolderController::synchronize() run(job); } +void FolderController::moveToFolder() +{ + auto mail = getMail(); + auto targetFolder = getFolder(); + mail->setFolder(*targetFolder); + SinkLog() << "Moving to folder " << mail->identifier() << targetFolder->identifier(); + run(Store::modify(*mail)); +} diff --git a/framework/domain/foldercontroller.h b/framework/domain/foldercontroller.h index 24d6929c..b56e08e8 100644 --- a/framework/domain/foldercontroller.h +++ b/framework/domain/foldercontroller.h @@ -26,7 +26,9 @@ class FolderController : public Kube::Controller { Q_OBJECT KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Folder::Ptr, Folder, folder) + KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Mail::Ptr, Mail, mail) KUBE_CONTROLLER_ACTION(synchronize) + KUBE_CONTROLLER_ACTION(moveToFolder) public: explicit FolderController(); diff --git a/framework/domain/mailcontroller.cpp b/framework/domain/mailcontroller.cpp index 3e5e6ed4..a5d7efb7 100644 --- a/framework/domain/mailcontroller.cpp +++ b/framework/domain/mailcontroller.cpp @@ -33,7 +33,8 @@ MailController::MailController() action_markAsImportant{new Kube::ControllerAction{this, &MailController::markAsImportant}}, action_moveToTrash{new Kube::ControllerAction{this, &MailController::moveToTrash}}, action_restoreFromTrash{new Kube::ControllerAction{this, &MailController::restoreFromTrash}}, - action_remove{new Kube::ControllerAction{this, &MailController::remove}} + action_remove{new Kube::ControllerAction{this, &MailController::remove}}, + action_moveToFolder{new Kube::ControllerAction{this, &MailController::moveToFolder}} { QObject::connect(this, &MailController::mailChanged, &MailController::updateActions); updateActions(); @@ -95,3 +96,12 @@ void MailController::remove() run(Store::remove(*mail)); } +void MailController::moveToFolder() +{ + auto mail = getMail(); + auto targetFolder = getTargetFolder(); + mail->setFolder(*targetFolder); + SinkLog() << "Moving to folder " << mail->identifier() << targetFolder->identifier(); + run(Store::modify(*mail)); +} + diff --git a/framework/domain/mailcontroller.h b/framework/domain/mailcontroller.h index b92fd566..b4f08aac 100644 --- a/framework/domain/mailcontroller.h +++ b/framework/domain/mailcontroller.h @@ -26,12 +26,14 @@ class MailController : public Kube::Controller { Q_OBJECT KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Mail::Ptr, Mail, mail) + KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Folder::Ptr, TargetFolder, targetFolder) KUBE_CONTROLLER_ACTION(markAsRead) KUBE_CONTROLLER_ACTION(markAsUnread) KUBE_CONTROLLER_ACTION(markAsImportant) KUBE_CONTROLLER_ACTION(moveToTrash) KUBE_CONTROLLER_ACTION(restoreFromTrash) KUBE_CONTROLLER_ACTION(remove) + KUBE_CONTROLLER_ACTION(moveToFolder) public: explicit MailController(); -- cgit v1.2.3 From 7129af7b55dd13c8caa359f7cda9642bfab533b4 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 11 Jan 2017 14:58:20 +0100 Subject: Fetch incomplete mails automatically. --- framework/domain/maillistmodel.cpp | 17 +++++++++++++++++ framework/domain/maillistmodel.h | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/framework/domain/maillistmodel.cpp b/framework/domain/maillistmodel.cpp index 0e76e0a8..207128b7 100644 --- a/framework/domain/maillistmodel.cpp +++ b/framework/domain/maillistmodel.cpp @@ -125,9 +125,23 @@ bool MailListModel::lessThan(const QModelIndex &left, const QModelIndex &right) void MailListModel::runQuery(const Sink::Query &query) { m_model = Sink::Store::loadModel(query); + QObject::connect(m_model.data(), &QAbstractItemModel::rowsInserted, this, &MailListModel::onRowsInserted); setSourceModel(m_model.data()); } +void MailListModel::onRowsInserted(const QModelIndex &parent, int begin, int end) +{ + if (mFetchMails) { + for (int row = begin; row <= end; row++) { + auto mail = sourceModel()->index(row, 0, parent).data(Sink::Store::DomainObjectRole).value(); + if (mail && !mail->getFullPayloadAvailable()) { + qWarning() << "Fetching mail: " << mail->identifier(); + Sink::Store::synchronize(Sink::SyncScope{*mail}).exec(); + } + } + } +} + void MailListModel::setParentFolder(const QVariant &parentFolder) { using namespace Sink::ApplicationDomain; @@ -150,6 +164,7 @@ void MailListModel::setParentFolder(const QVariant &parentFolder) query.request(); query.request(); query.request(); + mFetchMails = false; qWarning() << "Running folder query: " << folder->resourceInstanceIdentifier() << folder->identifier(); runQuery(query); } @@ -179,6 +194,8 @@ void MailListModel::setMail(const QVariant &variant) query.request(); query.request(); query.request(); + query.request(); + mFetchMails = true; qWarning() << "Running mail query: " << mail->resourceInstanceIdentifier() << mail->identifier(); runQuery(query); } diff --git a/framework/domain/maillistmodel.h b/framework/domain/maillistmodel.h index 71a0a6df..faed9edf 100644 --- a/framework/domain/maillistmodel.h +++ b/framework/domain/maillistmodel.h @@ -68,6 +68,10 @@ public: void setMail(const QVariant &mail); QVariant mail() const; +private slots: + void onRowsInserted(const QModelIndex &idx, int, int); + private: QSharedPointer m_model; + bool mFetchMails = false; }; -- cgit v1.2.3 From 8facecfbeb4539275fce77b4a07a6a1cfad32052 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 12 Jan 2017 12:42:37 +0100 Subject: Thread actions --- components/package/contents/ui/SingleMailView.qml | 2 +- framework/domain/mailcontroller.cpp | 76 ++++++++++++++--------- framework/domain/mailcontroller.h | 2 + 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/components/package/contents/ui/SingleMailView.qml b/components/package/contents/ui/SingleMailView.qml index d7c3193c..6baeaed2 100644 --- a/components/package/contents/ui/SingleMailView.qml +++ b/components/package/contents/ui/SingleMailView.qml @@ -363,7 +363,7 @@ Item { KubeFramework.MailController { id: mailController - mail: model.mail + threadLeader: model.mail } text: model.trash ? qsTr("Delete Mail") : qsTr("Move to trash") diff --git a/framework/domain/mailcontroller.cpp b/framework/domain/mailcontroller.cpp index a5d7efb7..962b785f 100644 --- a/framework/domain/mailcontroller.cpp +++ b/framework/domain/mailcontroller.cpp @@ -20,6 +20,7 @@ #include #include +#include SINK_DEBUG_AREA("mailcontroller"); @@ -40,9 +41,24 @@ MailController::MailController() updateActions(); } -void MailController::updateActions() +void MailController::runModification(const std::function &f) { if (auto mail = getMail()) { + f(*mail); + run(Store::modify(*mail)); + } else if (auto mail = getThreadLeader()) { + f(*mail); + run(Store::modify(Sink::StandardQueries::completeThread(*mail), *mail)); + } +} + +void MailController::updateActions() +{ + auto mail = getMail(); + if (!mail) { + mail= getThreadLeader(); + } + if (mail) { action_moveToTrash->setEnabled(!mail->getTrash()); action_restoreFromTrash->setEnabled(mail->getTrash()); } @@ -50,58 +66,58 @@ void MailController::updateActions() void MailController::markAsRead() { - auto mail = getMail(); - mail->setUnread(false); - SinkLog() << "Mark as read " << mail->identifier(); - run(Store::modify(*mail)); + runModification([] (ApplicationDomain::Mail &mail) { + mail.setUnread(false); + SinkLog() << "Mark as read " << mail.identifier(); + }); } void MailController::markAsUnread() { - auto mail = getMail(); - mail->setUnread(true); - SinkLog() << "Mark as unread " << mail->identifier(); - run(Store::modify(*mail)); + runModification([] (ApplicationDomain::Mail &mail) { + mail.setUnread(true); + SinkLog() << "Mark as unread " << mail.identifier(); + }); } void MailController::markAsImportant() { - auto mail = getMail(); - mail->setImportant(true); - SinkLog() << "Mark as important " << mail->identifier(); - run(Store::modify(*mail)); + runModification([] (ApplicationDomain::Mail &mail) { + mail.setImportant(true); + SinkLog() << "Mark as important " << mail.identifier(); + }); } void MailController::moveToTrash() { - auto mail = getMail(); - mail->setTrash(true); - SinkLog() << "Move to trash " << mail->identifier(); - run(Store::modify(*mail)); + runModification([] (ApplicationDomain::Mail &mail) { + mail.setTrash(true); + SinkLog() << "Move to trash " << mail.identifier(); + }); } void MailController::restoreFromTrash() { - auto mail = getMail(); - mail->setTrash(false); - SinkLog() << "Restore from trash " << mail->identifier(); - run(Store::modify(*mail)); + runModification([] (ApplicationDomain::Mail &mail) { + mail.setTrash(false); + SinkLog() << "Restore from trash " << mail.identifier(); + }); } void MailController::remove() { - auto mail = getMail(); - mail->setTrash(true); - SinkLog() << "Remove " << mail->identifier(); - run(Store::remove(*mail)); + runModification([] (ApplicationDomain::Mail &mail) { + mail.setTrash(true); + SinkLog() << "Remove " << mail.identifier(); + }); } void MailController::moveToFolder() { - auto mail = getMail(); - auto targetFolder = getTargetFolder(); - mail->setFolder(*targetFolder); - SinkLog() << "Moving to folder " << mail->identifier() << targetFolder->identifier(); - run(Store::modify(*mail)); + runModification([&] (ApplicationDomain::Mail &mail) { + auto targetFolder = getTargetFolder(); + mail.setFolder(*targetFolder); + SinkLog() << "Moving to folder " << mail.identifier() << targetFolder->identifier(); + }); } diff --git a/framework/domain/mailcontroller.h b/framework/domain/mailcontroller.h index b4f08aac..ae0f32d5 100644 --- a/framework/domain/mailcontroller.h +++ b/framework/domain/mailcontroller.h @@ -26,6 +26,7 @@ class MailController : public Kube::Controller { Q_OBJECT KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Mail::Ptr, Mail, mail) + KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Mail::Ptr, ThreadLeader, threadLeader) KUBE_CONTROLLER_PROPERTY(Sink::ApplicationDomain::Folder::Ptr, TargetFolder, targetFolder) KUBE_CONTROLLER_ACTION(markAsRead) KUBE_CONTROLLER_ACTION(markAsUnread) @@ -39,4 +40,5 @@ public: explicit MailController(); private slots: void updateActions(); + void runModification(const std::function &f); }; -- cgit v1.2.3 From 654092d41253ff993095b845a6c3e338a563547e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 12 Jan 2017 12:46:50 +0100 Subject: Fix mail sending --- framework/domain/composercontroller.cpp | 19 ++++++++++++------- framework/domain/controller.cpp | 4 ++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/framework/domain/composercontroller.cpp b/framework/domain/composercontroller.cpp index a4a8857f..9fb2c6f8 100644 --- a/framework/domain/composercontroller.cpp +++ b/framework/domain/composercontroller.cpp @@ -221,17 +221,22 @@ void ComposerController::send() .then>([=](const QList &resources) -> KAsync::Job { if (!resources.isEmpty()) { auto resourceId = resources[0]->identifier(); - SinkTrace() << "Sending message via resource: " << resourceId; + SinkLog() << "Sending message via resource: " << resourceId; Mail mail(resourceId); - mail.setBlobProperty("mimeMessage", message->encodedContent()); - return Store::create(mail); + mail.setMimeMessage(message->encodedContent()); + return Store::create(mail) + .then([=] { + //Trigger a sync, but don't wait for it. + Store::synchronize(Sink::SyncScope{}.resourceFilter(resourceId)).exec(); + return KAsync::null(); + }); } return KAsync::error(0, "Failed to find a MailTransport resource."); + }) + .syncThen([&] (const KAsync::Error &error) { + emit done(); }); run(job); - job = job.syncThen([&] { - emit done(); - }); } void ComposerController::updateSaveAsDraftAction() @@ -268,7 +273,7 @@ void ComposerController::saveAsDraft() return Store::create(mail); }); } else { - SinkWarning() << "Modifying an existing mail" << existingMail.identifier(); + SinkLog() << "Modifying an existing mail" << existingMail.identifier(); existingMail.setDraft(true); existingMail.setMimeMessage(message->encodedContent()); return Store::modify(existingMail); diff --git a/framework/domain/controller.cpp b/framework/domain/controller.cpp index fb971136..52f4cd1f 100644 --- a/framework/domain/controller.cpp +++ b/framework/domain/controller.cpp @@ -20,6 +20,7 @@ #include #include +#include using namespace Kube; @@ -49,6 +50,9 @@ void Controller::clear() void Controller::run(const KAsync::Job &job) { auto jobToExec = job; + jobToExec.onError([] (const KAsync::Error &error) { + SinkWarningCtx(Sink::Log::Context{"controller"}) << "Error while executing job: " << error.errorMessage; + }); //TODO handle error //TODO attach a log context to the execution that we can gather from the job? jobToExec.exec(); -- cgit v1.2.3 From 859f30d21532644c3b90e79f6686aa7375046087 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 12 Jan 2017 12:54:14 +0100 Subject: syncThen is no longer necessary. --- accounts/imap/tests/settingstest.cpp | 4 ++-- accounts/maildir/maildircontroller.cpp | 2 +- accounts/maildir/tests/settingstest.cpp | 4 ++-- framework/accounts/accountfactory.cpp | 2 +- framework/accounts/gmailcontroller.cpp | 2 +- framework/accounts/kolabnowcontroller.cpp | 2 +- framework/accounts/maildircontroller.cpp | 4 ++-- framework/actions/actionhandler.cpp | 2 +- framework/actions/actionhandler.h | 2 +- framework/domain/composercontroller.cpp | 6 +++--- framework/domain/identitiesmodel.cpp | 2 +- framework/domain/settings/accountsettings.cpp | 10 +++++----- 12 files changed, 21 insertions(+), 21 deletions(-) diff --git a/accounts/imap/tests/settingstest.cpp b/accounts/imap/tests/settingstest.cpp index 2fbc9b7b..69d93079 100644 --- a/accounts/imap/tests/settingstest.cpp +++ b/accounts/imap/tests/settingstest.cpp @@ -43,7 +43,7 @@ private slots: settings.setProperty("emailAddress", emailAddress); settings.save(); - Sink::Store::fetchAll(Sink::Query()).syncThen>([](const QList &resources) { + Sink::Store::fetchAll(Sink::Query()).then([](const QList &resources) { QCOMPARE(resources.size(), 2); }) .exec().waitForFinished(); @@ -76,7 +76,7 @@ private slots: settings.remove(); } - Sink::Store::fetchAll(Sink::Query()).syncThen>([](const QList &resources) { + Sink::Store::fetchAll(Sink::Query()).then([](const QList &resources) { QCOMPARE(resources.size(), 0); }) .exec().waitForFinished(); diff --git a/accounts/maildir/maildircontroller.cpp b/accounts/maildir/maildircontroller.cpp index dc34d59a..fa211284 100644 --- a/accounts/maildir/maildircontroller.cpp +++ b/accounts/maildir/maildircontroller.cpp @@ -85,7 +85,7 @@ void MaildirController::loadAccount(const QByteArray &id) { Q_ASSERT(!mAccountIdentifier.isEmpty()); Store::fetchOne(Query().filter(mAccountIdentifier)) - .syncThen([this](const SinkAccount &account) { + .then([this](const SinkAccount &account) { mIcon = account.getIcon(); mName = account.getName(); emit nameChanged(); diff --git a/accounts/maildir/tests/settingstest.cpp b/accounts/maildir/tests/settingstest.cpp index 47cb3b35..bf041e3c 100644 --- a/accounts/maildir/tests/settingstest.cpp +++ b/accounts/maildir/tests/settingstest.cpp @@ -39,7 +39,7 @@ private slots: settings.setProperty("emailAddress", emailAddress); settings.save(); - Sink::Store::fetchAll(Sink::Query()).syncThen>([](const QList &resources) { + Sink::Store::fetchAll(Sink::Query()).then([](const QList &resources) { QCOMPARE(resources.size(), 2); }) .exec().waitForFinished(); @@ -70,7 +70,7 @@ private slots: settings.remove(); } - Sink::Store::fetchAll(Sink::Query()).syncThen>([](const QList &resources) { + Sink::Store::fetchAll(Sink::Query()).then([](const QList &resources) { QCOMPARE(resources.size(), 0); }) .exec().waitForFinished(); diff --git a/framework/accounts/accountfactory.cpp b/framework/accounts/accountfactory.cpp index 182a0a1d..c590e4b6 100644 --- a/framework/accounts/accountfactory.cpp +++ b/framework/accounts/accountfactory.cpp @@ -44,7 +44,7 @@ void AccountFactory::setAccountId(const QString &accountId) { mAccountId = accountId; Sink::Store::fetchOne(Sink::Query().filter(accountId.toUtf8())) - .syncThen([this](const Sink::ApplicationDomain::SinkAccount &account) { + .then([this](const Sink::ApplicationDomain::SinkAccount &account) { mAccountType = account.getProperty("type").toByteArray(); loadPackage(); }).exec(); diff --git a/framework/accounts/gmailcontroller.cpp b/framework/accounts/gmailcontroller.cpp index bc644ae9..89877117 100644 --- a/framework/accounts/gmailcontroller.cpp +++ b/framework/accounts/gmailcontroller.cpp @@ -80,7 +80,7 @@ void GmailController::load(const QByteArray &id) { m_accountId = id; Store::fetchOne(Query().filter(m_accountId)) - .syncThen([this](const SinkAccount &account) { + .then([this](const SinkAccount &account) { setName(account.getName()); }).exec(); diff --git a/framework/accounts/kolabnowcontroller.cpp b/framework/accounts/kolabnowcontroller.cpp index 94ca2e01..5968dc26 100644 --- a/framework/accounts/kolabnowcontroller.cpp +++ b/framework/accounts/kolabnowcontroller.cpp @@ -80,7 +80,7 @@ void KolabNowController::load(const QByteArray &id) { m_accountId = id; Store::fetchOne(Query().filter(m_accountId)) - .syncThen([this](const SinkAccount &account) { + .then([this](const SinkAccount &account) { setName(account.getName()); }).exec(); diff --git a/framework/accounts/maildircontroller.cpp b/framework/accounts/maildircontroller.cpp index 481d43d8..c2e15eb8 100644 --- a/framework/accounts/maildircontroller.cpp +++ b/framework/accounts/maildircontroller.cpp @@ -65,13 +65,13 @@ void MaildirController::load(const QByteArray &id) { clear(); Store::fetchOne(Query().filter(m_accountId)) - .syncThen([this](const SinkAccount &account) { + .then([this](const SinkAccount &account) { setIcon(account.getIcon()); setName(account.getName()); }).exec(); Store::fetchOne(Query().filter(m_accountId).containsFilter(ResourceCapabilities::Mail::storage)) - .syncThen([this](const SinkResource &resource) { + .then([this](const SinkResource &resource) { m_resourceId = resource.identifier(); setPath(resource.getProperty("path").toString()); }).exec(); diff --git a/framework/actions/actionhandler.cpp b/framework/actions/actionhandler.cpp index eb7b3224..99fdf66a 100644 --- a/framework/actions/actionhandler.cpp +++ b/framework/actions/actionhandler.cpp @@ -138,7 +138,7 @@ ActionResult ActionHandlerHelper::execute(Context *context) handlerFunction(context); result.setDone(); } else { - jobHandlerFunction(context).syncThen([=](const KAsync::Error &error) { + jobHandlerFunction(context).then([=](const KAsync::Error &error) { auto modifyableResult = result; if (error) { qWarning() << "Job failed: " << error.errorCode << error.errorMessage; diff --git a/framework/actions/actionhandler.h b/framework/actions/actionhandler.h index 5ccf0ac7..c0e1b318 100644 --- a/framework/actions/actionhandler.h +++ b/framework/actions/actionhandler.h @@ -73,7 +73,7 @@ public: ActionResult result; auto wrapper = ContextType{*c}; execute(wrapper) - .template syncThen([=](const KAsync::Error &error) { + .template then([=](const KAsync::Error &error) { auto modifyableResult = result; if (error) { qWarning() << "Job failed: " << error.errorCode << error.errorMessage; diff --git a/framework/domain/composercontroller.cpp b/framework/domain/composercontroller.cpp index 9fb2c6f8..f1c04ea9 100644 --- a/framework/domain/composercontroller.cpp +++ b/framework/domain/composercontroller.cpp @@ -123,7 +123,7 @@ void ComposerController::loadMessage(const QVariant &message, bool loadAsDraft) { Sink::Query query(*message.value()); query.request(); - Sink::Store::fetchOne(query).syncThen([this, loadAsDraft](const Sink::ApplicationDomain::Mail &mail) { + Sink::Store::fetchOne(query).then([this, loadAsDraft](const Sink::ApplicationDomain::Mail &mail) { setExistingMail(mail); //TODO this should probably happen as reaction to the property being set. @@ -233,7 +233,7 @@ void ComposerController::send() } return KAsync::error(0, "Failed to find a MailTransport resource."); }) - .syncThen([&] (const KAsync::Error &error) { + .then([&] (const KAsync::Error &error) { emit done(); }); run(job); @@ -279,7 +279,7 @@ void ComposerController::saveAsDraft() return Store::modify(existingMail); } }(); - job = job.syncThen([&] { + job = job.then([&] { emit done(); }); run(job); diff --git a/framework/domain/identitiesmodel.cpp b/framework/domain/identitiesmodel.cpp index 33cc191c..49c08005 100644 --- a/framework/domain/identitiesmodel.cpp +++ b/framework/domain/identitiesmodel.cpp @@ -88,7 +88,7 @@ void IdentitiesModel::runQuery(const Sink::Query &query) setSourceModel(mModel.data()); Sink::Store::fetchAll(Sink::Query()) - .syncThen >([this](const QList &accounts) { + .then([this](const QList &accounts) { for (const auto &account : accounts) { mAccountNames.insert(account->identifier(), account->getName()); mAccountIcons.insert(account->identifier(), account->getIcon()); diff --git a/framework/domain/settings/accountsettings.cpp b/framework/domain/settings/accountsettings.cpp index 067d1d79..d7c8c1c0 100644 --- a/framework/domain/settings/accountsettings.cpp +++ b/framework/domain/settings/accountsettings.cpp @@ -152,7 +152,7 @@ void AccountSettings::loadAccount() { Q_ASSERT(!mAccountIdentifier.isEmpty()); Store::fetchOne(Query().filter(mAccountIdentifier)) - .syncThen([this](const SinkAccount &account) { + .then([this](const SinkAccount &account) { mIcon = account.getIcon(); mName = account.getName(); emit changed(); @@ -162,7 +162,7 @@ void AccountSettings::loadAccount() void AccountSettings::loadImapResource() { Store::fetchOne(Query().filter(mAccountIdentifier).containsFilter(ResourceCapabilities::Mail::storage)) - .syncThen([this](const SinkResource &resource) { + .then([this](const SinkResource &resource) { mImapIdentifier = resource.identifier(); mImapServer = resource.getProperty("server").toString(); mImapUsername = resource.getProperty("username").toString(); @@ -176,7 +176,7 @@ void AccountSettings::loadImapResource() void AccountSettings::loadMaildirResource() { Store::fetchOne(Query().filter(mAccountIdentifier).containsFilter(ResourceCapabilities::Mail::storage)) - .syncThen([this](const SinkResource &resource) { + .then([this](const SinkResource &resource) { mMaildirIdentifier = resource.identifier(); auto path = resource.getProperty("path").toString(); if (mPath != path) { @@ -191,7 +191,7 @@ void AccountSettings::loadMaildirResource() void AccountSettings::loadMailtransportResource() { Store::fetchOne(Query().filter(mAccountIdentifier).containsFilter(ResourceCapabilities::Mail::transport)) - .syncThen([this](const SinkResource &resource) { + .then([this](const SinkResource &resource) { mMailtransportIdentifier = resource.identifier(); mSmtpServer = resource.getProperty("server").toString(); mSmtpUsername = resource.getProperty("username").toString(); @@ -206,7 +206,7 @@ void AccountSettings::loadIdentity() { //FIXME this assumes that we only ever have one identity per account Store::fetchOne(Query().filter(mAccountIdentifier)) - .syncThen([this](const Identity &identity) { + .then([this](const Identity &identity) { mIdentityIdentifier = identity.identifier(); mUsername = identity.getName(); mEmailAddress = identity.getAddress(); -- cgit v1.2.3 From 18bb7f3549e4e2f03a7110df8b5f0cfdf969f64c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 24 Jan 2017 10:47:45 +0100 Subject: Make clear on the controller work --- framework/domain/composercontroller.cpp | 18 +++++++++++++++--- framework/domain/composercontroller.h | 3 +++ framework/domain/controller.h | 2 +- framework/domain/selector.cpp | 5 +++++ framework/domain/selector.h | 2 ++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/framework/domain/composercontroller.cpp b/framework/domain/composercontroller.cpp index f1c04ea9..85faf235 100644 --- a/framework/domain/composercontroller.cpp +++ b/framework/domain/composercontroller.cpp @@ -97,9 +97,20 @@ ComposerController::ComposerController() QObject::connect(this, &ComposerController::toChanged, &ComposerController::updateSendAction); QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSendAction); + QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSendAction); + QObject::connect(this, &ComposerController::toChanged, &ComposerController::updateSaveAsDraftAction); + QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSaveAsDraftAction); + QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSaveAsDraftAction); updateSendAction(); } +void ComposerController::clear() +{ + Controller::clear(); + //Reapply account and identity from selection + mIdentitySelector->reapplyCurrentIndex(); +} + Completer *ComposerController::recipientCompleter() const { return mRecipientCompleter.data(); @@ -199,7 +210,7 @@ KMime::Message::Ptr ComposerController::assembleMessage() void ComposerController::updateSendAction() { - auto enabled = !getTo().isEmpty() && !getSubject().isEmpty(); + auto enabled = !getTo().isEmpty() && !getSubject().isEmpty() && !getAccountId().isEmpty(); sendAction()->setEnabled(enabled); } @@ -214,6 +225,7 @@ void ComposerController::send() using namespace Sink; using namespace Sink::ApplicationDomain; + Q_ASSERT(!accountId.isEmpty()); Query query; query.containsFilter(ApplicationDomain::ResourceCapabilities::Mail::transport); query.filter(accountId); @@ -241,7 +253,8 @@ void ComposerController::send() void ComposerController::updateSaveAsDraftAction() { - sendAction()->setEnabled(true); + bool enabled = !getAccountId().isEmpty(); + sendAction()->setEnabled(enabled); } void ComposerController::saveAsDraft() @@ -254,7 +267,6 @@ void ComposerController::saveAsDraft() if (!message) { SinkWarning() << "Failed to get the mail: "; return; - // return KAsync::error(1, "Failed to get the mail."); } using namespace Sink; diff --git a/framework/domain/composercontroller.h b/framework/domain/composercontroller.h index 161bcebc..92467d05 100644 --- a/framework/domain/composercontroller.h +++ b/framework/domain/composercontroller.h @@ -76,6 +76,9 @@ public: Q_INVOKABLE void loadMessage(const QVariant &draft, bool loadAsDraft); +public slots: + virtual void clear() Q_DECL_OVERRIDE; + private slots: void updateSendAction(); void updateSaveAsDraftAction(); diff --git a/framework/domain/controller.h b/framework/domain/controller.h index 9370fdc7..8e6d7155 100644 --- a/framework/domain/controller.h +++ b/framework/domain/controller.h @@ -77,7 +77,7 @@ public: virtual ~Controller() = default; public slots: - void clear(); + virtual void clear(); signals: void done(); diff --git a/framework/domain/selector.cpp b/framework/domain/selector.cpp index ddb23744..d021095b 100644 --- a/framework/domain/selector.cpp +++ b/framework/domain/selector.cpp @@ -24,3 +24,8 @@ Selector::Selector(QAbstractItemModel *model) : mModel{model} { QQmlEngine::setObjectOwnership(mModel, QQmlEngine::CppOwnership); } + +void Selector::reapplyCurrentIndex() +{ + setCurrentIndex(currentIndex()); +} diff --git a/framework/domain/selector.h b/framework/domain/selector.h index 77c47ba7..fedb91d2 100644 --- a/framework/domain/selector.h +++ b/framework/domain/selector.h @@ -40,6 +40,8 @@ public: setCurrent(mModel->index(mCurrentIndex, 0)); } + void reapplyCurrentIndex(); + int currentIndex() { return mCurrentIndex; } virtual void setCurrent(const QModelIndex &) = 0; -- cgit v1.2.3 From 07b55e8e8b21873eeb5b39f1306f6665b1630c46 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 24 Jan 2017 10:48:53 +0100 Subject: New KAsync api --- framework/domain/composercontroller.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/framework/domain/composercontroller.cpp b/framework/domain/composercontroller.cpp index 85faf235..207c5047 100644 --- a/framework/domain/composercontroller.cpp +++ b/framework/domain/composercontroller.cpp @@ -230,7 +230,7 @@ void ComposerController::send() query.containsFilter(ApplicationDomain::ResourceCapabilities::Mail::transport); query.filter(accountId); auto job = Store::fetchAll(query) - .then>([=](const QList &resources) -> KAsync::Job { + .then([=](const QList &resources) { if (!resources.isEmpty()) { auto resourceId = resources[0]->identifier(); SinkLog() << "Sending message via resource: " << resourceId; @@ -240,12 +240,13 @@ void ComposerController::send() .then([=] { //Trigger a sync, but don't wait for it. Store::synchronize(Sink::SyncScope{}.resourceFilter(resourceId)).exec(); - return KAsync::null(); }); } + SinkWarning() << "Failed to find a mailtransport resource"; return KAsync::error(0, "Failed to find a MailTransport resource."); }) .then([&] (const KAsync::Error &error) { + SinkLog() << "Message was sent: "; emit done(); }); run(job); @@ -259,6 +260,7 @@ void ComposerController::updateSaveAsDraftAction() void ComposerController::saveAsDraft() { + SinkLog() << "Save as draft"; const auto accountId = getAccountId(); auto existingMail = getExistingMail(); @@ -274,15 +276,19 @@ void ComposerController::saveAsDraft() auto job = [&] { if (existingMail.identifier().isEmpty()) { + SinkLog() << "Creating a new draft" << existingMail.identifier(); Query query; query.containsFilter(ApplicationDomain::ResourceCapabilities::Mail::drafts); query.filter(accountId); return Store::fetchOne(query) - .then([=](const SinkResource &resource) -> KAsync::Job { + .then([=](const SinkResource &resource) { Mail mail(resource.identifier()); mail.setDraft(true); mail.setMimeMessage(message->encodedContent()); return Store::create(mail); + }) + .onError([] (const KAsync::Error &error) { + SinkWarning() << "Error while creating draft: " << error.errorMessage; }); } else { SinkLog() << "Modifying an existing mail" << existingMail.identifier(); @@ -291,7 +297,7 @@ void ComposerController::saveAsDraft() return Store::modify(existingMail); } }(); - job = job.then([&] { + job = job.then([&] (const KAsync::Error &) { emit done(); }); run(job); -- cgit v1.2.3