You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
7.4 KiB
232 lines
7.4 KiB
/* |
|
SPDX-FileCopyrightText: 2014-2020 Laurent Montel <montel@kde.org> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
#include "followupreminderinfowidget.h" |
|
#include "followupreminderinfo.h" |
|
#include "followupreminderutil.h" |
|
#include "jobs/followupremindershowmessagejob.h" |
|
#include "followupreminderagent_debug.h" |
|
|
|
#include <QTreeWidget> |
|
#include <QHBoxLayout> |
|
#include <QHeaderView> |
|
#include <QLocale> |
|
#include <QIcon> |
|
#include <QMenu> |
|
#include <KLocalizedString> |
|
#include <KSharedConfig> |
|
#include <KMessageBox> |
|
|
|
// #define DEBUG_MESSAGE_ID |
|
namespace { |
|
inline QString followUpItemPattern() |
|
{ |
|
return QStringLiteral("FollowupReminderItem \\d+"); |
|
} |
|
} |
|
|
|
FollowUpReminderInfoItem::FollowUpReminderInfoItem(QTreeWidget *parent) |
|
: QTreeWidgetItem(parent) |
|
{ |
|
} |
|
|
|
FollowUpReminderInfoItem::~FollowUpReminderInfoItem() |
|
{ |
|
delete mInfo; |
|
} |
|
|
|
void FollowUpReminderInfoItem::setInfo(FollowUpReminder::FollowUpReminderInfo *info) |
|
{ |
|
mInfo = info; |
|
} |
|
|
|
FollowUpReminder::FollowUpReminderInfo *FollowUpReminderInfoItem::info() const |
|
{ |
|
return mInfo; |
|
} |
|
|
|
FollowUpReminderInfoWidget::FollowUpReminderInfoWidget(QWidget *parent) |
|
: QWidget(parent) |
|
{ |
|
setObjectName(QStringLiteral("FollowUpReminderInfoWidget")); |
|
auto *hbox = new QHBoxLayout(this); |
|
hbox->setContentsMargins({}); |
|
mTreeWidget = new QTreeWidget(this); |
|
mTreeWidget->setObjectName(QStringLiteral("treewidget")); |
|
QStringList headers; |
|
headers << i18n("To") |
|
<< i18n("Subject") |
|
<< i18n("Dead Line") |
|
<< i18n("Answer") |
|
#ifdef DEBUG_MESSAGE_ID |
|
<< QStringLiteral("Message Id") |
|
<< QStringLiteral("Answer Message Id") |
|
#endif |
|
; |
|
|
|
mTreeWidget->setHeaderLabels(headers); |
|
mTreeWidget->setSortingEnabled(true); |
|
mTreeWidget->setRootIsDecorated(false); |
|
mTreeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); |
|
mTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu); |
|
|
|
connect(mTreeWidget, &QTreeWidget::customContextMenuRequested, this, &FollowUpReminderInfoWidget::slotCustomContextMenuRequested); |
|
|
|
hbox->addWidget(mTreeWidget); |
|
} |
|
|
|
FollowUpReminderInfoWidget::~FollowUpReminderInfoWidget() |
|
= default; |
|
|
|
void FollowUpReminderInfoWidget::setInfo(const QList<FollowUpReminder::FollowUpReminderInfo *> &infoList) |
|
{ |
|
mTreeWidget->clear(); |
|
for (FollowUpReminder::FollowUpReminderInfo *info : infoList) { |
|
if (info->isValid()) { |
|
createOrUpdateItem(info); |
|
} else { |
|
delete info; |
|
} |
|
} |
|
} |
|
|
|
void FollowUpReminderInfoWidget::load() |
|
{ |
|
auto config = FollowUpReminder::FollowUpReminderUtil::defaultConfig(); |
|
const QStringList filterGroups = config->groupList().filter(QRegularExpression(followUpItemPattern())); |
|
const int numberOfItem = filterGroups.count(); |
|
for (int i = 0; i < numberOfItem; ++i) { |
|
KConfigGroup group = config->group(filterGroups.at(i)); |
|
|
|
auto *info = new FollowUpReminder::FollowUpReminderInfo(group); |
|
if (info->isValid()) { |
|
createOrUpdateItem(info); |
|
} else { |
|
delete info; |
|
} |
|
} |
|
} |
|
|
|
QList<qint32> FollowUpReminderInfoWidget::listRemoveId() const |
|
{ |
|
return mListRemoveId; |
|
} |
|
|
|
void FollowUpReminderInfoWidget::createOrUpdateItem(FollowUpReminder::FollowUpReminderInfo *info, FollowUpReminderInfoItem *item) |
|
{ |
|
if (!item) { |
|
item = new FollowUpReminderInfoItem(mTreeWidget); |
|
} |
|
item->setInfo(info); |
|
item->setText(To, info->to()); |
|
item->setText(Subject, info->subject()); |
|
const QString date = QLocale().toString(info->followUpReminderDate()); |
|
item->setText(DeadLine, date); |
|
const bool answerWasReceived = info->answerWasReceived(); |
|
item->setText(AnswerWasReceived, answerWasReceived ? i18n("Received") : i18n("On hold")); |
|
item->setData(0, AnswerItemFound, answerWasReceived); |
|
if (answerWasReceived) { |
|
item->setBackground(DeadLine, Qt::green); |
|
} else { |
|
if (info->followUpReminderDate() < QDate::currentDate()) { |
|
item->setBackground(DeadLine, Qt::red); |
|
} |
|
} |
|
#ifdef DEBUG_MESSAGE_ID |
|
item->setText(MessageId, QString::number(info->originalMessageItemId())); |
|
item->setText(AnswerMessageId, QString::number(info->answerMessageItemId())); |
|
#endif |
|
} |
|
|
|
bool FollowUpReminderInfoWidget::save() const |
|
{ |
|
if (!mChanged) { |
|
return false; |
|
} |
|
KSharedConfig::Ptr config = KSharedConfig::openConfig(); |
|
|
|
// first, delete all filter groups: |
|
const QStringList filterGroups = config->groupList().filter(QRegularExpression(followUpItemPattern())); |
|
|
|
for (const QString &group : filterGroups) { |
|
config->deleteGroup(group); |
|
} |
|
|
|
const int numberOfItem(mTreeWidget->topLevelItemCount()); |
|
int i = 0; |
|
for (; i < numberOfItem; ++i) { |
|
auto *mailItem = static_cast<FollowUpReminderInfoItem *>(mTreeWidget->topLevelItem(i)); |
|
if (mailItem->info()) { |
|
KConfigGroup group = config->group(FollowUpReminder::FollowUpReminderUtil::followUpReminderPattern().arg(i)); |
|
mailItem->info()->writeConfig(group, i); |
|
} |
|
} |
|
++i; |
|
KConfigGroup general = config->group(QStringLiteral("General")); |
|
general.writeEntry("Number", i); |
|
config->sync(); |
|
return true; |
|
} |
|
|
|
void FollowUpReminderInfoWidget::slotCustomContextMenuRequested(const QPoint &pos) |
|
{ |
|
Q_UNUSED(pos) |
|
const QList<QTreeWidgetItem *> listItems = mTreeWidget->selectedItems(); |
|
const int nbElementSelected = listItems.count(); |
|
if (nbElementSelected > 0) { |
|
QMenu menu(this); |
|
QAction *showMessage = nullptr; |
|
FollowUpReminderInfoItem *mailItem = nullptr; |
|
if ((nbElementSelected == 1)) { |
|
mailItem = static_cast<FollowUpReminderInfoItem *>(listItems.at(0)); |
|
if (mailItem->data(0, AnswerItemFound).toBool()) { |
|
showMessage = menu.addAction(i18n("Show Message")); |
|
menu.addSeparator(); |
|
} |
|
} |
|
QAction *deleteItem = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Delete")); |
|
QAction *result = menu.exec(QCursor::pos()); |
|
if (result) { |
|
if (result == showMessage) { |
|
openShowMessage(mailItem->info()->answerMessageItemId()); |
|
} else if (result == deleteItem) { |
|
removeItem(listItems); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void FollowUpReminderInfoWidget::openShowMessage(Akonadi::Item::Id id) |
|
{ |
|
auto *job = new FollowUpReminderShowMessageJob(id); |
|
job->start(); |
|
} |
|
|
|
void FollowUpReminderInfoWidget::removeItem(const QList<QTreeWidgetItem *> &mailItemLst) |
|
{ |
|
if (mailItemLst.isEmpty()) { |
|
qCDebug(FOLLOWUPREMINDERAGENT_LOG) << "Not item selected"; |
|
} else { |
|
if (KMessageBox::Yes == KMessageBox::warningYesNo(this, |
|
i18np("Do you want to remove this selected item?", "Do you want to remove these %1 selected items?", mailItemLst.count()), i18n("Delete"))) { |
|
for (QTreeWidgetItem *item : mailItemLst) { |
|
auto *mailItem = static_cast<FollowUpReminderInfoItem *>(item); |
|
mListRemoveId << mailItem->info()->uniqueIdentifier(); |
|
delete mailItem; |
|
} |
|
mChanged = true; |
|
} |
|
} |
|
} |
|
|
|
void FollowUpReminderInfoWidget::restoreTreeWidgetHeader(const QByteArray &data) |
|
{ |
|
mTreeWidget->header()->restoreState(data); |
|
} |
|
|
|
void FollowUpReminderInfoWidget::saveTreeWidgetHeader(KConfigGroup &group) |
|
{ |
|
group.writeEntry("HeaderState", mTreeWidget->header()->saveState()); |
|
}
|
|
|