]> git.cworth.org Git - apitrace/blobdiff - gui/apitracefilter.cpp
d3dretrace: Dump D3D8 images too.
[apitrace] / gui / apitracefilter.cpp
index 24c56bf58876591b518811a9f583988f9beb4082..a908325101958fb343bc4dc2d5c514e85cb48780 100644 (file)
@@ -1,11 +1,14 @@
 #include "apitracefilter.h"
 
 #include "apitracecall.h"
+#include "apitracemodel.h"
 
 #include <QDebug>
 
 ApiTraceFilter::ApiTraceFilter(QObject *parent)
-    : QSortFilterProxyModel()
+    : QSortFilterProxyModel(),
+      m_filters(ExtensionsFilter | ResolutionsFilter |
+                ErrorsQueryFilter | ExtraStateFilter)
 {
 }
 
@@ -13,41 +16,104 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow,
                                       const QModelIndex &sourceParent) const
 {
     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
-    QVariant varientData = sourceModel()->data(index0);
-    ApiTraceCall *call = varientData.value<ApiTraceCall*>();
+    QVariant varientData = sourceModel()->data(index0, ApiTraceModel::EventRole);
+    ApiTraceEvent *event = varientData.value<ApiTraceEvent*>();
 
-    if (!call) {
-        ApiTraceFrame *frame = varientData.value<ApiTraceFrame*>();
-        return frame != 0;
+    Q_ASSERT(event);
+    if (!event)
+        return false;
+
+    //we don't filter frames
+    if (event->type() == ApiTraceEvent::Frame) {
+        return true;
     }
 
-    QString function = call->name;
+    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);
     }
 
-    //XXX make it configurable
-    if (function.contains(QLatin1String("glXGetProcAddress")))
-        return false;
-    if (function.contains(QLatin1String("wglGetProcAddress")))
-        return false;
+    if (m_filters & ResolutionsFilter) {
+        if (function.contains(QLatin1String("glXGetProcAddress")))
+            return false;
+        if (function.contains(QLatin1String("wglGetProcAddress")))
+            return false;
+    }
+
+    if (m_filters & ErrorsQueryFilter) {
+        if (function.contains(QLatin1String("glGetError")))
+            return false;
+    }
+
+    if (m_filters & ExtraStateFilter) {
+        if (function.contains(QLatin1String("glXGetCurrentDisplay")))
+            return false;
+        if (function.contains(QLatin1String("wglDescribePixelFormat")))
+            return false;
+    }
+
+    if (m_filters & ExtensionsFilter) {
+        if (function.contains(QLatin1String("glXGetClientString")))
+            return false;
+        if (function.contains(QLatin1String("glXQueryExtensionsString")))
+            return false;
+        if (function.contains(QLatin1String("glGetString")))
+            return false;
+    }
+
+    if (m_filters & CustomFilter) {
+        return !function.contains(m_customRegexp);
+    }
 
-    QString fullText = call->filterText();
-    if (function.contains(QLatin1String("glGetString")) &&
-        fullText.contains(QLatin1String("GL_EXTENSIONS")))
-        return false;
 
     return true;
 }
 
 
-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();
     }
 }
 
+ApiTraceFilter::FilterOptions ApiTraceFilter::filterOptions() const
+{
+    return m_filters;
+}
+
+void ApiTraceFilter::setFilterOptions(ApiTraceFilter::FilterOptions opts)
+{
+    if (opts != m_filters) {
+        m_filters = opts;
+        invalidate();
+    }
+}
+
+
+QModelIndex ApiTraceFilter::indexForCall(ApiTraceCall *call) const
+{
+    ApiTraceModel *model = static_cast<ApiTraceModel *>(sourceModel());
+    QModelIndex index = model->indexForCall(call);
+    return mapFromSource(index);
+}
+
+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"