blob: 9ad9f24ad535fe729cb478164b30410727014401 [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);
Zack Rusinb53b1612011-04-19 01:33:58 -040057 if (call->hasError()) {
José Fonseca3f456402012-03-25 20:59:24 +010058 QPixmap px = m_errorEmblem.pixmap(textSize.height(),
59 textSize.height());
60 painter->drawPixmap(offset, px);
61 offset += QPoint(textSize.height() + 5, 0);
Zack Rusinb53b1612011-04-19 01:33:58 -040062 }
Zack Rusin9af5bff2011-04-18 01:05:50 -040063 if (call->edited()) {
José Fonseca3f456402012-03-25 20:59:24 +010064 QPixmap px = m_editEmblem.pixmap(textSize.height(),
65 textSize.height());
66 painter->drawPixmap(offset, px);
67 offset += QPoint(textSize.height() + 5, 0);
Zack Rusin9af5bff2011-04-18 01:05:50 -040068 }
69 }
70
José Fonseca3f456402012-03-25 20:59:24 +010071 painter->drawStaticText(offset, text);
Zack Rusinc1acc7f2011-04-02 01:34:04 -040072 } else {
73 QStyledItemDelegate::paint(painter, option, index);
Zack Rusin18eade52011-03-26 14:23:35 -040074 }
75}
76
77QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option,
78 const QModelIndex &index) const
79{
José Fonseca3f456402012-03-25 20:59:24 +010080 QVariant var = index.data(ApiTraceModel::EventRole);
81 ApiTraceEvent *event = var.value<ApiTraceEvent*>();
Zack Rusinc1acc7f2011-04-02 01:34:04 -040082
José Fonsecaae89afa2011-05-27 20:25:41 +010083#ifndef __APPLE__
84 /* XXX: This fails on MacOSX, but seems safe to ignore */
Zack Rusinc1acc7f2011-04-02 01:34:04 -040085 Q_ASSERT(index.column() == 0);
José Fonsecaae89afa2011-05-27 20:25:41 +010086#endif
Zack Rusinc1acc7f2011-04-02 01:34:04 -040087
88 if (event) {
89 QStaticText text = event->staticText();
Zack Rusin18eade52011-03-26 14:23:35 -040090 //text.setTextWidth(option.rect.width());
Zack Rusinc1acc7f2011-04-02 01:34:04 -040091 //qDebug()<<"text size = "<<text.size();
José Fonseca3f456402012-03-25 20:59:24 +010092 QSize size = text.size().toSize();
93
94 // Adjust for thumbnail
95 if (event->type() == ApiTraceEvent::Frame) {
96 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
97 const QImage & thumbnail = frame->thumbnail();
98 if (!thumbnail.isNull()) {
99 size.rwidth() += thumbnail.width();
100 if (size.height() < thumbnail.height()) {
101 size.setHeight(thumbnail.height());
102 }
103 }
104 }
105
106 return size;
Zack Rusin18eade52011-03-26 14:23:35 -0400107 }
108 return QStyledItemDelegate::sizeHint(option, index);
109}
110
111
112#include "apicalldelegate.moc"