]> git.cworth.org Git - apitrace/commitdiff
Implement showing only of events specified by a regexp.
authorZack Rusin <zack@kde.org>
Wed, 13 Apr 2011 04:41:32 +0000 (00:41 -0400)
committerZack Rusin <zack@kde.org>
Wed, 13 Apr 2011 04:41:32 +0000 (00:41 -0400)
gui/apitracefilter.cpp
gui/apitracefilter.h
gui/mainwindow.cpp
gui/mainwindow.h
gui/settingsdialog.cpp
gui/settingsdialog.h
gui/ui/settings.ui

index 50b854e57336548a9c90e33457d79b11810a4caa..388c9522fec7a55702e38712db0474ed2eb0f3ba 100644 (file)
@@ -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"
index 7ceabe6fb1b26ebfbd114d42d061550fe3ce73a3..217938c82a0fa2775175317afff428c58bca6a49 100644 (file)
@@ -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;
 };
 
index ff51d956be5150c6aed258393ce2fc4bff4a3854..f57ccc810076c810394c4541c0db80da300b0b59 100644 (file)
@@ -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 &)),
index ae284410d5fa9ed6a525349af435a5f8738063ed..73e3084940dd9796bd7015b70d60aec058faac16 100644 (file)
@@ -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;
 
index eab63ddaddc46fd1fa49db2bfe157cab00297202..e3d7864b6ae751cf5368ec8b77427f5e0371367c 100644 (file)
 #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"
index 6c82b4082db93ce9c08244635d397aa3e2182c19..85cb9bbc8f6f2fc5a1abadb1b4861a17266490ab 100644 (file)
@@ -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
index 1e8407075787fa3935c82be90f22d2ae0cc14042..748f4d5fcd9c00fadc8468154da5f222b810accd 100644 (file)
@@ -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">
   <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">
      </layout>
     </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">