diff options
-rw-r--r-- | gui/apitracefilter.cpp | 15 | ||||
-rw-r--r-- | gui/apitracefilter.h | 6 | ||||
-rw-r--r-- | gui/mainwindow.cpp | 17 | ||||
-rw-r--r-- | gui/mainwindow.h | 3 | ||||
-rw-r--r-- | gui/settingsdialog.cpp | 113 | ||||
-rw-r--r-- | gui/settingsdialog.h | 13 | ||||
-rw-r--r-- | gui/ui/settings.ui | 43 |
7 files changed, 164 insertions, 46 deletions
diff --git a/gui/apitracefilter.cpp b/gui/apitracefilter.cpp index 50b854e5..388c9522 100644 --- a/gui/apitracefilter.cpp +++ b/gui/apitracefilter.cpp @@ -31,8 +31,8 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow, ApiTraceCall *call = static_cast<ApiTraceCall*>(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 7ceabe6f..217938c8 100644 --- a/gui/apitracefilter.h +++ b/gui/apitracefilter.h @@ -1,6 +1,7 @@ #ifndef APITRACEFILTER_H #define APITRACEFILTER_H +#include <QRegExp> #include <QSortFilterProxyModel> 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 ff51d956..f57ccc81 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 ae284410..73e30849 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 eab63dda..e3d7864b 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -1,37 +1,120 @@ #include "settingsdialog.h" +#include <QMessageBox> + 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<QString, QRegExp>::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<QString, QRegExp>::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 6c82b408..85cb9bbc 100644 --- a/gui/settingsdialog.h +++ b/gui/settingsdialog.h @@ -4,6 +4,7 @@ #include "apitracefilter.h" #include "ui_settings.h" #include <QDialog> +#include <QRegExp> 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<QString, QRegExp> m_showFilters; + ApiTraceFilter *m_filter; }; #endif diff --git a/gui/ui/settings.ui b/gui/ui/settings.ui index 1e840707..748f4d5f 100644 --- a/gui/ui/settings.ui +++ b/gui/ui/settings.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>316</width> - <height>128</height> + <width>438</width> + <height>333</height> </rect> </property> <property name="windowTitle"> @@ -16,8 +16,14 @@ <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="groupBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="title"> - <string>Filtered Events</string> + <string>Hidden Events</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> @@ -52,6 +58,37 @@ </widget> </item> <item> + <widget class="QGroupBox" name="showFilterBox"> + <property name="title"> + <string>Only show the following events</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QComboBox" name="showFilterCB"/> + </item> + <item> + <widget class="QLineEdit" name="showFilterEdit"/> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>You can specify one of the predefined categories or create a custom regexp to show only a specific set of events.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> |