blob: 0e583bcaeab672c677894fd5f036b675e78758e7 [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 McCabe10bd4242012-03-05 17:20:40 -080046 }
47 }
48
Zack Rusined40bc62011-08-28 17:11:02 -040049 if (event->hasState()) {
José Fonseca3f456402012-03-25 20:59:24 +010050 QPixmap px = m_stateEmblem.pixmap(textSize.height(),
51 textSize.height());
Zack Rusinc1acc7f2011-04-02 01:34:04 -040052 painter->drawPixmap(option.rect.topLeft(), px);
José Fonseca3f456402012-03-25 20:59:24 +010053 offset += QPoint(textSize.height() + 5, 0);
Zack Rusinf6667d12011-03-30 11:03:37 -040054 }
Zack Rusin9af5bff2011-04-18 01:05:50 -040055 if (event->type() == ApiTraceEvent::Call) {
56 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
Dan McCabeb6b6d7c2012-06-01 13:40:02 -070057 const QImage & thumbnail = call->thumbnail();
58 if (!thumbnail.isNull()) {
59 painter->drawImage(offset, thumbnail);
60 offset += QPoint(textSize.height() + thumbnail.width(), option.rect.height()/2 - textSize.height()/2);
61 }
Zack Rusinb53b1612011-04-19 01:33:58 -040062 if (call->hasError()) {
José Fonseca3f456402012-03-25 20:59:24 +010063 QPixmap px = m_errorEmblem.pixmap(textSize.height(),
64 textSize.height());
65 painter->drawPixmap(offset, px);
66 offset += QPoint(textSize.height() + 5, 0);
Zack Rusinb53b1612011-04-19 01:33:58 -040067 }
Zack Rusin9af5bff2011-04-18 01:05:50 -040068 if (call->edited()) {
José Fonseca3f456402012-03-25 20:59:24 +010069 QPixmap px = m_editEmblem.pixmap(textSize.height(),
70 textSize.height());
71 painter->drawPixmap(offset, px);
72 offset += QPoint(textSize.height() + 5, 0);
Zack Rusin9af5bff2011-04-18 01:05:50 -040073 }
74 }
75
José Fonseca3f456402012-03-25 20:59:24 +010076 painter->drawStaticText(offset, text);
Zack Rusinc1acc7f2011-04-02 01:34:04 -040077 } else {
78 QStyledItemDelegate::paint(painter, option, index);
Zack Rusin18eade52011-03-26 14:23:35 -040079 }
80}
81
82QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option,
83 const QModelIndex &index) const
84{
José Fonseca3f456402012-03-25 20:59:24 +010085 QVariant var = index.data(ApiTraceModel::EventRole);
86 ApiTraceEvent *event = var.value<ApiTraceEvent*>();
Zack Rusinc1acc7f2011-04-02 01:34:04 -040087
José Fonsecaae89afa2011-05-27 20:25:41 +010088#ifndef __APPLE__
89 /* XXX: This fails on MacOSX, but seems safe to ignore */
Zack Rusinc1acc7f2011-04-02 01:34:04 -040090 Q_ASSERT(index.column() == 0);
José Fonsecaae89afa2011-05-27 20:25:41 +010091#endif
Zack Rusinc1acc7f2011-04-02 01:34:04 -040092
93 if (event) {
94 QStaticText text = event->staticText();
Zack Rusin18eade52011-03-26 14:23:35 -040095 //text.setTextWidth(option.rect.width());
Zack Rusinc1acc7f2011-04-02 01:34:04 -040096 //qDebug()<<"text size = "<<text.size();
José Fonseca3f456402012-03-25 20:59:24 +010097 QSize size = text.size().toSize();
98
99 // Adjust for thumbnail
100 if (event->type() == ApiTraceEvent::Frame) {
101 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
102 const QImage & thumbnail = frame->thumbnail();
103 if (!thumbnail.isNull()) {
104 size.rwidth() += thumbnail.width();
105 if (size.height() < thumbnail.height()) {
106 size.setHeight(thumbnail.height());
107 }
108 }
Dan McCabeb6b6d7c2012-06-01 13:40:02 -0700109 } else if (event->type() == ApiTraceEvent::Call) {
110 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
111 const QImage & thumbnail = call->thumbnail();
112 if (!thumbnail.isNull()) {
113 size.rwidth() += thumbnail.width();
114 if (size.height() < thumbnail.height()) {
115 size.setHeight(thumbnail.height());
116 }
117 }
José Fonseca3f456402012-03-25 20:59:24 +0100118 }
119
120 return size;
Zack Rusin18eade52011-03-26 14:23:35 -0400121 }
122 return QStyledItemDelegate::sizeHint(option, index);
123}
124
125
126#include "apicalldelegate.moc"