From 6da27b749c3496faa12570d0ddb4ef7f6905110b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Vr=C3=A1til?= <daniel.vratil@kdab.com> Date: Wed, 30 Mar 2016 14:32:23 +0200 Subject: [PATCH 38/47] Add "Mark All as Read Recursively" action to StandardMailActionManager --- akonadi/kmime/markascommand.cpp | 37 +++++++++++++++++++++++++++-- akonadi/kmime/markascommand_p.h | 4 +++- akonadi/kmime/standardmailactionmanager.cpp | 20 +++++++++++++++- akonadi/kmime/standardmailactionmanager.h | 1 + 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/akonadi/kmime/markascommand.cpp b/akonadi/kmime/markascommand.cpp index 7adee881e..000a46924 100644 --- a/akonadi/kmime/markascommand.cpp +++ b/akonadi/kmime/markascommand.cpp @@ -22,6 +22,10 @@ #include <akonadi/itemfetchjob.h> #include <akonadi/itemfetchscope.h> #include <akonadi/itemmodifyjob.h> +#include <akonadi/collectionfetchjob.h> + +#include <kmessagebox.h> +#include <klocalizedstring.h> MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const Akonadi::Item::List &msgList, bool invert, QObject *parent) : CommandBase(parent) @@ -33,7 +37,7 @@ MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const A mMarkJobCount = 0; } -MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const Akonadi::Collection::List &folders, bool invert, QObject *parent) +MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const Akonadi::Collection::List &folders, bool invert, bool recursive, QObject *parent) : CommandBase(parent) { mInvertMark = invert; @@ -41,6 +45,24 @@ MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const A mTargetStatus = targetStatus; mFolderListJobCount = mFolders.size(); mMarkJobCount = 0; + mRecursive = recursive; +} + +void MarkAsCommand::slotCollectionFetchDone(KJob *job) +{ + if (job->error()) { + Util::showJobError(job); + emitResult(Failed); + return; + } + + Akonadi::CollectionFetchJob *fjob = static_cast<Akonadi::CollectionFetchJob *>(job); + mFolders += fjob->collections(); + mFolderListJobCount = mFolders.size(); + + // We have the subtree now, so act as if we were passed the collections in ctor + mRecursive = false; + execute(); } void MarkAsCommand::slotFetchDone(KJob *job) @@ -84,7 +106,18 @@ void MarkAsCommand::slotFetchDone(KJob *job) void MarkAsCommand::execute() { - if (!mFolders.isEmpty()) { + if (mRecursive && !mFolders.isEmpty()) { + if (KMessageBox::questionYesNo(qobject_cast<QWidget*>(parent()), + i18n("Are you sure you want to mark all messages in this folder and all its subfolders?"), + i18n("Mark All Recursively?")) == KMessageBox::Yes) { + Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob(mFolders.first(), + Akonadi::CollectionFetchJob::Recursive, + parent()); + connect(job, SIGNAL(result(KJob*)), this, SLOT(slotCollectionFetchDone(KJob*))); + } else { + emitResult(Canceled); + } + } else if (!mFolders.isEmpty()) { //yes, we go backwards, shouldn't matter Akonadi::ItemFetchJob *job = new Akonadi::ItemFetchJob(mFolders[mFolderListJobCount - 1], parent()); job->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::Parent); diff --git a/akonadi/kmime/markascommand_p.h b/akonadi/kmime/markascommand_p.h index 16117cdbe..c6a8ae039 100644 --- a/akonadi/kmime/markascommand_p.h +++ b/akonadi/kmime/markascommand_p.h @@ -34,10 +34,11 @@ class MarkAsCommand : public CommandBase Q_OBJECT public: MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const Akonadi::Item::List &msgList, bool invert = false, QObject *parent = 0); - MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const Akonadi::Collection::List &folders, bool invert = false, QObject *parent = 0); + MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const Akonadi::Collection::List &folders, bool invert = false, bool recursive = false, QObject *parent = 0); void execute(); private Q_SLOTS: + void slotCollectionFetchDone(KJob *job); void slotFetchDone(KJob *job); void slotModifyItemDone(KJob *job); @@ -50,6 +51,7 @@ private: int mMarkJobCount; int mFolderListJobCount; int mInvertMark; + bool mRecursive; }; #endif // MARKASCOMMAND_H diff --git a/akonadi/kmime/standardmailactionmanager.cpp b/akonadi/kmime/standardmailactionmanager.cpp index 89194ecac..6e886011e 100644 --- a/akonadi/kmime/standardmailactionmanager.cpp +++ b/akonadi/kmime/standardmailactionmanager.cpp @@ -546,6 +546,11 @@ public: invert = true; typeStr = typeStr.mid(1); } + bool recursive = false; + if (typeStr.startsWith(':')) { + recursive = true; + typeStr = typeStr.mid(1); + } StandardMailActionManager::Type type = MarkAllMailAsRead; if (typeStr == "U") { @@ -562,7 +567,7 @@ public: return; } - MarkAsCommand *command = new MarkAsCommand(targetStatus, collections, invert, mParent); + MarkAsCommand *command = new MarkAsCommand(targetStatus, collections, invert, recursive, mParent); command->execute(); } @@ -777,6 +782,18 @@ KAction *StandardMailActionManager::createAction(Type type) action->setData(QByteArray("R")); connect(action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs())); break; + case MarkAllMailAsReadRecursive: + action = new KAction(d->mParentWidget); + action->setIcon(KIcon(QLatin1String("mail-mark-read"))); + action->setText(i18n("Mark &All Messages as Read Recursively")); + action->setIconText(i18n("Mark All as Read Recursively")); + action->setHelpText(i18n("Mark all messages as read recursively.")); + action->setWhatsThis(i18n("Mark all messages as read recursively.")); + d->mActions.insert(MarkAllMailAsReadRecursive, action); + d->mActionCollection->addAction(QString::fromLatin1("akonadi_mark_all_as_read_recursive"), action); + action->setData(QByteArray(":R")); + connect(action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs())); + break; case MarkAllMailAsUnread: action = new KAction(d->mParentWidget); action->setIcon(KIcon(QLatin1String("mail-mark-unread"))); @@ -887,6 +904,7 @@ void StandardMailActionManager::createAllActions() createAction(MarkMailAsImportant); createAction(MarkMailAsActionItem); createAction(MarkAllMailAsRead); + createAction(MarkAllMailAsReadRecursive); createAction(MarkAllMailAsUnread); createAction(MarkAllMailAsImportant); createAction(MarkAllMailAsActionItem); diff --git a/akonadi/kmime/standardmailactionmanager.h b/akonadi/kmime/standardmailactionmanager.h index c365e5648..8bbb7e591 100644 --- a/akonadi/kmime/standardmailactionmanager.h +++ b/akonadi/kmime/standardmailactionmanager.h @@ -58,6 +58,7 @@ public: MarkMailAsImportant, ///< Marks a mail as important MarkMailAsActionItem, ///< Marks a mail as action item MarkAllMailAsRead, ///< Marks all mails in a folder as read. + MarkAllMailAsReadRecursive, ///< Marks all mails in a folder and its subfolders as read. MarkAllMailAsUnread, ///< Marks all mails in a folder as unread. MarkAllMailAsImportant, ///< Marks all mails in a folder as important MarkAllMailAsActionItem, ///< Marks all mails in a folder as action item -- 2.14.1