summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gui/apitracefilter.cpp15
-rw-r--r--gui/apitracefilter.h6
-rw-r--r--gui/mainwindow.cpp17
-rw-r--r--gui/mainwindow.h3
-rw-r--r--gui/settingsdialog.cpp113
-rw-r--r--gui/settingsdialog.h13
-rw-r--r--gui/ui/settings.ui43
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 &regexp)
{
- 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 &regexp);
+ 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>