8#include "markascommand.h"
9#include "markascommandhelper_p.h"
11#include <Akonadi/CollectionFetchJob>
12#include <Akonadi/ItemFetchJob>
13#include <Akonadi/ItemFetchScope>
14#include <Akonadi/ItemModifyJob>
16#include <KLocalizedString>
21class Akonadi::MarkAsCommandPrivate
24 MarkAsCommandPrivate() =
default;
28 Akonadi::MessageStatus mTargetStatus;
29 int mMarkJobCount = 0;
30 int mFolderListJobCount = 0;
32 bool mRecursive =
false;
37 , d(new
Akonadi::MarkAsCommandPrivate())
39 d->mInvertMark = invert;
40 d->mMessages = msgList;
41 d->mTargetStatus = targetStatus;
42 d->mFolderListJobCount = 0;
48 , d(new
Akonadi::MarkAsCommandPrivate())
50 d->mInvertMark = invert;
51 d->mFolders = folders;
52 d->mTargetStatus = targetStatus;
53 d->mFolderListJobCount = d->mFolders.size();
55 d->mRecursive = recursive;
58MarkAsCommand::~MarkAsCommand() =
default;
60void MarkAsCommand::slotCollectionFetchDone(
KJob *job)
63 Util::showJobError(job);
68 auto fjob =
static_cast<Akonadi::CollectionFetchJob *
>(job);
69 d->mFolders += fjob->collections();
70 d->mFolderListJobCount = d->mFolders.size();
73 d->mRecursive =
false;
77void MarkAsCommand::slotFetchDone(KJob *job)
79 d->mFolderListJobCount--;
83 Util::showJobError(job);
88 auto fjob =
static_cast<Akonadi::ItemFetchJob *
>(job);
90 const auto items = fjob->items();
91 for (
const Akonadi::Item &item : items) {
92 Akonadi::MessageStatus
status;
93 status.setStatusFromFlags(item.flags());
95 if (
status & d->mTargetStatus) {
96 d->mMessages.append(item);
98 }
else if (!(
status & d->mTargetStatus)) {
99 d->mMessages.append(item);
102 if (d->mMessages.empty()) {
103 if (d->mFolderListJobCount == 0) {
110 if (d->mFolderListJobCount > 0) {
111 auto fetchJob =
new Akonadi::ItemFetchJob(d->mFolders[d->mFolderListJobCount - 1],
parent());
117void MarkAsCommand::execute()
119 if (d->mRecursive && !d->mFolders.isEmpty()) {
121 i18n(
"Are you sure you want to mark all messages in this folder and all its subfolders?"),
122 i18nc(
"@title:window",
"Mark All Recursively"),
123 KGuiItem(
i18nc(
"@action:button",
"Mark All")),
125 == KMessageBox::ButtonCode::PrimaryAction) {
126 auto job =
new Akonadi::CollectionFetchJob(d->mFolders.constFirst());
129 emitResult(Canceled);
131 }
else if (!d->mFolders.isEmpty()) {
133 auto job =
new Akonadi::ItemFetchJob(d->mFolders[d->mFolderListJobCount - 1],
parent());
136 }
else if (!d->mMessages.isEmpty()) {
137 d->mFolders << d->mMessages.first().parentCollection();
144void MarkAsCommand::markMessages()
146 d->mMarkJobCount = 0;
148 QSet<QByteArray> flags = d->mTargetStatus.statusFlags();
149 Q_ASSERT(flags.
size() == 1);
152 flag = *(flags.
begin());
156 for (
const Akonadi::Item &it : std::as_const(d->mMessages)) {
157 Akonadi::Item item(it);
161 if (d->mInvertMark) {
162 if (item.hasFlag(flag)) {
163 item.clearFlag(flag);
167 if (!item.hasFlag(flag)) {
176 slotModifyItemDone();
178 auto helper =
new Akonadi::MarkAsCommandHelper(
this);
179 helper->setItemsToModify(itemsToModify);
180 connect(helper, &Akonadi::MarkAsCommandHelper::emitResult,
this, &MarkAsCommand::slotHelperDone);
185void MarkAsCommand::slotHelperDone(Akonadi::CommandBase::Result result)
188 if (result == Akonadi::CommandBase::Failed) {
191 slotModifyItemDone();
194void MarkAsCommand::slotModifyItemDone()
196 if (d->mMarkJobCount == 0 && d->mFolderListJobCount == 0) {
201#include "moc_markascommand.cpp"
Akonadi KMime Message Status.
Q_SCRIPTABLE CaptureState status()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
bool isEmpty() const const
void push_back(parameter_type value)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
T qobject_cast(QObject *object)
bool isEmpty() const const
qsizetype size() const const