add_executable(qapitrace ${qapitrace_SRCS} ${qapitrace_UIS_H})
-target_link_libraries(qapitrace trace ${QT_QTCORE_LIBRARIES} ${QT_QTGUI_LIBRARIES} )
+target_link_libraries(qapitrace trace ${QT_QTCORE_LIBRARIES} ${QT_QTGUI_LIBRARIES} ${QT_QTWEBKIT_LIBRARIES})
########### install files ###############
#include <QDebug>
#include <QPainter>
#include <QStaticText>
+#include <QStyle>
ApiCallDelegate::ApiCallDelegate(QWidget *parent)
: QStyledItemDelegate(parent)
void ApiCallDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
- ApiTraceCall *call = static_cast<ApiTraceCall*>(index.internalPointer());
+ ApiTraceCall *call = index.data().value<ApiTraceCall*>();
if (call) {
QStaticText text = call->staticText();
//text.setTextWidth(option.rect.width());
+ QStyledItemDelegate::paint(painter, option, index);
painter->drawStaticText(option.rect.topLeft(), text);
} else{
QStyledItemDelegate::paint(painter, option, index);
QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
- ApiTraceCall *call = static_cast<ApiTraceCall*>(index.internalPointer());
+ ApiTraceCall *call = index.data().value<ApiTraceCall*>();
if (call) {
QStaticText text = call->staticText();
//text.setTextWidth(option.rect.width());
mutable QString m_richText;
mutable QStaticText m_staticText;
};
+Q_DECLARE_METATYPE(ApiTraceCall);
+Q_DECLARE_METATYPE(ApiTraceCall*);
#endif
#include "apitracecall.h"
+#include <QDebug>
+
ApiTraceFilter::ApiTraceFilter(QObject *parent )
: QSortFilterProxyModel()
{
const QModelIndex &sourceParent) const
{
QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
- QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent);
- QModelIndex index2 = sourceModel()->index(sourceRow, 2, sourceParent);
- QString function = sourceModel()->data(index0).toString();
- QString arguments = sourceModel()->data(index1).toString();
+ QVariant varientData = sourceModel()->data(index0);
+ ApiTraceCall *call = varientData.value<ApiTraceCall*>();
+
+ if (!call)
+ return false;
+
+ QString function = call->name;
//XXX make it configurable
if (function.contains(QLatin1String("glXGetProcAddress")))
if (function.contains(QLatin1String("wglGetProcAddress")))
return false;
+ QString fullText = call->richText();
if (function.contains(QLatin1String("glGetString")) &&
- arguments.contains(QLatin1String("GL_EXTENSIONS")))
+ fullText.contains(QLatin1String("GL_EXTENSIONS")))
return false;
return true;
#include <QSortFilterProxyModel>
-//! [0]
class ApiTraceFilter : public QSortFilterProxyModel
{
Q_OBJECT
switch (index.column()) {
case 0: {
- return item->richText();
+ return QVariant::fromValue(item);
}
default:
return QVariant();
#include "mainwindow.h"
+#include "apitracecall.h"
#include "apicalldelegate.h"
#include "apitracemodel.h"
#include "apitracefilter.h"
#include <QDebug>
#include <QDir>
#include <QFileDialog>
+#include <QWebView>
MainWindow::MainWindow()
m_model = new ApiTraceModel();
m_proxyModel = new ApiTraceFilter();
m_proxyModel->setSourceModel(m_model);
- m_ui.callView->setModel(m_model);
+ m_ui.callView->setModel(m_proxyModel);
m_ui.callView->setItemDelegate(new ApiCallDelegate);
for (int column = 0; column < m_model->columnCount(); ++column)
m_ui.callView->resizeColumnToContents(column);
+ m_ui.detailsDock->hide();
+
connect(m_ui.actionOpen, SIGNAL(triggered()),
this, SLOT(openTrace()));
+
+ connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
+ this, SLOT(callItemSelected(const QModelIndex &)));
}
void MainWindow::openTrace()
m_model->loadTraceFile(fileName);
}
+void MainWindow::callItemSelected(const QModelIndex &index)
+{
+ ApiTraceCall *call = index.data().value<ApiTraceCall*>();
+ if (call) {
+ m_ui.detailsWebView->setHtml(call->richText());
+ m_ui.detailsDock->show();
+ } else {
+ m_ui.detailsDock->hide();
+ }
+}
+
#include "mainwindow.moc"
#include "ui_mainwindow.h"
-#include <QtGui/QMainWindow>
+#include <QMainWindow>
+
class ApiTraceModel;
class ApiTraceFilter;
+class QModelIndex;
class MainWindow : public QMainWindow
{
void loadTrace(const QString &fileName);
private slots:
+ void callItemSelected(const QModelIndex &index);
void openTrace();
private:
<rect>
<x>0</x>
<y>0</y>
- <width>799</width>
- <height>590</height>
+ <width>760</width>
+ <height>422</height>
</rect>
</property>
<property name="windowTitle">
<rect>
<x>0</x>
<y>0</y>
- <width>799</width>
+ <width>760</width>
<height>21</height>
</rect>
</property>
<addaction name="menuFile"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
+ <widget class="QDockWidget" name="detailsDock">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="floating">
+ <bool>false</bool>
+ </property>
+ <property name="windowTitle">
+ <string>Call Details</string>
+ </property>
+ <attribute name="dockWidgetArea">
+ <number>8</number>
+ </attribute>
+ <widget class="QWidget" name="dockWidgetContents">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QWebView" name="detailsWebView">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="url">
+ <url>
+ <string>about:blank</string>
+ </url>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
<action name="actionExit">
<property name="text">
<string>Exit</string>
</property>
</action>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>QWebView</class>
+ <extends>QWidget</extends>
+ <header>QtWebKit/QWebView</header>
+ </customwidget>
+ </customwidgets>
<resources/>
<connections/>
</ui>