]> git.cworth.org Git - apitrace/blobdiff - gui/apicalldelegate.cpp
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / gui / apicalldelegate.cpp
index a681c7549008b84fab16385831c7cfcdb4e8ab8e..9ad9f24ad535fe729cb478164b30410727014401 100644 (file)
@@ -1,27 +1,75 @@
 #include "apicalldelegate.h"
 
 #include "apitracecall.h"
+#include "apitracemodel.h"
+#include "thumbnail.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"),
+      m_editEmblem(":/resources/document-edit.png"),
+      m_errorEmblem(":/resources/script-error.png")
 {
 }
 
-void ApiCallDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+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 = option.rect.topLeft();
+        QStaticText text = event->staticText();
+        QSize textSize = text.size().toSize();
         //text.setTextWidth(option.rect.width());
-        QStyledItemDelegate::paint(painter, option, index);
-        painter->drawStaticText(option.rect.topLeft(), text);
-    } else{
+        //QStyledItemDelegate::paint(painter, option, index);
+        QStyle *style = QApplication::style();
+        style->drawControl(QStyle::CE_ItemViewItem, &option, painter, 0);
+
+        // draw thumbnail of frame
+        if (event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+            const QImage & thumbnail = frame->thumbnail();
+            if (!thumbnail.isNull()) {
+                painter->drawImage(offset, thumbnail);
+                offset += QPoint(textSize.height() + thumbnail.width(), option.rect.height()/2 - textSize.height()/2);
+            }
+        }
+
+        if (event->hasState()) {
+            QPixmap px = m_stateEmblem.pixmap(textSize.height(),
+                                              textSize.height());
+            painter->drawPixmap(option.rect.topLeft(), px);
+            offset += QPoint(textSize.height() + 5, 0);
+        }
+        if (event->type() == ApiTraceEvent::Call) {
+            ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+            if (call->hasError()) {
+                QPixmap px = m_errorEmblem.pixmap(textSize.height(),
+                                                  textSize.height());
+                painter->drawPixmap(offset, px);
+                offset += QPoint(textSize.height() + 5, 0);
+            }
+            if (call->edited()) {
+                QPixmap px = m_editEmblem.pixmap(textSize.height(),
+                                                 textSize.height());
+                painter->drawPixmap(offset, px);
+                offset += QPoint(textSize.height() + 5, 0);
+            }
+        }
+
+        painter->drawStaticText(offset, text);
+    } else {
         QStyledItemDelegate::paint(painter, option, index);
     }
 }
@@ -29,11 +77,33 @@ void ApiCallDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio
 QSize ApiCallDelegate::sizeHint(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*>();
+
+#ifndef __APPLE__
+    /* XXX: This fails on MacOSX, but seems safe to ignore */
+    Q_ASSERT(index.column() == 0);
+#endif
+
+    if (event) {
+        QStaticText text = event->staticText();
         //text.setTextWidth(option.rect.width());
-        return text.size().toSize();
+        //qDebug()<<"text size = "<<text.size();
+        QSize size = text.size().toSize();
+
+        // Adjust for thumbnail
+        if (event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+            const QImage & thumbnail = frame->thumbnail();
+            if (!thumbnail.isNull()) {
+                size.rwidth() += thumbnail.width();
+                if (size.height() < thumbnail.height()) {
+                    size.setHeight(thumbnail.height());
+                }
+            }
+        }
+
+        return size;
     }
     return QStyledItemDelegate::sizeHint(option, index);
 }