43 #include <QMessageBox>
45 #include <QMouseEvent>
47 #include <QRegularExpression>
49 #include <QTextStream>
60 #include "ui_searchwidget.h"
62 #define SEARCHHISTORY_MAXSIZE 50
72 return QLatin1String(
"task-ongoing");
74 return QLatin1String(
"task-complete");
76 return QLatin1String(
"task-reject");
78 return QLatin1String(
"task-attention");
80 return QLatin1String(
"task-attention");
90 , m_mainWindow(mainWindow)
91 , m_isNewQueryString(false)
94 m_ui->tabWidget->tabBar()->installEventFilter(
this);
96 QString searchPatternHint;
97 QTextStream stream(&searchPatternHint, QIODevice::WriteOnly);
98 stream <<
"<html><head/><body><p>"
99 << tr(
"A phrase to search for.") <<
"<br>"
100 << tr(
"Spaces in a search term may be protected by double quotes.")
102 << tr(
"Example:",
"Search phrase example")
104 << tr(
"<b>foo bar</b>: search for <b>foo</b> and <b>bar</b>",
105 "Search phrase example, illustrates quotes usage, a pair of "
106 "space delimited words, individal words are highlighted")
108 << tr(
"<b>"foo bar"</b>: search for <b>foo bar</b>",
109 "Search phrase example, illustrates quotes usage, double quoted"
110 "pair of space delimited words, the whole pair is highlighted")
111 <<
"</p></body></html>";
112 m_ui->lineEditSearchPattern->setToolTip(searchPatternHint);
120 QSize iconSize =
m_ui->tabWidget->iconSize();
121 iconSize.setWidth(iconSize.width() + 16);
122 m_ui->tabWidget->setIconSize(iconSize);
128 const auto onPluginChanged = [
this]()
142 connect(
m_ui->lineEditSearchPattern, &LineEdit::returnPressed,
m_ui->searchButton, &QPushButton::click);
144 connect(
m_ui->selectPlugin, qOverload<int>(&QComboBox::currentIndexChanged)
146 connect(
m_ui->selectPlugin, qOverload<int>(&QComboBox::currentIndexChanged)
149 const auto focusSearchHotkey =
new QShortcut(QKeySequence::Find,
this);
155 if (
object ==
m_ui->tabWidget->tabBar())
158 if (event->type() != QEvent::MouseButtonRelease)
161 const auto mouseEvent =
static_cast<QMouseEvent *
>(event);
162 const int tabIndex =
m_ui->tabWidget->tabBar()->tabAt(mouseEvent->pos());
163 if ((mouseEvent->button() == Qt::MiddleButton) && (tabIndex >= 0))
168 if (mouseEvent->button() == Qt::RightButton)
170 QMenu *menu =
new QMenu(
this);
171 menu->setAttribute(Qt::WA_DeleteOnClose);
172 menu->addAction(tr(
"Close tab"),
this, [
this, tabIndex]() {
closeTab(tabIndex); });
174 menu->popup(QCursor::pos());
179 return QWidget::eventFilter(
object, event);
184 m_ui->comboCategory->clear();
187 using QStrPair = std::pair<QString, QString>;
188 QVector<QStrPair> tmpList;
191 std::sort(tmpList.begin(), tmpList.end(), [](
const QStrPair &l,
const QStrPair &r) { return (QString::localeAwareCompare(l.first, r.first) < 0); });
193 for (
const QStrPair &p :
asConst(tmpList))
195 qDebug(
"Supported category: %s", qUtf8Printable(p.second));
196 m_ui->comboCategory->addItem(p.first, p.second);
199 if (
m_ui->comboCategory->count() > 1)
200 m_ui->comboCategory->insertSeparator(1);
205 m_ui->selectPlugin->clear();
206 m_ui->selectPlugin->addItem(tr(
"Only enabled"),
"enabled");
207 m_ui->selectPlugin->addItem(tr(
"All plugins"),
"all");
208 m_ui->selectPlugin->addItem(tr(
"Select..."),
"multi");
210 using QStrPair = std::pair<QString, QString>;
211 QVector<QStrPair> tmpList;
214 std::sort(tmpList.begin(), tmpList.end(), [](
const QStrPair &l,
const QStrPair &r) { return (l.first < r.first); } );
216 for (
const QStrPair &p :
asConst(tmpList))
217 m_ui->selectPlugin->addItem(p.first, p.second);
219 if (
m_ui->selectPlugin->count() > 3)
220 m_ui->selectPlugin->insertSeparator(3);
225 return m_ui->comboCategory->itemData(
m_ui->comboCategory->currentIndex()).toString();
230 return m_ui->selectPlugin->itemData(
m_ui->selectPlugin->currentIndex()).toString();
237 m_ui->stackedPages->setCurrentWidget(
m_ui->emptyPage);
238 m_ui->lineEditSearchPattern->setEnabled(
false);
239 m_ui->comboCategory->setEnabled(
false);
240 m_ui->selectPlugin->setEnabled(
false);
241 m_ui->searchButton->setEnabled(
false);
245 m_ui->stackedPages->setCurrentWidget(
m_ui->searchPage);
246 m_ui->lineEditSearchPattern->setEnabled(
true);
247 m_ui->comboCategory->setEnabled(
true);
248 m_ui->selectPlugin->setEnabled(
true);
249 m_ui->searchButton->setEnabled(
true);
255 qDebug(
"Search destruction");
282 m_ui->lineEditSearchPattern->setFocus();
283 m_ui->lineEditSearchPattern->selectAll();
295 m_ui->searchButton->setText(tr(
"Search"));
301 m_ui->lineEditSearchPattern->setFocus();
318 m_ui->searchButton->setText(tr(
"Search"));
325 const QString pattern =
m_ui->lineEditSearchPattern->text().trimmed();
327 if (pattern.isEmpty())
329 QMessageBox::critical(
this, tr(
"Empty search pattern"), tr(
"Please type a search pattern first"));
352 QString tabName = pattern;
353 tabName.replace(QRegularExpression(
"&{1}"),
"&&");
354 m_ui->tabWidget->addTab(newTab, tabName);
355 m_ui->tabWidget->setCurrentWidget(newTab);
359 m_ui->searchButton->setText(tr(
"Stop"));
366 const int tabIndex =
m_ui->tabWidget->indexOf(tab);
367 m_ui->tabWidget->setTabToolTip(tabIndex, tab->statusTip());
384 m_ui->searchButton->setText(tr(
"Search"));
392 m_ui->searchButton->setText(tr(
"Search"));
399 for (
int i = (
m_allTabs.size() - 1); i >= 0; --i)
void showNotificationBalloon(const QString &title, const QString &msg) const
QWidget * currentTabWidget() const
bool isNotificationsEnabled() const
QStringList enabledPlugins() const
void pluginUpdated(const QString &name)
SearchHandler * startSearch(const QString &pattern, const QString &category, const QStringList &usedPlugins)
static QString categoryFullName(const QString &categoryName)
void pluginEnabled(const QString &name, bool enabled)
void pluginInstalled(const QString &name)
QStringList allPlugins() const
void pluginUninstalled(const QString &name)
static SearchPluginManager * instance()
static UIThemeManager * instance()
constexpr std::add_const_t< T > & asConst(T &t) noexcept
QJsonArray getPluginCategories(QStringList categories)