]> git.cworth.org Git - apitrace/commitdiff
Cleanup the event model code.
authorZack Rusin <zack@kde.org>
Sat, 2 Apr 2011 05:34:04 +0000 (01:34 -0400)
committerZack Rusin <zack@kde.org>
Sat, 2 Apr 2011 05:34:04 +0000 (01:34 -0400)
now we show a marker next to frames which have cached state

gui/apicalldelegate.cpp
gui/apicalldelegate.h
gui/apitracefilter.cpp
gui/apitracemodel.cpp
gui/apitracemodel.h
gui/mainwindow.cpp

index 5376c0dcdb3d266a5964ffafb230b0c252945ae0..4eb542be2171bce1c410da3397fb8eb7592356c1 100644 (file)
@@ -1,14 +1,17 @@
 #include "apicalldelegate.h"
 
 #include "apitracecall.h"
+#include "apitracemodel.h"
 
+#include <QApplication>
 #include <QDebug>
 #include <QPainter>
 #include <QStaticText>
 #include <QStyle>
 
 ApiCallDelegate::ApiCallDelegate(QWidget *parent)
-    : QStyledItemDelegate(parent)
+    : QStyledItemDelegate(parent),
+      m_stateEmblem(":/resources/dialog-information.png")
 {
 }
 
@@ -16,40 +19,42 @@ void ApiCallDelegate::paint(QPainter *painter,
                             const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
 {
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
-        QStaticText text = call->staticText();
+    QVariant var = index.data(ApiTraceModel::EventRole);
+    ApiTraceEvent *event = var.value<ApiTraceEvent*>();
+
+    Q_ASSERT(index.column() == 0);
+
+    if (event) {
+        QPoint offset;
+        QStaticText text = event->staticText();
         //text.setTextWidth(option.rect.width());
-        QStyledItemDelegate::paint(painter, option, index);
-        painter->drawStaticText(option.rect.topLeft(), text);
-    } else {
-        ApiTraceFrame *frame = index.data().value<ApiTraceFrame*>();
-        if (frame) {
-            QStaticText text = frame->staticText();
-            //text.setTextWidth(option.rect.width());
-            QStyledItemDelegate::paint(painter, option, index);
-            painter->drawStaticText(option.rect.topLeft(), text);
-        } else {
-            QStyledItemDelegate::paint(painter, option, index);
+        //QStyledItemDelegate::paint(painter, option, index);
+        QStyle *style = QApplication::style();
+        style->drawControl(QStyle::CE_ItemViewItem, &option, painter, 0);
+        if (!event->state().isEmpty()) {
+            QPixmap px = m_stateEmblem.pixmap(option.rect.height(), option.rect.height());
+            painter->drawPixmap(option.rect.topLeft(), px);
+            offset = QPoint(option.rect.height() + 5, 0);
         }
+        painter->drawStaticText(option.rect.topLeft() + offset, text);
+    } else {
+        QStyledItemDelegate::paint(painter, option, index);
     }
 }
 
 QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option,
                                 const QModelIndex &index) const
 {
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
-        QStaticText text = call->staticText();
+    ApiTraceEvent *event =
+        index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
+
+    Q_ASSERT(index.column() == 0);
+
+    if (event) {
+        QStaticText text = event->staticText();
         //text.setTextWidth(option.rect.width());
+        //qDebug()<<"text size = "<<text.size();
         return text.size().toSize();
-    } else {
-        ApiTraceFrame *frame = index.data().value<ApiTraceFrame*>();
-        if (frame) {
-            QStaticText text = frame->staticText();
-            //text.setTextWidth(option.rect.width());
-            return text.size().toSize();
-        }
     }
     return QStyledItemDelegate::sizeHint(option, index);
 }
index a29a1784d6dc6560f751e0dae8fba7f26c4bd96e..525ab8320ad6be475f1d1967b2197a43e6926dcb 100644 (file)
@@ -14,6 +14,9 @@ public:
                const QModelIndex &index) const;
     QSize sizeHint(const QStyleOptionViewItem &option,
                    const QModelIndex &index) const;
+
+private:
+    QIcon m_stateEmblem;
 };
 
 #endif
index 24c56bf58876591b518811a9f583988f9beb4082..c467a8c4f7dacc87c610cbe2f214eee22f8cd7ca 100644 (file)
@@ -1,6 +1,7 @@
 #include "apitracefilter.h"
 
 #include "apitracecall.h"
+#include "apitracemodel.h"
 
 #include <QDebug>
 
@@ -13,14 +14,19 @@ 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;
     }
 
+    ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
     QString function = call->name;
 
     if (!m_text.isEmpty()) {
index c135bc15fac605d12a500dab081c3e0252b3bd2f..501dd98c0d9408edd763baaefa7bf21492fdf5bd 100644 (file)
@@ -5,6 +5,7 @@
 #include "trace_parser.hpp"
 
 #include <QDebug>
+#include <QImage>
 #include <QVariant>
 
 
@@ -24,24 +25,21 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
     if (!index.isValid())
         return QVariant();
 
-    if (role != Qt::DisplayRole)
-        return QVariant();
-
-    //data only in the first column
     if (index.column() != 0)
         return QVariant();
 
     ApiTraceEvent *itm = item(index);
-    if (itm) {
-        if (itm->type() == ApiTraceEvent::Frame) {
-            ApiTraceFrame *frame =
-                static_cast<ApiTraceFrame *>(itm);
-            return QVariant::fromValue(frame);
-        } else if (itm->type() == ApiTraceEvent::Call) {
-            ApiTraceCall *call =
-                static_cast<ApiTraceCall *>(itm);
-            return QVariant::fromValue(call);
-        }
+    if (!itm) {
+        return QVariant();
+    }
+
+    switch (role) {
+    case Qt::DisplayRole:
+        return itm->staticText().text();
+    case Qt::DecorationRole:
+        return QImage();
+    case ApiTraceModel::EventRole:
+        return QVariant::fromValue(itm);
     }
 
     return QVariant();
@@ -61,7 +59,9 @@ QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
         switch (section) {
         case 0:
-            return tr("Event");
+            return tr("Events");
+        case 1:
+            return tr("Flags");
         default:
             //fall through
             break;
@@ -77,13 +77,13 @@ QModelIndex ApiTraceModel::index(int row, int column,
     if (parent.isValid() && parent.column() != 0)
         return QModelIndex();
 
-    if (parent.isValid()) {
-        QVariant data = parent.data();
-        ApiTraceFrame *frame = data.value<ApiTraceFrame*>();
-        if (!frame) {
-            qDebug()<<"got a valid parent but it's not a frame "<<data;
+    ApiTraceEvent *event = item(parent);
+    if (event) {
+        if (event->type() != ApiTraceEvent::Frame) {
+            qDebug()<<"got a valid parent but it's not a frame "<<event->type();
             return QModelIndex();
         }
+        ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
         ApiTraceCall *call = frame->calls.value(row);
         if (call)
             return createIndex(row, column, call);
@@ -102,10 +102,11 @@ QModelIndex ApiTraceModel::index(int row, int column,
 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
 {
     if (parent.isValid()) {
-        ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
-        if (frame)
+        ApiTraceEvent *event = item(parent);
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
             return !frame->calls.isEmpty();
-        else
+        else
             return false;
     } else {
         return (rowCount() > 0);
@@ -117,8 +118,9 @@ QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
     if (!index.isValid())
         return QModelIndex();
 
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
+    ApiTraceEvent *event = item(index);
+    if (event && event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
         Q_ASSERT(call->parentFrame);
         return createIndex(call->parentFrame->number,
                            0, call->parentFrame);
@@ -131,11 +133,11 @@ int ApiTraceModel::rowCount(const QModelIndex &parent) const
     if (!parent.isValid())
         return m_trace->numFrames();
 
-    ApiTraceCall *call = parent.data().value<ApiTraceCall*>();
-    if (call)
+    ApiTraceEvent *event = item(parent);
+    if (!event || event->type() == ApiTraceEvent::Call)
         return 0;
 
-    ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
+    ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
     if (frame)
         return frame->calls.count();
 
@@ -147,7 +149,6 @@ int ApiTraceModel::columnCount(const QModelIndex &parent) const
     return 1;
 }
 
-
 bool ApiTraceModel::insertRows(int position, int rows,
                                const QModelIndex &parent)
 {
@@ -195,7 +196,7 @@ void ApiTraceModel::invalidateFrames()
 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
 {
     beginInsertRows(QModelIndex(), oldCount,
-                    oldCount + numAdded);
+                    oldCount + numAdded - 1);
     endInsertRows();
 }
 
@@ -206,4 +207,24 @@ ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
     return static_cast<ApiTraceEvent*>(index.internalPointer());
 }
 
+void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
+{
+    if (!event)
+        return;
+
+    if (event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+        ApiTraceFrame *frame = call->parentFrame;
+        int row = frame->calls.indexOf(call);
+        QModelIndex index = createIndex(row, 0, call);
+        emit dataChanged(index, index);
+    } else if (event->type() == ApiTraceEvent::Frame) {
+        ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+        const QList<ApiTraceFrame*> frames = m_trace->frames();
+        int row = frames.indexOf(frame);
+        QModelIndex index = createIndex(row, 0, frame);
+        emit dataChanged(index, index);
+    }
+}
+
 #include "apitracemodel.moc"
index d9ac9dd858905f58370fa5e8879956b6a08417d4..cf901591c9fc6053f88e336c23be1fff35b6aaf1 100644 (file)
@@ -13,12 +13,17 @@ class ApiTraceEvent;
 class ApiTraceModel : public QAbstractItemModel
 {
     Q_OBJECT
+public:
+    enum Roles {
+        EventRole = Qt::UserRole + 1
+    };
 public:
     ApiTraceModel(QObject *parent = 0);
     ~ApiTraceModel();
 
     void setApiTrace(ApiTrace *trace);
     const ApiTrace *apiTrace() const;
+    void stateSetOnEvent(ApiTraceEvent *event);
 
 public:
     /* QAbstractItemModel { */
index 12d46efa78403f2c8202df13d4c1500f368d06f7..93add0ee97d47864b0d437aa56c259efd0af7eb2 100644 (file)
@@ -43,8 +43,9 @@ MainWindow::MainWindow()
     m_proxyModel->setSourceModel(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.callView->resizeColumnToContents(0);
+    m_ui.callView->header()->swapSections(0, 1);
+    m_ui.callView->setColumnWidth(1, 42);
 
     QToolBar *toolBar = addToolBar(tr("Navigation"));
     m_filterEdit = new QLineEdit(toolBar);
@@ -105,13 +106,19 @@ void MainWindow::loadTrace(const QString &fileName)
 
 void MainWindow::callItemSelected(const QModelIndex &index)
 {
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
+    ApiTraceEvent *event =
+        index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
+
+    if (event && event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
         m_ui.detailsWebView->setHtml(call->toHtml());
         m_ui.detailsDock->show();
         m_selectedEvent = call;
     } else {
-        m_selectedEvent = index.data().value<ApiTraceFrame*>();
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            m_selectedEvent = static_cast<ApiTraceFrame*>(event);
+        } else
+            m_selectedEvent = 0;
         m_ui.detailsDock->hide();
     }
     if (m_selectedEvent && !m_selectedEvent->state().isEmpty()) {
@@ -294,6 +301,7 @@ void MainWindow::parseState(const QVariantMap &params)
     QVariantMap::const_iterator itr;
 
     m_stateEvent->setState(params);
+    m_model->stateSetOnEvent(m_stateEvent);
     if (m_selectedEvent == m_stateEvent) {
         fillStateForFrame();
     } else {