File indexing completed on 2024-05-05 05:13:11

0001 /*
0002    SPDX-FileCopyrightText: 2016-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "statussearchline.h"
0008 #include <KLocalizedString>
0009 #include <QAction>
0010 #include <QActionGroup>
0011 #include <QKeyEvent>
0012 #include <QMenu>
0013 
0014 using namespace Akregator;
0015 Q_DECLARE_METATYPE(Akregator::StatusSearchLine::Status)
0016 StatusSearchLine::StatusSearchLine(QWidget *parent)
0017     : KLineEdit(parent)
0018 {
0019     setProperty("_breeze_borders_sides", QVariant::fromValue(QFlags{Qt::BottomEdge}));
0020     initializeHash();
0021     initializeActions();
0022 }
0023 
0024 StatusSearchLine::~StatusSearchLine() = default;
0025 
0026 void StatusSearchLine::keyPressEvent(QKeyEvent *e)
0027 {
0028     if (e->key() == Qt::Key_Escape) {
0029         Q_EMIT forceLostFocus();
0030     } else {
0031         KLineEdit::keyPressEvent(e);
0032     }
0033 }
0034 
0035 void StatusSearchLine::initializeHash()
0036 {
0037     const QIcon iconAll = QIcon::fromTheme(QStringLiteral("system-run"));
0038     const QIcon iconNew = QIcon::fromTheme(QStringLiteral("mail-mark-unread-new"));
0039     const QIcon iconUnread = QIcon::fromTheme(QStringLiteral("mail-mark-unread"));
0040     const QIcon iconRead = QIcon::fromTheme(QStringLiteral("mail-mark-read"));
0041     const QIcon iconKeep = QIcon::fromTheme(QStringLiteral("mail-mark-important"));
0042 
0043     StatusInfo statusAll(i18n("All Articles"), iconAll);
0044     StatusInfo statusUnread(i18nc("Unread articles filter", "Unread"), iconUnread);
0045     StatusInfo statusNew(i18nc("New articles filter", "New"), iconNew);
0046     StatusInfo statusRead(i18nc("Read articles filter", "Read"), iconRead);
0047     StatusInfo statusImportant(i18nc("Important articles filter", "Important"), iconKeep);
0048 
0049     mHashStatus.insert(AllArticles, statusAll);
0050     mHashStatus.insert(NewArticles, statusNew);
0051     mHashStatus.insert(UnreadArticles, statusUnread);
0052     mHashStatus.insert(ReadArticles, statusRead);
0053     mHashStatus.insert(ImportantArticles, statusImportant);
0054 }
0055 
0056 void StatusSearchLine::setStatus(StatusSearchLine::Status status)
0057 {
0058     updateStatusIcon(status);
0059 }
0060 
0061 void StatusSearchLine::initializeActions()
0062 {
0063     mSearchLineStatusAction = addAction(mHashStatus.value(AllArticles).mIcon, QLineEdit::LeadingPosition);
0064     mSearchLineStatusAction->setText(i18n("Filter"));
0065     mSearchLineStatusAction->setToolTip(mHashStatus.value(AllArticles).mText);
0066     connect(mSearchLineStatusAction, &QAction::triggered, this, &StatusSearchLine::showMenu);
0067 }
0068 
0069 void StatusSearchLine::showMenu()
0070 {
0071     QMenu p(this);
0072     auto grp = new QActionGroup(this);
0073     grp->setExclusive(true);
0074     for (int i = AllArticles; i <= ImportantArticles; ++i) {
0075         auto status = static_cast<StatusSearchLine::Status>(i);
0076         auto act = new QAction(mHashStatus.value(status).mIcon, mHashStatus.value(status).mText, this);
0077         act->setCheckable(true);
0078         act->setChecked(mDefaultStatus == status);
0079         act->setData(QVariant::fromValue(status));
0080         grp->addAction(act);
0081         p.addAction(act);
0082         if (i == AllArticles) {
0083             p.addSeparator();
0084         }
0085     }
0086     QAction *a = p.exec(mapToGlobal(QPoint(0, height())));
0087     if (a) {
0088         const auto newStatus = a->data().value<StatusSearchLine::Status>();
0089         updateStatusIcon(newStatus);
0090     }
0091 }
0092 
0093 void StatusSearchLine::updateStatusIcon(StatusSearchLine::Status status)
0094 {
0095     if (mDefaultStatus != status) {
0096         mDefaultStatus = status;
0097         mSearchLineStatusAction->setIcon(mHashStatus[status].mIcon);
0098         mSearchLineStatusAction->setToolTip(mHashStatus[status].mText);
0099 
0100         Q_EMIT statusChanged(mDefaultStatus);
0101     }
0102 }
0103 
0104 StatusSearchLine::Status StatusSearchLine::status() const
0105 {
0106     return mDefaultStatus;
0107 }
0108 
0109 #include "moc_statussearchline.cpp"