blob: d52e2d10d1c6a5c4889dca26cfe41b6eeb05e996 [file] [log] [blame]
Zack Rusin18eade52011-03-26 14:23:35 -04001#include "apicalldelegate.h"
2
3#include "apitracecall.h"
Zack Rusinc1acc7f2011-04-02 01:34:04 -04004#include "apitracemodel.h"
José Fonseca3f456402012-03-25 20:59:24 +01005#include "thumbnail.h"
Zack Rusin18eade52011-03-26 14:23:35 -04006
Zack Rusinc1acc7f2011-04-02 01:34:04 -04007#include <QApplication>
Zack Rusin18eade52011-03-26 14:23:35 -04008#include <QDebug>
9#include <QPainter>
10#include <QStaticText>
Zack Rusin96130ac2011-03-27 01:48:36 -040011#include <QStyle>
Zack Rusin18eade52011-03-26 14:23:35 -040012
13ApiCallDelegate::ApiCallDelegate(QWidget *parent)
Zack Rusinc1acc7f2011-04-02 01:34:04 -040014 : QStyledItemDelegate(parent),
Zack Rusin9af5bff2011-04-18 01:05:50 -040015 m_stateEmblem(":/resources/dialog-information.png"),
Zack Rusinb53b1612011-04-19 01:33:58 -040016 m_editEmblem(":/resources/document-edit.png"),
17 m_errorEmblem(":/resources/script-error.png")
Zack Rusin18eade52011-03-26 14:23:35 -040018{
19}
20
Zack Rusinf6667d12011-03-30 11:03:37 -040021void ApiCallDelegate::paint(QPainter *painter,
22 const QStyleOptionViewItem &option,
Zack Rusin18eade52011-03-26 14:23:35 -040023 const QModelIndex &index) const
24{
Zack Rusinc1acc7f2011-04-02 01:34:04 -040025 QVariant var = index.data(ApiTraceModel::EventRole);
26 ApiTraceEvent *event = var.value<ApiTraceEvent*>();
27
28 Q_ASSERT(index.column() == 0);
29
30 if (event) {
José Fonseca3f456402012-03-25 20:59:24 +010031 QPoint offset = option.rect.topLeft();
Zack Rusinc1acc7f2011-04-02 01:34:04 -040032 QStaticText text = event->staticText();
José Fonseca3f456402012-03-25 20:59:24 +010033 QSize textSize = text.size().toSize();
Zack Rusin18eade52011-03-26 14:23:35 -040034 //text.setTextWidth(option.rect.width());
Zack Rusinc1acc7f2011-04-02 01:34:04 -040035 //QStyledItemDelegate::paint(painter, option, index);
36 QStyle *style = QApplication::style();
37 style->drawControl(QStyle::CE_ItemViewItem, &option, painter, 0);
Dan McCabe10bd4242012-03-05 17:20:40 -080038
39 // draw thumbnail of frame
José Fonseca3f456402012-03-25 20:59:24 +010040 if (event->type() == ApiTraceEvent::Frame) {
Dan McCabe10bd4242012-03-05 17:20:40 -080041 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
José Fonseca8759ae02012-03-24 07:44:43 +000042 const QImage & thumbnail = frame->thumbnail();
Dan McCabe10bd4242012-03-05 17:20:40 -080043 if (!thumbnail.isNull()) {
José Fonseca3f456402012-03-25 20:59:24 +010044 painter->drawImage(offset, thumbnail);
45 offset += QPoint(textSize.height() + thumbnail.width(), option.rect.height()/2 - textSize.height()/2);
Dan McCabed1395322012-06-01 13:40:03 -070046 } else {
47 frame->missingThumbnail();
Dan McCabe10bd4242012-03-05 17:20:40 -080048 }
49 }
50
Zack Rusined40bc62011-08-28 17:11:02 -040051 if (event->hasState()) {
José Fonseca3f456402012-03-25 20:59:24 +010052 QPixmap px = m_stateEmblem.pixmap(textSize.height(),
53 textSize.height());
Zack Rusinc1acc7f2011-04-02 01:34:04 -040054 painter->drawPixmap(option.rect.topLeft(), px);
José Fonseca3f456402012-03-25 20:59:24 +010055 offset += QPoint(textSize.height() + 5, 0);
Zack Rusinf6667d12011-03-30 11:03:37 -040056 }
Zack Rusin9af5bff2011-04-18 01:05:50 -040057 if (event->type() == ApiTraceEvent::Call) {
58 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
Dan McCabeb6b6d7c2012-06-01 13:40:02 -070059 const QImage & thumbnail = call->thumbnail();
60 if (!thumbnail.isNull()) {
61 painter->drawImage(offset, thumbnail);
62 offset += QPoint(textSize.height() + thumbnail.width(), option.rect.height()/2 - textSize.height()/2);
Dan McCabed1d48f22012-06-07 16:41:56 -070063 } else if (call->flags() & trace::CALL_FLAG_RENDER) {
Dan McCabed1395322012-06-01 13:40:03 -070064 call->missingThumbnail();
Dan McCabeb6b6d7c2012-06-01 13:40:02 -070065 }
Zack Rusinb53b1612011-04-19 01:33:58 -040066 if (call->hasError()) {
José Fonseca3f456402012-03-25 20:59:24 +010067 QPixmap px = m_errorEmblem.pixmap(textSize.height(),
68 textSize.height());
69 painter->drawPixmap(offset, px);
70 offset += QPoint(textSize.height() + 5, 0);
Zack Rusinb53b1612011-04-19 01:33:58 -040071 }
Zack Rusin9af5bff2011-04-18 01:05:50 -040072 if (call->edited()) {
José Fonseca3f456402012-03-25 20:59:24 +010073 QPixmap px = m_editEmblem.pixmap(textSize.height(),
74 textSize.height());
75 painter->drawPixmap(offset, px);
76 offset += QPoint(textSize.height() + 5, 0);
Zack Rusin9af5bff2011-04-18 01:05:50 -040077 }
78 }
79
José Fonseca3f456402012-03-25 20:59:24 +010080 painter->drawStaticText(offset, text);
Zack Rusinc1acc7f2011-04-02 01:34:04 -040081 } else {
82 QStyledItemDelegate::paint(painter, option, index);
Zack Rusin18eade52011-03-26 14:23:35 -040083 }
84}
85
86QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option,
87 const QModelIndex &index) const
88{
José Fonseca3f456402012-03-25 20:59:24 +010089 QVariant var = index.data(ApiTraceModel::EventRole);
90 ApiTraceEvent *event = var.value<ApiTraceEvent*>();
Zack Rusinc1acc7f2011-04-02 01:34:04 -040091
José Fonsecaae89afa2011-05-27 20:25:41 +010092#ifndef __APPLE__
93 /* XXX: This fails on MacOSX, but seems safe to ignore */
Zack Rusinc1acc7f2011-04-02 01:34:04 -040094 Q_ASSERT(index.column() == 0);
José Fonsecaae89afa2011-05-27 20:25:41 +010095#endif
Zack Rusinc1acc7f2011-04-02 01:34:04 -040096
97 if (event) {
98 QStaticText text = event->staticText();
Zack Rusin18eade52011-03-26 14:23:35 -040099 //text.setTextWidth(option.rect.width());
Zack Rusinc1acc7f2011-04-02 01:34:04 -0400100 //qDebug()<<"text size = "<<text.size();
José Fonseca3f456402012-03-25 20:59:24 +0100101 QSize size = text.size().toSize();
102
103 // Adjust for thumbnail
104 if (event->type() == ApiTraceEvent::Frame) {
105 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
106 const QImage & thumbnail = frame->thumbnail();
107 if (!thumbnail.isNull()) {
108 size.rwidth() += thumbnail.width();
109 if (size.height() < thumbnail.height()) {
110 size.setHeight(thumbnail.height());
111 }
112 }
Dan McCabeb6b6d7c2012-06-01 13:40:02 -0700113 } else if (event->type() == ApiTraceEvent::Call) {
114 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
115 const QImage & thumbnail = call->thumbnail();
116 if (!thumbnail.isNull()) {
117 size.rwidth() += thumbnail.width();
118 if (size.height() < thumbnail.height()) {
119 size.setHeight(thumbnail.height());
120 }
121 }
José Fonseca3f456402012-03-25 20:59:24 +0100122 }
123
124 return size;
Zack Rusin18eade52011-03-26 14:23:35 -0400125 }
126 return QStyledItemDelegate::sizeHint(option, index);
127}
128
129
130#include "apicalldelegate.moc"