#include "apicalldelegate.h" #include "apitracecall.h" #include "apitracemodel.h" #include "thumbnail.h" #include #include #include #include #include ApiCallDelegate::ApiCallDelegate(QWidget *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, const QModelIndex &index) const { QVariant var = index.data(ApiTraceModel::EventRole); ApiTraceEvent *event = var.value(); 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); 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(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); } else { frame->missingThumbnail(); } } 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(event); const QImage & thumbnail = call->thumbnail(); if (!thumbnail.isNull()) { painter->drawImage(offset, thumbnail); offset += QPoint(textSize.height() + thumbnail.width(), option.rect.height()/2 - textSize.height()/2); } else if (call->flags() & trace::CALL_FLAG_RENDER) { call->missingThumbnail(); } 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); } } QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { QVariant var = index.data(ApiTraceModel::EventRole); ApiTraceEvent *event = var.value(); #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()); //qDebug()<<"text size = "<type() == ApiTraceEvent::Frame) { ApiTraceFrame *frame = static_cast(event); const QImage & thumbnail = frame->thumbnail(); if (!thumbnail.isNull()) { size.rwidth() += thumbnail.width(); if (size.height() < thumbnail.height()) { size.setHeight(thumbnail.height()); } } } else if (event->type() == ApiTraceEvent::Call) { ApiTraceCall *call = static_cast(event); const QImage & thumbnail = call->thumbnail(); if (!thumbnail.isNull()) { size.rwidth() += thumbnail.width(); if (size.height() < thumbnail.height()) { size.setHeight(thumbnail.height()); } } } return size; } return QStyledItemDelegate::sizeHint(option, index); } #include "apicalldelegate.moc"