Messagelib

quicksearchline.cpp
1/*
2 SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5
6*/
7
8#include "quicksearchline.h"
9#include "messagelistsettings.h"
10#include <KStringHandler>
11
12#include "core/filter.h"
13#include "searchlinestatus.h"
14#include "searchstatusbuttons.h"
15#include <KLocalizedString>
16
17#include <QComboBox>
18#include <QEvent>
19#include <QHBoxLayout>
20#include <QPushButton>
21#include <QStandardPaths>
22
23using namespace MessageList::Core;
24QuickSearchLine::QuickSearchLine(QWidget *parent)
25 : QWidget(parent)
26 , mSearchEdit(new SearchLineStatus(this))
27 , mSearchStatusButtons(new SearchStatusButtons(this))
28 , mSearchMessageByButtons(new SearchMessageByButtons(this))
29 , mTagFilterCombo(new QComboBox(this))
30{
31 auto vbox = new QVBoxLayout(this);
32 vbox->setContentsMargins({});
33 vbox->setSpacing(0);
34
35 auto w = new QWidget;
36 auto hbox = new QHBoxLayout(w);
37 hbox->setContentsMargins({});
38 hbox->setSpacing(0);
39 vbox->addWidget(w);
40
41 vbox->addWidget(mSearchMessageByButtons);
42 mSearchMessageByButtons->setVisible(false);
43
44 connect(mSearchEdit, &SearchLineStatus::forceLostFocus, this, &QuickSearchLine::forceLostFocus);
45 mSearchEdit->setPlaceholderText(i18nc("Search for messages.", "Search"));
46 mSearchEdit->setObjectName(QLatin1StringView("quicksearch"));
47 mSearchEdit->setClearButtonEnabled(true);
48 connect(mSearchMessageByButtons, &SearchMessageByButtons::searchOptionChanged, this, [this]() {
49 mSearchEdit->filterAdded();
50 Q_EMIT searchOptionChanged();
51 });
52
53 connect(mSearchEdit, &QLineEdit::textChanged, this, &QuickSearchLine::slotSearchEditTextEdited);
54 connect(mSearchEdit, &SearchLineStatus::clearButtonClicked, this, &QuickSearchLine::slotClearButtonClicked);
55 connect(mSearchEdit, &SearchLineStatus::saveFilter, this, &QuickSearchLine::saveFilter);
56 connect(mSearchEdit, &SearchLineStatus::activateFilter, this, &QuickSearchLine::activateFilter);
57
58 hbox->addWidget(mSearchEdit);
59 mSearchStatusButtons->setObjectName(QLatin1StringView("mSearchStatusButtons"));
60 hbox->addWidget(mSearchStatusButtons);
61 connect(mSearchStatusButtons, &SearchStatusButtons::filterStatusChanged, this, &QuickSearchLine::slotFilterActionChanged);
62
63 // The status filter button. Will be populated later, as populateStatusFilterCombo() is virtual
64 mTagFilterCombo->setObjectName(QLatin1StringView("mTagFilterCombo"));
65 mTagFilterCombo->setMaximumWidth(300);
66 mTagFilterCombo->setMaximumWidth(200);
67 mTagFilterCombo->hide();
68 hbox->addWidget(mTagFilterCombo);
69
70 // Be disable until we have a storageModel => logical that it's disable.
71 mSearchEdit->setEnabled(false);
72 mTagFilterCombo->setEnabled(false);
73
74 installEventFilter(this);
75 mTagFilterCombo->installEventFilter(this);
76 changeQuicksearchVisibility(MessageListSettings::self()->showQuickSearch());
77}
78
79QuickSearchLine::~QuickSearchLine() = default;
80
81void QuickSearchLine::slotSearchEditTextEdited(const QString &text)
82{
83 int minimumStringLength = 3;
84 if (text.startsWith(QLatin1Char('"')) && text.endsWith(QLatin1Char('"'))) {
85 minimumStringLength = 5;
86 }
87 if (!text.trimmed().isEmpty()) {
88 if (KStringHandler::logicalLength(text) >= minimumStringLength) {
89 mSearchMessageByButtons->setVisible(true);
90 Q_EMIT searchEditTextEdited(text);
91 }
92 } else {
93 slotClearButtonClicked();
94 }
95}
96
97void QuickSearchLine::slotClearButtonClicked()
98{
99 if (mTagFilterCombo->isVisible()) {
100 mTagFilterCombo->setCurrentIndex(0);
101 }
102 mSearchEdit->clearFilterButtonClicked();
103 mSearchStatusButtons->clearFilter();
104 mSearchMessageByButtons->clearFilter();
105 mSearchMessageByButtons->setVisible(false);
106 Q_EMIT clearButtonClicked();
107}
108
109void QuickSearchLine::setSearchOptions(SearchMessageByButtons::SearchOptions opts)
110{
111 mSearchMessageByButtons->setSearchOptions(opts);
112 mSearchMessageByButtons->setVisible(true);
113 mSearchEdit->filterAdded();
114}
115
116SearchMessageByButtons::SearchOptions QuickSearchLine::searchOptions() const
117{
118 return mSearchMessageByButtons->searchOptions();
119}
120
121void QuickSearchLine::focusQuickSearch(const QString &selectedText)
122{
123 if (!selectedText.isEmpty()) {
124 mSearchEdit->setText(selectedText);
125 }
126 mSearchEdit->setFocus();
127}
128
129QComboBox *QuickSearchLine::tagFilterComboBox() const
130{
131 return mTagFilterCombo;
132}
133
134SearchLineStatus *QuickSearchLine::searchEdit() const
135{
136 return mSearchEdit;
137}
138
139void QuickSearchLine::resetFilter()
140{
141 if (mTagFilterCombo->isVisible()) {
142 mTagFilterCombo->setCurrentIndex(0);
143 }
144 mSearchEdit->clearFilterButtonClicked();
145 mSearchEdit->setLocked(false);
146 mSearchStatusButtons->clearFilter();
147}
148
149void QuickSearchLine::slotFilterActionChanged(const QList<Akonadi::MessageStatus> &lst)
150{
151 mLstStatus = lst;
152 mSearchEdit->filterAdded();
153 Q_EMIT statusButtonsClicked();
154}
155
156void QuickSearchLine::setFilterMessageStatus(const QList<Akonadi::MessageStatus> &newLstStatus)
157{
158 mLstStatus = newLstStatus;
159 mSearchEdit->filterAdded();
160 mSearchStatusButtons->setFilterMessageStatus(mLstStatus);
161}
162
163QList<Akonadi::MessageStatus> QuickSearchLine::status() const
164{
165 return mLstStatus;
166}
167
168bool QuickSearchLine::containsOutboundMessages() const
169{
170 return mSearchMessageByButtons->containsOutboundMessages();
171}
172
173void QuickSearchLine::setContainsOutboundMessages(bool containsOutboundMessages)
174{
175 mSearchMessageByButtons->setContainsOutboundMessages(containsOutboundMessages);
176}
177
178void QuickSearchLine::updateComboboxVisibility()
179{
180 mTagFilterCombo->setVisible(!mSearchEdit->isHidden() && mTagFilterCombo->count());
181}
182
183bool QuickSearchLine::eventFilter(QObject *object, QEvent *e)
184{
185 const bool shortCutOverride = (e->type() == QEvent::ShortcutOverride);
186 if (shortCutOverride) {
187 e->accept();
188 return true;
189 }
190 return QWidget::eventFilter(object, e);
191}
192
193void QuickSearchLine::changeQuicksearchVisibility(bool show)
194{
195 mSearchEdit->setVisible(show);
196 mTagFilterCombo->setVisible(show && mTagFilterCombo->count());
197 mSearchStatusButtons->setVisible(show);
198}
199
200void QuickSearchLine::addCompletionItem(const QString &str)
201{
202 mSearchEdit->addCompletionItem(str);
203}
204
205#include "moc_quicksearchline.cpp"
constexpr bool isEmpty() const
QString i18nc(const char *context, const char *text, const TYPE &arg...)
KCOREADDONS_EXPORT int logicalLength(const QString &text)
The implementation independent part of the MessageList library.
Definition aggregation.h:22
void setCurrentIndex(int index)
ShortcutOverride
void accept()
Type type() const const
void setText(const QString &)
void textChanged(const QString &text)
Q_EMITQ_EMIT
virtual bool eventFilter(QObject *watched, QEvent *event)
bool isEmpty() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
bool isHidden() const const
void setFocus()
void show()
virtual void setVisible(bool visible)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri Jul 26 2024 11:54:19 by doxygen 1.11.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.