From e34b41934d68430c58107a700e3730595e88075d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 15 May 2019 13:56:03 +0200 Subject: [PATCH] Output panes: Respect filter options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The UI elements for case sensitivity and regexp behavior had not been doing anything until now. Change-Id: Ie210103984fda64d4249c56f9a5b21200132108f Reviewed-by: André Hartmann --- src/plugins/coreplugin/ioutputpane.h | 4 ++- .../coreplugin/messageoutputwindow.cpp | 2 +- src/plugins/coreplugin/outputpanemanager.cpp | 4 ++- src/plugins/coreplugin/outputwindow.cpp | 33 ++++++------------- src/plugins/coreplugin/outputwindow.h | 6 +--- src/plugins/projectexplorer/appoutputpane.cpp | 9 +++-- .../projectexplorer/compileoutputwindow.cpp | 3 +- src/plugins/projectexplorer/taskmodel.cpp | 29 ++++++++++++++-- src/plugins/projectexplorer/taskmodel.h | 8 +++++ src/plugins/projectexplorer/taskwindow.cpp | 2 +- 10 files changed, 61 insertions(+), 39 deletions(-) diff --git a/src/plugins/coreplugin/ioutputpane.h b/src/plugins/coreplugin/ioutputpane.h index 40c6401b379..d219e2aefff 100644 --- a/src/plugins/coreplugin/ioutputpane.h +++ b/src/plugins/coreplugin/ioutputpane.h @@ -99,6 +99,8 @@ signals: protected: void setupFilterUi(const QString &historyKey); QString filterText() const; + bool filterUsesRegexp() const { return m_filterRegexp; } + Qt::CaseSensitivity filterCaseSensitivity() const { return m_filterCaseSensitivity; } void setFilteringEnabled(bool enable); QWidget *filterWidget() const { return m_filterOutputLineEdit; } @@ -119,7 +121,7 @@ private: QAction *m_filterActionCaseSensitive = nullptr; Utils::FancyLineEdit *m_filterOutputLineEdit = nullptr; bool m_filterRegexp = false; - bool m_filterCaseSensitive = false; + Qt::CaseSensitivity m_filterCaseSensitivity = Qt::CaseInsensitive; }; } // namespace Core diff --git a/src/plugins/coreplugin/messageoutputwindow.cpp b/src/plugins/coreplugin/messageoutputwindow.cpp index 70bef5dc114..60092829537 100644 --- a/src/plugins/coreplugin/messageoutputwindow.cpp +++ b/src/plugins/coreplugin/messageoutputwindow.cpp @@ -146,7 +146,7 @@ bool MessageOutputWindow::canNavigate() const void MessageOutputWindow::updateFilter() { - m_widget->setFilterText(filterText()); + m_widget->updateFilterProperties(filterText(), filterCaseSensitivity(), filterUsesRegexp()); } } // namespace Internal diff --git a/src/plugins/coreplugin/outputpanemanager.cpp b/src/plugins/coreplugin/outputpanemanager.cpp index 5bee2fb5f75..951fed419b0 100644 --- a/src/plugins/coreplugin/outputpanemanager.cpp +++ b/src/plugins/coreplugin/outputpanemanager.cpp @@ -195,6 +195,7 @@ void IOutputPane::filterOutputButtonClicked() void IOutputPane::setRegularExpressions(bool regularExpressions) { m_filterRegexp = regularExpressions; + updateFilter(); } Id IOutputPane::filterRegexpActionId() const @@ -209,7 +210,8 @@ Id IOutputPane::filterCaseSensitivityActionId() const void IOutputPane::setCaseSensitive(bool caseSensitive) { - m_filterCaseSensitive = caseSensitive; + m_filterCaseSensitivity = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; + updateFilter(); } namespace Internal { diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 2759777863f..2b5de1b2b6f 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -284,15 +284,16 @@ void OutputWindow::setHighlightTextColor(const QColor &textColor) d->highlightTextColor = textColor; } -QString OutputWindow::filterText() const -{ - return d->filterText; -} - -void OutputWindow::setFilterText(const QString &filterText) +void OutputWindow::updateFilterProperties(const QString &filterText, + Qt::CaseSensitivity caseSensitivity, bool isRegexp) { + FilterModeFlags flags; + flags.setFlag(FilterModeFlag::CaseSensitive, caseSensitivity == Qt::CaseSensitive) + .setFlag(FilterModeFlag::RegExp, isRegexp); + if (d->filterMode == flags && d->filterText == filterText) + return; + d->lastFilteredBlock = {}; if (d->filterText != filterText) { - d->lastFilteredBlock = {}; const bool filterTextWasEmpty = d->filterText.isEmpty(); d->filterText = filterText; @@ -313,23 +314,9 @@ void OutputWindow::setFilterText(const QString &filterText) setPalette(pal); setReadOnly(true); } - - filterNewContent(); - } -} - -OutputWindow::FilterModeFlags OutputWindow::filterMode() const -{ - return d->filterMode; -} - -void OutputWindow::setFilterMode(OutputWindow::FilterModeFlag filterMode, bool enabled) -{ - if (d->filterMode.testFlag(filterMode) != enabled) { - d->filterMode.setFlag(filterMode, enabled); - d->lastFilteredBlock = {}; - filterNewContent(); } + d->filterMode = flags; + filterNewContent(); } void OutputWindow::filterNewContent() diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h index 99c49a4cc18..03760cbce3e 100644 --- a/src/plugins/coreplugin/outputwindow.h +++ b/src/plugins/coreplugin/outputwindow.h @@ -79,11 +79,7 @@ public: void setHighlightBgColor(const QColor &bgColor); void setHighlightTextColor(const QColor &textColor); - QString filterText() const; - void setFilterText(const QString &filterText); - - FilterModeFlags filterMode() const; - void setFilterMode(FilterModeFlag filterMode, bool enabled); + void updateFilterProperties(const QString &filterText, Qt::CaseSensitivity caseSensitivity, bool regexp); signals: void wheelZoom(); diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index c9d88ec5132..948780aabcb 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -372,8 +372,10 @@ void AppOutputPane::setFocus() void AppOutputPane::updateFilter() { const int index = currentIndex(); - if (index != -1) - m_runControlTabs.at(index).window->setFilterText(filterText()); + if (index != -1) { + m_runControlTabs.at(index).window->updateFilterProperties( + filterText(), filterCaseSensitivity(), filterUsesRegexp()); + } } void AppOutputPane::createNewOutputWindow(RunControl *rc) @@ -703,7 +705,8 @@ void AppOutputPane::tabChanged(int i) const int index = indexOf(m_tabWidget->widget(i)); if (i != -1 && index != -1) { const RunControlTab &controlTab = m_runControlTabs[index]; - controlTab.window->setFilterText(filterText()); + controlTab.window->updateFilterProperties(filterText(), filterCaseSensitivity(), + filterUsesRegexp()); enableButtons(controlTab.runControl); } else { enableDefaultButtons(); diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index c1f1d86ca73..3d19bd9514a 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -356,7 +356,8 @@ void CompileOutputWindow::setSettings(const CompileOutputSettings &settings) void CompileOutputWindow::updateFilter() { - m_outputWindow->setFilterText(filterText()); + m_outputWindow->updateFilterProperties(filterText(), filterCaseSensitivity(), + filterUsesRegexp()); } void CompileOutputWindow::loadSettings() diff --git a/src/plugins/projectexplorer/taskmodel.cpp b/src/plugins/projectexplorer/taskmodel.cpp index c3fac880e21..8fcc48e7378 100644 --- a/src/plugins/projectexplorer/taskmodel.cpp +++ b/src/plugins/projectexplorer/taskmodel.cpp @@ -341,6 +341,25 @@ void TaskFilterModel::setFilterIncludesWarnings(bool b) invalidateFilter(); } +void TaskFilterModel::updateFilterProperties(const QString &filterText, + Qt::CaseSensitivity caseSensitivity, bool isRegexp) +{ + if (filterText == m_filterText && m_filterCaseSensitivity == caseSensitivity + && m_filterStringIsRegexp == isRegexp) { + return; + } + m_filterText = filterText; + m_filterCaseSensitivity = caseSensitivity; + m_filterStringIsRegexp = isRegexp; + if (m_filterStringIsRegexp) { + m_filterRegexp.setPattern(m_filterText); + m_filterRegexp.setPatternOptions(m_filterCaseSensitivity == Qt::CaseInsensitive + ? QRegularExpression::CaseInsensitiveOption + : QRegularExpression::NoPatternOption); + } + invalidateFilter(); +} + bool TaskFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { Q_UNUSED(source_parent); @@ -365,9 +384,13 @@ bool TaskFilterModel::filterAcceptsTask(const Task &task) const if (accept && m_categoryIds.contains(task.category)) accept = false; - if (accept && !filterRegExp().isEmpty() && !task.file.toString().contains(filterRegExp()) - && !task.description.contains(filterRegExp())) { - accept = false; + if (accept && !m_filterText.isEmpty()) { + const auto accepts = [this](const QString &s) { + return m_filterStringIsRegexp ? m_filterRegexp.isValid() && s.contains(m_filterRegexp) + : s.contains(m_filterText, m_filterCaseSensitivity); + }; + if (!accepts(task.file.toString()) && !accepts(task.description)) + accept = false; } return accept; diff --git a/src/plugins/projectexplorer/taskmodel.h b/src/plugins/projectexplorer/taskmodel.h index f48e66d5d37..b1044a32347 100644 --- a/src/plugins/projectexplorer/taskmodel.h +++ b/src/plugins/projectexplorer/taskmodel.h @@ -28,6 +28,7 @@ #include #include +#include #include "task.h" @@ -143,6 +144,9 @@ public: bool hasFile(const QModelIndex &index) const { return taskModel()->hasFile(mapToSource(index)); } + void updateFilterProperties(const QString &filterText, Qt::CaseSensitivity caseSensitivity, + bool isRegex); + private: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; bool filterAcceptsTask(const Task &task) const; @@ -151,7 +155,11 @@ private: bool m_includeUnknowns; bool m_includeWarnings; bool m_includeErrors; + bool m_filterStringIsRegexp = false; + Qt::CaseSensitivity m_filterCaseSensitivity = Qt::CaseInsensitive; QList m_categoryIds; + QString m_filterText; + QRegularExpression m_filterRegexp; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 8f8e96cfb70..7a98d0fd33e 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -669,7 +669,7 @@ void TaskWindow::goToPrev() void TaskWindow::updateFilter() { - d->m_filter->setFilterRegExp(filterText()); + d->m_filter->updateFilterProperties(filterText(), filterCaseSensitivity(), filterUsesRegexp()); } bool TaskWindow::canNavigate() const