diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index 61c6a3d32..39fd386ee 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -1429,6 +1429,16 @@ void Preferences::setSearchTabHeaderState(const QByteArray &state) setValue("SearchTab/qt5/HeaderState", state); } +bool Preferences::getRegexAsFilteringPatternForSearchJob() const +{ + return value("SearchTab/UseRegexAsFilteringPattern", false).toBool(); +} + +void Preferences::setRegexAsFilteringPatternForSearchJob(const bool checked) +{ + setValue("SearchTab/UseRegexAsFilteringPattern", checked); +} + QStringList Preferences::getSearchEngDisabled() const { return value("SearchEngines/disabledEngines").toStringList(); diff --git a/src/base/preferences.h b/src/base/preferences.h index 969c38553..b49765fc7 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -342,6 +342,8 @@ public: void setRssMainSplitterState(const QByteArray &state); QByteArray getSearchTabHeaderState() const; void setSearchTabHeaderState(const QByteArray &state); + bool getRegexAsFilteringPatternForSearchJob() const; + void setRegexAsFilteringPatternForSearchJob(bool checked); QStringList getSearchEngDisabled() const; void setSearchEngDisabled(const QStringList &engines); QString getTorImportLastContentDir() const; diff --git a/src/gui/search/searchjobwidget.cpp b/src/gui/search/searchjobwidget.cpp index 8be2a611d..3974685cc 100644 --- a/src/gui/search/searchjobwidget.cpp +++ b/src/gui/search/searchjobwidget.cpp @@ -131,6 +131,8 @@ SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, QWidget *parent) m_lineEditSearchResultsFilter = new LineEdit(this); m_lineEditSearchResultsFilter->setFixedWidth(Utils::Gui::scaledSize(this, 170)); m_lineEditSearchResultsFilter->setPlaceholderText(tr("Filter search results...")); + m_lineEditSearchResultsFilter->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_lineEditSearchResultsFilter, &QWidget::customContextMenuRequested, this, &SearchJobWidget::showFilterContextMenu); m_ui->horizontalLayout->insertWidget(0, m_lineEditSearchResultsFilter); connect(m_lineEditSearchResultsFilter, &LineEdit::textChanged, this, &SearchJobWidget::filterSearchResults); @@ -342,10 +344,29 @@ void SearchJobWidget::fillFilterComboBoxes() void SearchJobWidget::filterSearchResults(const QString &name) { - m_proxyModel->setFilterRegExp(QRegExp(name, Qt::CaseInsensitive)); + const QRegExp::PatternSyntax patternSyntax = Preferences::instance()->getRegexAsFilteringPatternForSearchJob() + ? QRegExp::RegExp : QRegExp::WildcardUnix; + m_proxyModel->setFilterRegExp(QRegExp(name, Qt::CaseInsensitive, patternSyntax)); updateResultsCount(); } +void SearchJobWidget::showFilterContextMenu(const QPoint &) +{ + const Preferences *pref = Preferences::instance(); + + QMenu *menu = m_lineEditSearchResultsFilter->createStandardContextMenu(); + menu->addSeparator(); + QAction *useRegexAct = new QAction(tr("Use regular expressions"), menu); + useRegexAct->setCheckable(true); + useRegexAct->setChecked(pref->getRegexAsFilteringPatternForSearchJob()); + menu->addAction(useRegexAct); + + connect(useRegexAct, &QAction::toggled, pref, &Preferences::setRegexAsFilteringPatternForSearchJob); + connect(useRegexAct, &QAction::toggled, this, [this]() { filterSearchResults(m_lineEditSearchResultsFilter->text()); }); + + menu->exec(QCursor::pos()); +} + QString SearchJobWidget::statusText(SearchJobWidget::Status st) { switch (st) { diff --git a/src/gui/search/searchjobwidget.h b/src/gui/search/searchjobwidget.h index 6e4872f1e..f31167ca7 100644 --- a/src/gui/search/searchjobwidget.h +++ b/src/gui/search/searchjobwidget.h @@ -96,6 +96,7 @@ private: void saveSettings() const; void updateFilter(); void filterSearchResults(const QString &name); + void showFilterContextMenu(const QPoint &); void displayToggleColumnsMenu(const QPoint&); void onItemDoubleClicked(const QModelIndex &index); void searchFinished(bool cancelled);