]> git.cworth.org Git - apitrace/commitdiff
Add a custom filter to the event view.
authorZack Rusin <zack@kde.org>
Sat, 24 Sep 2011 21:06:38 +0000 (17:06 -0400)
committerZack Rusin <zack@kde.org>
Sat, 24 Sep 2011 21:06:38 +0000 (17:06 -0400)
Allows one to filter out any custom call. Very useful on large traces
that have e.g. millions of redundant GetCurrentContext and
MakeCurrentContext calls.

gui/apitracefilter.cpp
gui/apitracefilter.h
gui/settingsdialog.cpp
gui/ui/settings.ui

index cfa930d74f7c8752974027350e8867be3ae2d4ac..a908325101958fb343bc4dc2d5c514e85cb48780 100644 (file)
@@ -63,6 +63,10 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow,
             return false;
     }
 
+    if (m_filters & CustomFilter) {
+        return !function.contains(m_customRegexp);
+    }
+
 
     return true;
 }
@@ -102,4 +106,14 @@ QRegExp ApiTraceFilter::filterRegexp() const
     return m_regexp;
 }
 
+void ApiTraceFilter::setCustomFilterRegexp(const QString &str)
+{
+    m_customRegexp = QRegExp(str);
+}
+
+QString ApiTraceFilter::customFilterRegexp() const
+{
+    return m_customRegexp.pattern();
+}
+
 #include "apitracefilter.moc"
index 30c92a1287ff55794892068686d745c7d0155fcc..35f627df431f8a45f0e2647f04ef2c95447cdef9 100644 (file)
@@ -11,11 +11,12 @@ class ApiTraceFilter : public QSortFilterProxyModel
     Q_OBJECT
 public:
     enum FilterOption {
-        NullFilter        =  0,
+        NullFilter        = 0,
         ExtensionsFilter  = 1 << 0,
         ResolutionsFilter = 1 << 1,
         ErrorsQueryFilter = 1 << 2,
         ExtraStateFilter  = 1 << 3,
+        CustomFilter      = 1 << 4,
     };
     Q_DECLARE_FLAGS(FilterOptions, FilterOption)
 public:
@@ -27,6 +28,9 @@ public:
     void setFilterRegexp(const QRegExp &regexp);
     QRegExp filterRegexp() const;
 
+    void setCustomFilterRegexp(const QString &str);
+    QString customFilterRegexp() const;
+
     QModelIndex indexForCall(ApiTraceCall *call) const;
 protected:
     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
@@ -34,6 +38,7 @@ protected:
 private:
     QRegExp m_regexp;
     FilterOptions m_filters;
+    QRegExp m_customRegexp;
 };
 
 #endif
index e3d7864b6ae751cf5368ec8b77427f5e0371367c..c44b10740ec97d9f4e631b4acfd23ad7b27f6970 100644 (file)
@@ -38,6 +38,15 @@ void SettingsDialog::filtersFromModel(const ApiTraceFilter *model)
     functionsBox->setChecked(opts & ApiTraceFilter::ResolutionsFilter);
     errorsBox->setChecked(opts & ApiTraceFilter::ErrorsQueryFilter);
     statesBox->setChecked(opts & ApiTraceFilter::ExtraStateFilter);
+    customBox->setChecked(opts & ApiTraceFilter::CustomFilter);
+    QString customFilter = model->customFilterRegexp();
+    if (!customFilter.isEmpty()) {
+        customEdit->setText(customFilter);
+    } else {
+        //Add a common default
+        QLatin1String str("glXMakeContextCurrent");
+        customEdit->setText(str);
+    }
 
     QRegExp regexp = model->filterRegexp();
     if (regexp.isEmpty()) {
@@ -63,14 +72,22 @@ void SettingsDialog::filtersFromModel(const ApiTraceFilter *model)
 void SettingsDialog::filtersToModel(ApiTraceFilter *model)
 {
     ApiTraceFilter::FilterOptions opts = ApiTraceFilter::NullFilter;
-    if (extensionsBox->isChecked())
+    if (extensionsBox->isChecked()) {
         opts |= ApiTraceFilter::ExtensionsFilter;
-    if (functionsBox->isChecked())
+    }
+    if (functionsBox->isChecked()) {
         opts |= ApiTraceFilter::ResolutionsFilter;
-    if (errorsBox->isChecked())
+    }
+    if (errorsBox->isChecked()) {
         opts |= ApiTraceFilter::ErrorsQueryFilter;
-    if (statesBox->isChecked())
+    }
+    if (statesBox->isChecked()) {
         opts |= ApiTraceFilter::ExtraStateFilter;
+    }
+    if (customBox->isChecked()) {
+        opts |= ApiTraceFilter::CustomFilter;
+        m_filter->setCustomFilterRegexp(customEdit->text());
+    }
     m_filter->setFilterOptions(opts);
     if (showFilterBox->isChecked()) {
         m_filter->setFilterRegexp(QRegExp(showFilterEdit->text()));
@@ -92,6 +109,17 @@ void SettingsDialog::accept()
             return;
         }
     }
+    if (customBox->isChecked()) {
+        QRegExp regexp(customEdit->text());
+        if (!regexp.isValid()) {
+            QMessageBox::warning(
+                this,
+                tr("Invalid Regexp"),
+                tr("The currently set regular expression "
+                   "for custom events is invalid."));
+            return;
+        }
+    }
     filtersToModel(m_filter);
     QDialog::accept();
 }
index 748f4d5fcd9c00fadc8468154da5f222b810accd..1d2da3e9c4dace78a2aaee5cd49d7b4e5b90bc14 100644 (file)
@@ -2,12 +2,15 @@
 <ui version="4.0">
  <class>Settings</class>
  <widget class="QDialog" name="Settings">
+  <property name="enabled">
+   <bool>true</bool>
+  </property>
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>438</width>
-    <height>333</height>
+    <width>571</width>
+    <height>334</height>
    </rect>
   </property>
   <property name="windowTitle">
      <property name="title">
       <string>Hidden Events</string>
      </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0">
-       <widget class="QCheckBox" name="extensionsBox">
-        <property name="text">
-         <string>Extension queries</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QCheckBox" name="functionsBox">
-        <property name="text">
-         <string>Function resolution</string>
-        </property>
-       </widget>
+     <layout class="QVBoxLayout" name="verticalLayout_3">
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QCheckBox" name="extensionsBox">
+          <property name="text">
+           <string>Extension queries</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="functionsBox">
+          <property name="text">
+           <string>Function resolution</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
       </item>
-      <item row="1" column="0">
-       <widget class="QCheckBox" name="errorsBox">
-        <property name="text">
-         <string>Error queries</string>
-        </property>
-       </widget>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <item>
+         <widget class="QCheckBox" name="errorsBox">
+          <property name="text">
+           <string>Error queries</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="statesBox">
+          <property name="text">
+           <string>Extra state queries</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
       </item>
-      <item row="1" column="1">
-       <widget class="QCheckBox" name="statesBox">
-        <property name="text">
-         <string>Extra state queries</string>
-        </property>
-       </widget>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_3">
+        <item>
+         <widget class="QCheckBox" name="customBox">
+          <property name="text">
+           <string>Custom</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLineEdit" name="customEdit">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
       </item>
      </layout>
     </widget>
    <slot>accept()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
+     <x>252</x>
+     <y>329</y>
     </hint>
     <hint type="destinationlabel">
      <x>157</x>
    <slot>reject()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
+     <x>320</x>
+     <y>329</y>
     </hint>
     <hint type="destinationlabel">
      <x>286</x>
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>customBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>customEdit</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>63</x>
+     <y>151</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>107</x>
+     <y>151</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
 </ui>