X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitracemodel.cpp;h=0863c1b5bc0eb19ad1b649b9d83442483a2fc5ad;hb=042cfaf61ae46975dd2787031540ddf34c75b2d1;hp=8f4892f63e494d5580ecdc361d3b64ccb63b71a6;hpb=f682e19bee94eb69a5cfc8b2db17d7f1ebb10c2b;p=apitrace diff --git a/gui/apitracemodel.cpp b/gui/apitracemodel.cpp index 8f4892f..0863c1b 100644 --- a/gui/apitracemodel.cpp +++ b/gui/apitracemodel.cpp @@ -4,6 +4,7 @@ #include "traceloader.h" #include "trace_parser.hpp" +#include #include #include #include @@ -52,22 +53,53 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const .arg(call->name()) .arg(stateText); } else { + const char *htmlTempl = + "
\n" + "
\n" + "%1" + "\n" + "Frame %2\n" + "
\n" + "
%3 calls%4
\n" + "
\n"; + + ApiTraceFrame *frame = static_cast(itm); - QString text = QObject::tr("%1) Frame ") - .arg(frame->number); - int binaryDataSize = frame->binaryDataSize() / 1024; - if (!frame->hasState()) - return QObject::tr( - "%1 (binary data size = %2kB)") - .arg(text) - .arg(binaryDataSize); - else - return QObject::tr( - "%1 (binary data size = %2kB)" - "
%3") - .arg(text) - .arg(binaryDataSize) - .arg(stateText); + QString thumbStr, sizeStr; + + if (frame->hasState()) { + static const char *imgTempl = + "\n"; + static const char *sizeTempl = + ", %1kb"; + + ApiFramebuffer fbo = frame->state()->colorBuffer(); + QImage thumb = fbo.thumb(); + if (!thumb.isNull()) { + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + thumb.save(&buffer, "PNG"); + thumbStr = tr(imgTempl).arg( + QString(buffer.data().toBase64())); + } + + int binaryDataSize = frame->binaryDataSize() / 1024; + if (binaryDataSize > 0) { + sizeStr = tr(sizeTempl).arg(binaryDataSize); + } + } + + int numCalls = frame->isLoaded() + ? frame->numChildren() + : frame->numChildrenToLoad(); + + return tr(htmlTempl) + .arg(thumbStr) + .arg(frame->number) + .arg(numCalls) + .arg(sizeStr); } } case ApiTraceModel::EventRole: @@ -216,8 +248,8 @@ void ApiTraceModel::setApiTrace(ApiTrace *trace) this, SLOT(beginAddingFrames(int, int))); connect(m_trace, SIGNAL(endAddingFrames()), this, SLOT(endAddingFrames())); - connect(m_trace, SIGNAL(changed(ApiTraceCall*)), - this, SLOT(callChanged(ApiTraceCall*))); + connect(m_trace, SIGNAL(changed(ApiTraceEvent*)), + this, SLOT(changed(ApiTraceEvent*))); connect(m_trace, SIGNAL(beginLoadingFrame(ApiTraceFrame*,int)), this, SLOT(beginLoadingFrame(ApiTraceFrame*,int))); connect(m_trace, SIGNAL(endLoadingFrame(ApiTraceFrame*)), @@ -262,19 +294,13 @@ void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event) emit dataChanged(index, index); } else if (event->type() == ApiTraceEvent::Frame) { ApiTraceFrame *frame = static_cast(event); - const QList frames = m_trace->frames(); + const QList & frames = m_trace->frames(); int row = frames.indexOf(frame); QModelIndex index = createIndex(row, 0, frame); emit dataChanged(index, index); } } -QModelIndex ApiTraceModel::callIndex(int callNum) const -{ - ApiTraceCall *call = m_trace->callWithIndex(callNum); - return indexForCall(call); -} - QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const { if (!call) { @@ -292,6 +318,15 @@ QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const return createIndex(row, 0, call); } +void ApiTraceModel::changed(ApiTraceEvent *event) +{ + if (event->type() == ApiTraceEvent::Call) { + callChanged(static_cast(event)); + } else if (event->type() == ApiTraceEvent::Frame) { + frameChanged(static_cast(event)); + } +} + void ApiTraceModel::callChanged(ApiTraceCall *call) { ApiTrace *trace = call->parentFrame()->parentTrace(); @@ -313,6 +348,14 @@ void ApiTraceModel::callChanged(ApiTraceCall *call) emit dataChanged(index, index); } +void ApiTraceModel::frameChanged(ApiTraceFrame *frame) +{ + const QList & frames = m_trace->frames(); + int row = frames.indexOf(frame); + QModelIndex index = createIndex(row, 0, frame); + emit dataChanged(index, index); +} + void ApiTraceModel::endAddingFrames() { endInsertRows(); @@ -324,7 +367,7 @@ bool ApiTraceModel::canFetchMore(const QModelIndex &parent) const ApiTraceEvent *event = item(parent); if (event && event->type() == ApiTraceEvent::Frame) { ApiTraceFrame *frame = static_cast(event); - return !frame->loaded() && !m_loadingFrames.contains(frame); + return !frame->isLoaded() && !m_loadingFrames.contains(frame); } else return false; } else { @@ -340,7 +383,7 @@ void ApiTraceModel::fetchMore(const QModelIndex &parent) ApiTraceFrame *frame = static_cast(event); QModelIndex index = createIndex(frame->number, 0, frame); - Q_ASSERT(!frame->loaded()); + Q_ASSERT(!frame->isLoaded()); m_loadingFrames.insert(frame); m_trace->loadFrame(frame);