From: Zack Rusin Date: Wed, 13 Apr 2011 04:41:32 +0000 (-0400) Subject: Implement showing only of events specified by a regexp. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=20e6a8ca8602718c9da406b0109d20095efcfc86;p=apitrace Implement showing only of events specified by a regexp. --- diff --git a/gui/apitracefilter.cpp b/gui/apitracefilter.cpp index 50b854e..388c952 100644 --- a/gui/apitracefilter.cpp +++ b/gui/apitracefilter.cpp @@ -31,8 +31,8 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow, ApiTraceCall *call = static_cast(event); QString function = call->name; - if (!m_text.isEmpty()) { - return function.contains(m_text); + if (!m_regexp.isEmpty() && m_regexp.isValid()) { + return function.contains(m_regexp); } if (m_filters & ResolutionsFilter) { @@ -68,10 +68,10 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow, } -void ApiTraceFilter::setFilterString(const QString &text) +void ApiTraceFilter::setFilterRegexp(const QRegExp ®exp) { - if (text != m_text) { - m_text = text; + if (regexp != m_regexp) { + m_regexp = regexp; invalidate(); } } @@ -103,4 +103,9 @@ QModelIndex ApiTraceFilter::indexForCall(ApiTraceCall *call) const return mapFromSource(index); } +QRegExp ApiTraceFilter::filterRegexp() const +{ + return m_regexp; +} + #include "apitracefilter.moc" diff --git a/gui/apitracefilter.h b/gui/apitracefilter.h index 7ceabe6..217938c 100644 --- a/gui/apitracefilter.h +++ b/gui/apitracefilter.h @@ -1,6 +1,7 @@ #ifndef APITRACEFILTER_H #define APITRACEFILTER_H +#include #include class ApiTraceCall; @@ -23,7 +24,8 @@ public: FilterOptions filterOptions() const; void setFilterOptions(FilterOptions opts); - void setFilterString(const QString &text); + void setFilterRegexp(const QRegExp ®exp); + QRegExp filterRegexp() const; QModelIndex callIndex(int callNum) const; QModelIndex indexForCall(ApiTraceCall *call) const; @@ -31,7 +33,7 @@ protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; private: - QString m_text; + QRegExp m_regexp; FilterOptions m_filters; }; diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index ff51d95..f57ccc8 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -136,11 +136,6 @@ void MainWindow::callItemSelected(const QModelIndex &index) m_ui.stateDock->hide(); } -void MainWindow::filterTrace() -{ - m_proxyModel->setFilterString(m_filterEdit->text()); -} - void MainWindow::replayStart() { QDialog dlg; @@ -415,11 +410,9 @@ void MainWindow::fillStateForFrame() void MainWindow::showSettings() { SettingsDialog dialog; - dialog.setFilterOptions(m_proxyModel->filterOptions()); + dialog.setFilterModel(m_proxyModel); - if (dialog.exec() == QDialog::Accepted) { - m_proxyModel->setFilterOptions(dialog.filterOptions()); - } + dialog.exec(); } void MainWindow::openHelp(const QUrl &url) @@ -494,10 +487,6 @@ void MainWindow::initObjects() m_ui.callView->header()->swapSections(0, 1); m_ui.callView->setColumnWidth(1, 42); - QToolBar *toolBar = addToolBar(tr("Navigation")); - m_filterEdit = new QLineEdit(toolBar); - toolBar->addWidget(m_filterEdit); - m_progressBar = new QProgressBar(); m_progressBar->setRange(0, 0); statusBar()->addPermanentWidget(m_progressBar); @@ -575,8 +564,6 @@ void MainWindow::initConnections() connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)), this, SLOT(callItemSelected(const QModelIndex &))); - connect(m_filterEdit, SIGNAL(returnPressed()), - this, SLOT(filterTrace())); connect(m_ui.surfacesTreeWidget, SIGNAL(customContextMenuRequested(const QPoint &)), diff --git a/gui/mainwindow.h b/gui/mainwindow.h index ae28441..73e3084 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -14,7 +14,6 @@ class ApiTraceModel; class ApiTraceState; class ImageViewer; class JumpWidget; -class QLineEdit; class QModelIndex; class QProgressBar; class QUrl; @@ -38,7 +37,6 @@ private slots: void callItemSelected(const QModelIndex &index); void createTrace(); void openTrace(); - void filterTrace(); void replayStart(); void replayStop(); void replayFinished(const QString &output); @@ -73,7 +71,6 @@ private: ApiTrace *m_trace; ApiTraceModel *m_model; ApiTraceFilter *m_proxyModel; - QLineEdit *m_filterEdit; QProgressBar *m_progressBar; diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp index eab63dd..e3d7864 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -1,37 +1,120 @@ #include "settingsdialog.h" +#include + SettingsDialog::SettingsDialog(QWidget *parent) - : QDialog(parent) + : QDialog(parent), + m_filter(0) { setupUi(this); + + m_showFilters.insert( + tr("Draw events"), + QRegExp("glDraw|glVertex|glBegin|glEnd")); + m_showFilters.insert( + tr("Texture events"), + QRegExp("glTex|glBindTex|glBegin|glEnd")); + + QMap::const_iterator itr; + for (itr = m_showFilters.constBegin(); + itr != m_showFilters.constEnd(); ++itr) { + showFilterCB->addItem(itr.key(), itr.value()); + } + showFilterCB->addItem(tr("Custom"), QRegExp()); + + connect(showFilterCB, SIGNAL(currentIndexChanged(const QString &)), + SLOT(changeRegexp(const QString&))); + connect(showFilterEdit, SIGNAL(textEdited(const QString &)), + SLOT(regexpChanged(const QString&))); + + showFilterCB->setCurrentIndex(0); + showFilterEdit->setText(m_showFilters.constBegin().value().pattern()); } -void SettingsDialog::accept() +void SettingsDialog::filtersFromModel(const ApiTraceFilter *model) { - m_filterOptions = ApiTraceFilter::NullFilter; + ApiTraceFilter::FilterOptions opts = model->filterOptions(); + extensionsBox->setChecked(opts & ApiTraceFilter::ExtensionsFilter); + functionsBox->setChecked(opts & ApiTraceFilter::ResolutionsFilter); + errorsBox->setChecked(opts & ApiTraceFilter::ErrorsQueryFilter); + statesBox->setChecked(opts & ApiTraceFilter::ExtraStateFilter); + + QRegExp regexp = model->filterRegexp(); + if (regexp.isEmpty()) { + showFilterBox->setChecked(false); + } else { + showFilterBox->setChecked(true); + QMap::const_iterator itr; + int i = 0; + for (itr = m_showFilters.constBegin(); + itr != m_showFilters.constEnd(); ++itr, ++i) { + if (itr.value() == regexp) { + showFilterCB->setCurrentIndex(i); + showFilterEdit->setText(itr.value().pattern()); + return; + } + } + /* custom filter */ + showFilterCB->setCurrentIndex(m_showFilters.count()); + showFilterEdit->setText(regexp.pattern()); + } +} + +void SettingsDialog::filtersToModel(ApiTraceFilter *model) +{ + ApiTraceFilter::FilterOptions opts = ApiTraceFilter::NullFilter; if (extensionsBox->isChecked()) - m_filterOptions |= ApiTraceFilter::ExtensionsFilter; + opts |= ApiTraceFilter::ExtensionsFilter; if (functionsBox->isChecked()) - m_filterOptions |= ApiTraceFilter::ResolutionsFilter; + opts |= ApiTraceFilter::ResolutionsFilter; if (errorsBox->isChecked()) - m_filterOptions |= ApiTraceFilter::ErrorsQueryFilter; + opts |= ApiTraceFilter::ErrorsQueryFilter; if (statesBox->isChecked()) - m_filterOptions |= ApiTraceFilter::ExtraStateFilter; + opts |= ApiTraceFilter::ExtraStateFilter; + m_filter->setFilterOptions(opts); + if (showFilterBox->isChecked()) { + m_filter->setFilterRegexp(QRegExp(showFilterEdit->text())); + } else { + m_filter->setFilterRegexp(QRegExp()); + } +} + +void SettingsDialog::accept() +{ + if (showFilterBox->isChecked()) { + QRegExp regexp(showFilterEdit->text()); + if (!regexp.isValid()) { + QMessageBox::warning( + this, + tr("Invalid Regexp"), + tr("The currently set regular expression " + "for filtering events is invalid.")); + return; + } + } + filtersToModel(m_filter); QDialog::accept(); } -void SettingsDialog::setFilterOptions(ApiTraceFilter::FilterOptions opts) +void SettingsDialog::changeRegexp(const QString &name) +{ + showFilterEdit->setText(m_showFilters[name].pattern()); +} + +void SettingsDialog::regexpChanged(const QString &pattern) { - m_filterOptions = opts; - extensionsBox->setChecked(m_filterOptions & ApiTraceFilter::ExtensionsFilter); - functionsBox->setChecked(m_filterOptions & ApiTraceFilter::ResolutionsFilter); - errorsBox->setChecked(m_filterOptions & ApiTraceFilter::ErrorsQueryFilter); - statesBox->setChecked(m_filterOptions & ApiTraceFilter::ExtraStateFilter); + int customIndex = m_showFilters.count(); + if (showFilterCB->currentIndex() != customIndex) { + showFilterCB->blockSignals(true); + showFilterCB->setCurrentIndex(customIndex); + showFilterCB->blockSignals(false); + } } -ApiTraceFilter::FilterOptions SettingsDialog::filterOptions() const +void SettingsDialog::setFilterModel(ApiTraceFilter *filter) { - return m_filterOptions; + m_filter = filter; + filtersFromModel(m_filter); } #include "settingsdialog.moc" diff --git a/gui/settingsdialog.h b/gui/settingsdialog.h index 6c82b40..85cb9bb 100644 --- a/gui/settingsdialog.h +++ b/gui/settingsdialog.h @@ -4,6 +4,7 @@ #include "apitracefilter.h" #include "ui_settings.h" #include +#include class SettingsDialog : public QDialog, public Ui_Settings @@ -13,11 +14,17 @@ public: SettingsDialog(QWidget *parent = 0); void accept(); - void setFilterOptions(ApiTraceFilter::FilterOptions opts); - ApiTraceFilter::FilterOptions filterOptions() const; + void setFilterModel(ApiTraceFilter *filter); +private slots: + void changeRegexp(const QString &name); + void regexpChanged(const QString &pattern); private: - ApiTraceFilter::FilterOptions m_filterOptions; + void filtersFromModel(const ApiTraceFilter *model); + void filtersToModel(ApiTraceFilter *model); +private: + QMap m_showFilters; + ApiTraceFilter *m_filter; }; #endif diff --git a/gui/ui/settings.ui b/gui/ui/settings.ui index 1e84070..748f4d5 100644 --- a/gui/ui/settings.ui +++ b/gui/ui/settings.ui @@ -6,8 +6,8 @@ 0 0 - 316 - 128 + 438 + 333 @@ -16,8 +16,14 @@ + + + 0 + 0 + + - Filtered Events + Hidden Events @@ -51,6 +57,37 @@ + + + + Only show the following events + + + true + + + false + + + + + + + + + + + + You can specify one of the predefined categories or create a custom regexp to show only a specific set of events. + + + true + + + + + +