7#include "searchlinestatus.h"
8#include "configurefiltersdialog.h"
9#include "core/filtersavedmanager.h"
10#include "filtersavedmenu.h"
11#include "messagelist_debug.h"
12#include <KStatefulBrush>
14#include <KColorScheme>
17#include <KLocalizedString>
18#include <QAbstractItemView>
20#include <QActionGroup>
22#include <QContextMenuEvent>
25#include <QStandardPaths>
26#include <QStringListModel>
27#include <QWidgetAction>
29static const char qLineEditclearButtonActionNameC[] =
"_q_qlineeditclearaction";
30#define MAX_COMPLETION_ITEMS 20
32SearchLineStatus::SearchLineStatus(
QWidget *parent)
39 mCompleter->setModel(mCompleterListModel);
40 setCompleter(mCompleter);
42 setClearButtonEnabled(
true);
45 auto act = findChild<QAction *>(
QLatin1StringView(qLineEditclearButtonActionNameC));
49 qCWarning(MESSAGELIST_LOG) <<
"Clear button name was changed ! Please verify qt code";
51 connect(FilterSavedManager::self(), &FilterSavedManager::activateFilter,
this, &SearchLineStatus::slotActivateFilter);
54SearchLineStatus::~SearchLineStatus() =
default;
56void SearchLineStatus::keyPressEvent(
QKeyEvent *e)
71void SearchLineStatus::slotClear()
73 Q_EMIT clearButtonClicked();
76void SearchLineStatus::updateLockAction()
80 mLockAction->
setToolTip(
i18nc(
"@info:tooltip",
"Prevent the quick search field from being cleared when changing folders"));
83 mLockAction->
setToolTip(
i18nc(
"@info:tooltip",
"Clear the quick search field when changing folders"));
87void SearchLineStatus::setLocked(
bool b)
90 slotToggledLockAction();
94bool SearchLineStatus::locked()
const
99void SearchLineStatus::initializeActions()
103 "Toggle this button if you want to keep your quick search "
104 "locked when moving to other folders or when narrowing the search "
105 "by message status."));
119 mFilterSavedMenu =
new FilterSavedMenu(
this);
120 mSaveFilterAction->
setMenu(mFilterSavedMenu);
122 connect(mFilterSavedMenu, &FilterSavedMenu::saveFilter,
this, &SearchLineStatus::saveFilter);
123 connect(mFilterSavedMenu, &FilterSavedMenu::configureFilters,
this, &SearchLineStatus::slotConfigureFilters);
126void SearchLineStatus::slotActivateFilter(
const QString &identifier)
128 Filter *
f = FilterSavedManager::self()->loadFilter(identifier);
132 qCWarning(
MESSAGELIST_LOG) <<
"Impossible to load Filter from identifier :" << identifier;
136void SearchLineStatus::slotConfigureFilters()
138 ConfigureFiltersDialog
dlg(
this);
142void SearchLineStatus::slotToggledLockAction()
148void SearchLineStatus::updateFilters()
153 if (
act->isChecked()) {
161 updateFilterActionIcon();
164void SearchLineStatus::showSavedFiltersMenu()
169void SearchLineStatus::showMenu()
176void SearchLineStatus::clearFilterAction()
179 act->setChecked(
false);
182 updateFilterActionIcon();
185void SearchLineStatus::createFilterAction(
const QIcon &icon,
const QString &text,
int value)
188 act->setCheckable(
true);
194void SearchLineStatus::updateFilterActionIcon()
196 mFiltersAction->
setIcon(mHasFilter ? mWithFilter : mWithoutFilter);
202 setStyleSheet(mHasFilter ? QStringLiteral(
"QLineEdit{ background-color:%1 }").arg(mColorName) :
QString());
205void SearchLineStatus::clearFilterButtonClicked()
208 clearFilterByAction();
212void SearchLineStatus::createMenuSearch()
214 mFilterMenu =
new QMenu(
this);
223 i18nc(
"@action:inmenu Status of a message",
"Unread"),
227 i18nc(
"@action:inmenu Status of a message",
"Replied"),
231 i18nc(
"@action:inmenu Status of a message",
"Forwarded"),
235 i18nc(
"@action:inmenu Status of a message",
"Important"),
239 i18nc(
"@action:inmenu Status of a message",
"Action Item"),
243 i18nc(
"@action:inmenu Status of a message",
"Watched"),
247 i18nc(
"@action:inmenu Status of a message",
"Ignored"),
251 i18nc(
"@action:inmenu Status of a message",
"Has Attachment"),
255 i18nc(
"@action:inmenu Status of a message",
"Has Invitation"),
259 i18nc(
"@action:inmenu Status of a message",
"Spam"),
263 i18nc(
"@action:inmenu Status of a message",
"Ham"),
265 createFilterByAction();
268void SearchLineStatus::createFilterByAction()
273 mSearchEveryWhereAction =
new QAction(
i18n(
"Full Message"), mFilterMenu);
277 mFilterMenu->
addAction(mSearchEveryWhereAction);
278 grp->addAction(mSearchEveryWhereAction);
280 mSearchAgainstBodyAction =
new QAction(
i18n(
"Body"), mFilterMenu);
281 grp->addAction(mSearchAgainstBodyAction);
282 mFilterMenu->
addAction(mSearchAgainstBodyAction);
285 mSearchAgainstSubjectAction =
new QAction(
i18n(
"Subject"), mFilterMenu);
286 grp->addAction(mSearchAgainstSubjectAction);
287 mFilterMenu->
addAction(mSearchAgainstSubjectAction);
290 mSearchAgainstFromOrToAction =
new QAction(mFilterMenu);
291 changeSearchAgainstFromOrToText();
292 grp->addAction(mSearchAgainstFromOrToAction);
293 mFilterMenu->
addAction(mSearchAgainstFromOrToAction);
296 mSearchAgainstBccAction =
new QAction(
i18n(
"BCC"), mFilterMenu);
297 grp->addAction(mSearchAgainstBccAction);
298 mFilterMenu->
addAction(mSearchAgainstBccAction);
300 connect(
grp, &QActionGroup::triggered,
this, &SearchLineStatus::slotFilterActionClicked);
303void SearchLineStatus::clearFilterByAction()
308bool SearchLineStatus::containsOutboundMessages()
const
310 return mContainsOutboundMessages;
313void SearchLineStatus::setContainsOutboundMessages(
bool containsOutboundMessages)
315 if (mContainsOutboundMessages != containsOutboundMessages) {
316 mContainsOutboundMessages = containsOutboundMessages;
317 changeSearchAgainstFromOrToText();
321void SearchLineStatus::changeSearchAgainstFromOrToText()
323 if (mContainsOutboundMessages) {
326 mSearchAgainstFromOrToAction->
setText(
i18n(
"From"));
333 if (mSearchEveryWhereAction->
isChecked()) {
334 searchOptions |= QuickSearchLine::SearchEveryWhere;
336 if (mSearchAgainstBodyAction->
isChecked()) {
337 searchOptions |= QuickSearchLine::SearchAgainstBody;
339 if (mSearchAgainstSubjectAction->
isChecked()) {
340 searchOptions |= QuickSearchLine::SearchAgainstSubject;
342 if (mSearchAgainstFromOrToAction->
isChecked()) {
343 if (mContainsOutboundMessages) {
344 searchOptions |= QuickSearchLine::SearchAgainstTo;
346 searchOptions |= QuickSearchLine::SearchAgainstFrom;
349 if (mSearchAgainstBccAction->
isChecked()) {
350 searchOptions |= QuickSearchLine::SearchAgainstBcc;
352 return searchOptions;
357 mSearchEveryWhereAction->
setChecked(
opts & QuickSearchLine::SearchEveryWhere);
358 mSearchAgainstBodyAction->
setChecked(
opts & QuickSearchLine::SearchAgainstBody);
359 mSearchAgainstSubjectAction->
setChecked(
opts & QuickSearchLine::SearchAgainstSubject);
360 mSearchAgainstBccAction->
setChecked(
opts & QuickSearchLine::SearchAgainstBcc);
361 if (mContainsOutboundMessages) {
362 mSearchAgainstFromOrToAction->
setChecked(
opts & QuickSearchLine::SearchAgainstTo);
364 mSearchAgainstFromOrToAction->
setChecked(
opts & QuickSearchLine::SearchAgainstFrom);
371 clearFilterByAction();
375 if (
static_cast<qint32
>(
act->data().toInt()) ==
status.toQInt32()) {
376 act->setChecked(
true);
382 updateFilterActionIcon();
385void SearchLineStatus::slotFilterActionClicked(
QAction *act)
388 Q_EMIT searchOptionChanged();
391void SearchLineStatus::addCompletionItem(
const QString &str)
395 while (mListCompetion.
size() > MAX_COMPLETION_ITEMS) {
406 popup->
addAction(
QIcon::fromTheme(QStringLiteral(
"edit-clear-locationbar-rtl")),
i18n(
"Clear History"),
this, &SearchLineStatus::slotClearHistory);
412void SearchLineStatus::slotClearHistory()
414 mListCompetion.
clear();
418#include "moc_searchlinestatus.cpp"
void fromQInt32(qint32 status)
static const MessageStatus statusUnread()
static const MessageStatus statusHasAttachment()
static const MessageStatus statusSpam()
static const MessageStatus statusHasInvitation()
static const MessageStatus statusReplied()
static const MessageStatus statusImportant()
static const MessageStatus statusWatched()
static const MessageStatus statusForwarded()
static const MessageStatus statusToAct()
static const MessageStatus statusIgnored()
static const MessageStatus statusHam()
static KIconLoader * global()
Q_SCRIPTABLE CaptureState status()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
The implementation independent part of the MessageList library.
QCA_EXPORT void setProperty(const QString &name, const QVariant &value)
void setIcon(const QIcon &icon)
void setText(const QString &text)
void triggered(bool checked)
void setWhatsThis(const QString &what)
QIcon fromTheme(const QString &name)
Qt::KeyboardModifiers modifiers() const const
QAction * addAction(const QIcon &icon, ActionPosition position)
QMenu * createStandardContextMenu()
virtual void keyPressEvent(QKeyEvent *event) override
void append(QList< T > &&value)
void prepend(parameter_type value)
qsizetype removeAll(const AT &t)
qsizetype size() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T qobject_cast(QObject *object)
void setObjectName(QAnyStringView name)
bool isEmpty() const const
void setStringList(const QStringList &strings)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QVariant fromValue(T &&value)