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"