X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitracecall.cpp;h=d1de5a85f5c29700f2e01da4790abe21abf2b21d;hb=ebf971eec6c3a5f98885cc418e04690ba213b645;hp=9046a855804c0998bc1a55beed8f795dcc5908aa;hpb=0091432a9a7d98a125b5cbe0b3be7342949a0969;p=apitrace diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 9046a85..d1de5a8 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -1,6 +1,7 @@ #include "apitracecall.h" #include "apitrace.h" +#include "traceloader.h" #include "trace_model.hpp" #include @@ -44,18 +45,6 @@ const char * const styleSheet = //" -moz-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n" "}\n"; -ApiPointer::ApiPointer(unsigned long long val) - : m_value(val) -{ -} - -QString ApiPointer::toString() const -{ - if (m_value) - return QString("0x%1").arg(m_value, 0, 16); - else - return QLatin1String("NULL"); -} // Qt::convertFromPlainText doesn't do precisely what we want static QString @@ -109,7 +98,8 @@ plainTextToHTML(const QString & plain, bool multiLine) return rich; } -QString apiVariantToString(const QVariant &variant, bool multiLine) +QString +apiVariantToString(const QVariant &variant, bool multiLine) { if (variant.userType() == QVariant::Double) { return QString::number(variant.toFloat()); @@ -151,21 +141,177 @@ QString apiVariantToString(const QVariant &variant, bool multiLine) return QString(); } + +void VariantVisitor::visit(Trace::Null *) +{ + m_variant = QVariant::fromValue(ApiPointer(0)); +} + +void VariantVisitor::visit(Trace::Bool *node) +{ + m_variant = QVariant(node->value); +} + +void VariantVisitor::visit(Trace::SInt *node) +{ + m_variant = QVariant(node->value); +} + +void VariantVisitor::visit(Trace::UInt *node) +{ + m_variant = QVariant(node->value); +} + +void VariantVisitor::visit(Trace::Float *node) +{ + m_variant = QVariant(node->value); +} + +void VariantVisitor::visit(Trace::String *node) +{ + m_variant = QVariant(QString::fromStdString(node->value)); +} + +void VariantVisitor::visit(Trace::Enum *e) +{ + ApiTraceEnumSignature *sig = 0; + + if (m_loader) { + sig = m_loader->enumSignature(e->sig->id); + } + if (!sig) { + sig = new ApiTraceEnumSignature( + QString::fromStdString(e->sig->name), + QVariant(e->sig->value)); + if (m_loader) { + m_loader->addEnumSignature(e->sig->id, sig); + } + } + + m_variant = QVariant::fromValue(ApiEnum(sig)); +} + +void VariantVisitor::visit(Trace::Bitmask *bitmask) +{ + m_variant = QVariant::fromValue(ApiBitmask(bitmask)); +} + +void VariantVisitor::visit(Trace::Struct *str) +{ + m_variant = QVariant::fromValue(ApiStruct(str)); +} + +void VariantVisitor::visit(Trace::Array *array) +{ + m_variant = QVariant::fromValue(ApiArray(array)); +} + +void VariantVisitor::visit(Trace::Blob *blob) +{ + //XXX + //FIXME: this is a nasty hack. Trace::Blob's can't + // delete the contents in the destructor because + // the data is being used by other calls. We piggy back + // on that assumption and don't deep copy the data. If + // Blob's will start deleting the data we will need to + // start deep copying it or switch to using something like + // Boost's shared_ptr or Qt's QSharedPointer to handle it + blob->toPointer(true); + QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size); + m_variant = QVariant(barray); +} + +void VariantVisitor::visit(Trace::Pointer *ptr) +{ + m_variant = QVariant::fromValue(ApiPointer(ptr->value)); +} + + +ApiEnum::ApiEnum(ApiTraceEnumSignature *sig) + : m_sig(sig) +{ +} + +QString ApiEnum::toString() const +{ + if (m_sig) { + return m_sig->name(); + } + Q_ASSERT(!"should never happen"); + return QString(); +} + +QVariant ApiEnum::value() const +{ + if (m_sig) { + return m_sig->value(); + } + Q_ASSERT(!"should never happen"); + return QVariant(); +} + +QString ApiEnum::name() const +{ + if (m_sig) { + return m_sig->name(); + } + Q_ASSERT(!"should never happen"); + return QString(); +} + +unsigned long long ApiBitmask::value() const +{ + return m_value; +} + +ApiBitmask::Signature ApiBitmask::signature() const +{ + return m_sig; +} + +ApiStruct::Signature ApiStruct::signature() const +{ + return m_sig; +} + +QList ApiStruct::values() const +{ + return m_members; +} + +ApiPointer::ApiPointer(unsigned long long val) + : m_value(val) +{ +} + + +unsigned long long ApiPointer::value() const +{ + return m_value; +} + +QString ApiPointer::toString() const +{ + if (m_value) + return QString("0x%1").arg(m_value, 0, 16); + else + return QLatin1String("NULL"); +} + ApiBitmask::ApiBitmask(const Trace::Bitmask *bitmask) : m_value(0) { init(bitmask); } - void ApiBitmask::init(const Trace::Bitmask *bitmask) { if (!bitmask) return; m_value = bitmask->value; - for (const Trace::BitmaskVal *it = bitmask->sig->values; - it != bitmask->sig->values + bitmask->sig->count; ++it) { + for (const Trace::BitmaskFlag *it = bitmask->sig->flags; + it != bitmask->sig->flags + bitmask->sig->num_flags; ++it) { assert(it->value); QPair pair; @@ -231,7 +377,7 @@ void ApiStruct::init(const Trace::Struct *s) m_sig.name = QString::fromStdString(s->sig->name); for (unsigned i = 0; i < s->sig->num_members; ++i) { - VariantVisitor vis; + VariantVisitor vis(0); m_sig.memberNames.append( QString::fromStdString(s->sig->member_names[i])); s->members[i]->visit(vis); @@ -239,88 +385,21 @@ void ApiStruct::init(const Trace::Struct *s) } } -void VariantVisitor::visit(Trace::Null *) -{ - m_variant = QVariant::fromValue(ApiPointer(0)); -} - -void VariantVisitor::visit(Trace::Bool *node) -{ - m_variant = QVariant(node->value); -} - -void VariantVisitor::visit(Trace::SInt *node) -{ - m_variant = QVariant(node->value); -} - -void VariantVisitor::visit(Trace::UInt *node) -{ - m_variant = QVariant(node->value); -} - -void VariantVisitor::visit(Trace::Float *node) -{ - m_variant = QVariant(node->value); -} - -void VariantVisitor::visit(Trace::String *node) -{ - m_variant = QVariant(QString::fromStdString(node->value)); -} - -void VariantVisitor::visit(Trace::Enum *e) -{ - QVariant val = QVariant(e->sig->value); - - m_variant = QVariant::fromValue( - ApiEnum(QString::fromStdString(e->sig->name), val)); -} - -void VariantVisitor::visit(Trace::Bitmask *bitmask) -{ - m_variant = QVariant::fromValue(ApiBitmask(bitmask)); -} - -void VariantVisitor::visit(Trace::Struct *str) -{ - m_variant = QVariant::fromValue(ApiStruct(str)); -} - -void VariantVisitor::visit(Trace::Array *array) -{ - m_variant = QVariant::fromValue(ApiArray(array)); -} - -void VariantVisitor::visit(Trace::Blob *blob) -{ - //XXX - //FIXME: this is a nasty hack. Trace::Blob's can't - // delete the contents in the destructor because - // the data is being used by other calls. We piggy back - // on that assumption and don't deep copy the data. If - // Blob's will start deleting the data we will need to - // start deep copying it or switch to using something like - // Boost's shared_ptr or Qt's QSharedPointer to handle it - QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size); - m_variant = QVariant(barray); -} - -void VariantVisitor::visit(Trace::Pointer *ptr) -{ - m_variant = QVariant::fromValue(ApiPointer(ptr->value)); -} - ApiArray::ApiArray(const Trace::Array *arr) { init(arr); } -ApiArray::ApiArray(const QList &vals) +ApiArray::ApiArray(const QVector &vals) : m_array(vals) { } +QVector ApiArray::values() const +{ + return m_array; +} + QString ApiArray::toString() const { QString str; @@ -341,271 +420,36 @@ void ApiArray::init(const Trace::Array *arr) if (!arr) return; + m_array.reserve(arr->values.size()); for (int i = 0; i < arr->values.size(); ++i) { - VariantVisitor vis; + VariantVisitor vis(0); arr->values[i]->visit(vis); m_array.append(vis.variant()); } + m_array.squeeze(); } -QStaticText ApiTraceCall::staticText() const +ApiTraceState::ApiTraceState() { - if (m_staticText && !m_staticText->text().isEmpty()) - return *m_staticText; +} - QVariantList argValues = arguments(); +ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) +{ + m_parameters = parsedJson[QLatin1String("parameters")].toMap(); + QVariantMap attachedShaders = + parsedJson[QLatin1String("shaders")].toMap(); + QVariantMap::const_iterator itr; - QString richText = QString::fromLatin1( - "%1(").arg(m_name); - for (int i = 0; i < m_argNames.count(); ++i) { - richText += QLatin1String(""); - QString argText = apiVariantToString(argValues[i]); - //if arguments are really long (e.g. shader text), cut them - // and elide it - if (argText.length() > 40) { - QString shortened = argText.mid(0, 40); - shortened[argText.length() - 5] = '.'; - shortened[argText.length() - 4] = '.'; - shortened[argText.length() - 3] = '.'; - shortened[argText.length() - 2] = argText[argText.length() - 2]; - shortened[argText.length() - 1] = argText[argText.length() - 1]; - richText += shortened; - } else { - richText += argText; - } - richText += QLatin1String(""); - if (i < m_argNames.count() - 1) - richText += QLatin1String(", "); + for (itr = attachedShaders.constBegin(); itr != attachedShaders.constEnd(); + ++itr) { + QString type = itr.key(); + QString source = itr.value().toString(); + m_shaderSources[type] = source; } - richText += QLatin1String(")"); - if (m_returnValue.isValid()) { - richText += - QLatin1Literal(" = ") % - QLatin1Literal("") % - apiVariantToString(m_returnValue) % - QLatin1Literal(""); - } - - if (!m_staticText) - m_staticText = new QStaticText(richText); - else - m_staticText->setText(richText); - QTextOption opt; - opt.setWrapMode(QTextOption::NoWrap); - m_staticText->setTextOption(opt); - m_staticText->prepare(); - - return *m_staticText; -} - -QString ApiTraceCall::toHtml() const -{ - if (!m_richText.isEmpty()) - return m_richText; - - m_richText = QLatin1String("
"); - - if (m_helpUrl.isEmpty()) { - m_richText += QString::fromLatin1( - "%1) %2(") - .arg(m_index) - .arg(m_name); - } else { - m_richText += QString::fromLatin1( - "%1) %3(") - .arg(m_index) - .arg(m_helpUrl.toString()) - .arg(m_name); - } - - QVariantList argValues = arguments(); - for (int i = 0; i < m_argNames.count(); ++i) { - m_richText += - QLatin1String("") + - m_argNames[i] + - QLatin1String("") + - QLatin1Literal(" = ") + - QLatin1Literal("") + - apiVariantToString(argValues[i], true) + - QLatin1Literal(""); - if (i < m_argNames.count() - 1) - m_richText += QLatin1String(", "); - } - m_richText += QLatin1String(")"); - - if (m_returnValue.isValid()) { - m_richText += - QLatin1String(" = ") + - QLatin1String("") + - apiVariantToString(m_returnValue, true) + - QLatin1String(""); - } - m_richText += QLatin1String("
"); - - if (hasError()) { - QString errorStr = - QString::fromLatin1( - "
%1
") - .arg(m_error); - m_richText += errorStr; - } - - m_richText = - QString::fromLatin1( - "%2") - .arg(styleSheet) - .arg(m_richText); - m_richText.squeeze(); - - //qDebug()<text().isEmpty()) - return *m_staticText; - - QString richText; - - //mark the frame if it uploads more than a meg a frame - if (m_binaryDataSize > (1024*1024)) { - richText = - QObject::tr( - "" - "Frame %1" - "" - "    (%2MB)") - .arg(number) - .arg(double(m_binaryDataSize / (1024.*1024.)), 0, 'g', 2); - } else { - richText = - QObject::tr( - "Frame %1") - .arg(number); - } - - if (!m_staticText) - m_staticText = new QStaticText(richText); - - QTextOption opt; - opt.setWrapMode(QTextOption::NoWrap); - m_staticText->setTextOption(opt); - m_staticText->prepare(); - - return *m_staticText; -} - -int ApiTraceCall::numChildren() const -{ - return 0; -} - -int ApiTraceFrame::numChildren() const -{ - return m_calls.count(); -} - -ApiTraceFrame::ApiTraceFrame() - : ApiTraceEvent(ApiTraceEvent::Frame), - m_parentTrace(0), - m_binaryDataSize(0) -{ -} - -ApiTraceCall::ApiTraceCall() - : ApiTraceEvent(ApiTraceEvent::Call), - m_hasBinaryData(false), - m_binaryDataIndex(0) -{ -} - -ApiTraceEvent::ApiTraceEvent() - : m_type(ApiTraceEvent::None), - m_staticText(0) -{ -} - -ApiTraceEvent::ApiTraceEvent(Type t) - : m_type(t), - m_staticText(0) -{ -} - -ApiTraceCall::~ApiTraceCall() -{ -} -QVariantMap ApiTraceEvent::stateParameters() const -{ - return m_state.parameters(); -} - -ApiTraceState ApiTraceEvent::state() const -{ - return m_state; -} - -void ApiTraceEvent::setState(const ApiTraceState &state) -{ - m_state = state; -} - -bool ApiTraceCall::hasBinaryData() const -{ - return m_hasBinaryData; -} - -int ApiTraceCall::binaryDataIndex() const -{ - return m_binaryDataIndex; -} - -ApiTraceState::ApiTraceState() -{ -} - -ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) -{ - m_parameters = parsedJson[QLatin1String("parameters")].toMap(); - QVariantMap attachedShaders = - parsedJson[QLatin1String("shaders")].toMap(); - QVariantMap::const_iterator itr; - - - for (itr = attachedShaders.constBegin(); itr != attachedShaders.constEnd(); - ++itr) { - QString type = itr.key(); - QString source = itr.value().toString(); - m_shaderSources[type] = source; - } + m_uniforms = parsedJson[QLatin1String("uniforms")].toMap(); QVariantMap textures = parsedJson[QLatin1String("textures")].toMap(); @@ -622,6 +466,7 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) Q_ASSERT(type == QLatin1String("uint8")); Q_ASSERT(normalized == true); + Q_UNUSED(normalized); QByteArray dataArray = image[QLatin1String("__data__")].toByteArray(); @@ -648,6 +493,7 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) Q_ASSERT(type == QLatin1String("uint8")); Q_ASSERT(normalized == true); + Q_UNUSED(normalized); QByteArray dataArray = buffer[QLatin1String("__data__")].toByteArray(); @@ -661,146 +507,184 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) } } -QVariantMap ApiTraceState::parameters() const +const QVariantMap & ApiTraceState::parameters() const { return m_parameters; } -QMap ApiTraceState::shaderSources() const +const QMap & ApiTraceState::shaderSources() const { return m_shaderSources; } +const QVariantMap & ApiTraceState::uniforms() const +{ + return m_uniforms; +} + bool ApiTraceState::isEmpty() const { return m_parameters.isEmpty(); } -QList ApiTraceState::textures() const +const QList & ApiTraceState::textures() const { return m_textures; } -QList ApiTraceState::framebuffers() const +const QList & ApiTraceState::framebuffers() const { return m_framebuffers; } -QList ApiArray::values() const +ApiTraceCallSignature::ApiTraceCallSignature(const QString &name, + const QStringList &argNames) + : m_name(name), + m_argNames(argNames) { - return m_array; } -int ApiTraceCall::index() const +ApiTraceCallSignature::~ApiTraceCallSignature() { - return m_index; } -QString ApiTraceCall::name() const +QUrl ApiTraceCallSignature::helpUrl() const { - return m_name; + return m_helpUrl; } -QStringList ApiTraceCall::argNames() const +void ApiTraceCallSignature::setHelpUrl(const QUrl &url) { - return m_argNames; + m_helpUrl = url; } -QVariantList ApiTraceCall::arguments() const +ApiTraceEvent::ApiTraceEvent() + : m_type(ApiTraceEvent::None), + m_hasBinaryData(false), + m_binaryDataIndex(0), + m_state(0), + m_staticText(0) { - if (m_editedValues.isEmpty()) - return m_argValues; - else - return m_editedValues; } -QVariant ApiTraceCall::returnValue() const +ApiTraceEvent::ApiTraceEvent(Type t) + : m_type(t), + m_hasBinaryData(false), + m_binaryDataIndex(0), + m_state(0), + m_staticText(0) { - return m_returnValue; } -QUrl ApiTraceCall::helpUrl() const +ApiTraceEvent::~ApiTraceEvent() { - return m_helpUrl; + delete m_state; + delete m_staticText; +} + +QVariantMap ApiTraceEvent::stateParameters() const +{ + if (m_state) { + return m_state->parameters(); + } else { + return QVariantMap(); + } +} + +ApiTraceState *ApiTraceEvent::state() const +{ + return m_state; +} + +void ApiTraceEvent::setState(ApiTraceState *state) +{ + m_state = state; } -ApiTraceCall::ApiTraceCall(const Trace::Call *call) +ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, + TraceLoader *loader, + const Trace::Call *call) : ApiTraceEvent(ApiTraceEvent::Call), - m_hasBinaryData(false), - m_binaryDataIndex(0) + m_parentFrame(parentFrame) { - m_name = QString::fromStdString(call->sig->name); m_index = call->no; - QString argumentsText; - for (int i = 0; i < call->sig->num_args; ++i) { - m_argNames += - QString::fromStdString(call->sig->arg_names[i]); + m_signature = loader->signature(call->sig->id); + + if (!m_signature) { + QString name = QString::fromStdString(call->sig->name); + QStringList argNames; + argNames.reserve(call->sig->num_args); + for (int i = 0; i < call->sig->num_args; ++i) { + argNames += QString::fromStdString(call->sig->arg_names[i]); + } + m_signature = new ApiTraceCallSignature(name, argNames); + loader->addSignature(call->sig->id, m_signature); } if (call->ret) { - VariantVisitor retVisitor; + VariantVisitor retVisitor(loader); call->ret->visit(retVisitor); m_returnValue = retVisitor.variant(); } + m_argValues.reserve(call->args.size()); for (int i = 0; i < call->args.size(); ++i) { - VariantVisitor argVisitor; + VariantVisitor argVisitor(loader); call->args[i]->visit(argVisitor); - m_argValues += argVisitor.variant(); + m_argValues.append(argVisitor.variant()); if (m_argValues[i].type() == QVariant::ByteArray) { m_hasBinaryData = true; m_binaryDataIndex = i; } } + m_argValues.squeeze(); } -void ApiTraceCall::setHelpUrl(const QUrl &url) -{ - m_helpUrl = url; -} - -void ApiTraceCall::setParentFrame(ApiTraceFrame *frame) +ApiTraceCall::~ApiTraceCall() { - m_parentFrame = frame; } -ApiTraceFrame * ApiTraceCall::parentFrame()const -{ - return m_parentFrame; -} -ApiTraceEvent::~ApiTraceEvent() +bool ApiTraceCall::hasError() const { - delete m_staticText; + return !m_error.isEmpty(); } -void ApiTraceCall::revert() +QString ApiTraceCall::error() const { - setEditedValues(QVariantList()); + return m_error; } -ApiTrace * ApiTraceFrame::parentTrace() const +void ApiTraceCall::setError(const QString &msg) { - return m_parentTrace; + if (m_error != msg) { + ApiTrace *trace = parentTrace(); + m_error = msg; + m_richText = QString(); + if (trace) + trace->callError(this); + } } -void ApiTraceFrame::setParentTrace(ApiTrace *trace) +ApiTrace * ApiTraceCall::parentTrace() const { - m_parentTrace = trace; + if (m_parentFrame) + return m_parentFrame->parentTrace(); + return NULL; } -QVariantList ApiTraceCall::originalValues() const +QVector ApiTraceCall::originalValues() const { return m_argValues; } -void ApiTraceCall::setEditedValues(const QVariantList &lst) +void ApiTraceCall::setEditedValues(const QVector &lst) { ApiTrace *trace = parentTrace(); m_editedValues = lst; //lets regenerate data m_richText = QString(); - m_filterText = QString(); + m_searchText = QString(); delete m_staticText; m_staticText = 0; @@ -813,7 +697,7 @@ void ApiTraceCall::setEditedValues(const QVariantList &lst) } } -QVariantList ApiTraceCall::editedValues() const +QVector ApiTraceCall::editedValues() const { return m_editedValues; } @@ -823,78 +707,274 @@ bool ApiTraceCall::edited() const return !m_editedValues.isEmpty(); } -ApiEnum::ApiEnum(const QString &name, const QVariant &val) - : m_name(name), - m_value(val) +void ApiTraceCall::revert() { + setEditedValues(QVector()); } -QString ApiEnum::toString() const +void ApiTraceCall::setHelpUrl(const QUrl &url) { - return m_name; + m_signature->setHelpUrl(url); } -QVariant ApiEnum::value() const +void ApiTraceCall::setParentFrame(ApiTraceFrame *frame) { - return m_value; + m_parentFrame = frame; } -QString ApiEnum::name() const +ApiTraceFrame * ApiTraceCall::parentFrame()const { - return m_name; + return m_parentFrame; } -unsigned long long ApiBitmask::value() const +int ApiTraceCall::index() const { - return m_value; + return m_index; } -ApiBitmask::Signature ApiBitmask::signature() const +QString ApiTraceCall::name() const { - return m_sig; + return m_signature->name(); } -ApiStruct::Signature ApiStruct::signature() const +QStringList ApiTraceCall::argNames() const { - return m_sig; + return m_signature->argNames(); } -QList ApiStruct::values() const +QVector ApiTraceCall::arguments() const { - return m_members; + if (m_editedValues.isEmpty()) + return m_argValues; + else + return m_editedValues; } -unsigned long long ApiPointer::value() const +QVariant ApiTraceCall::returnValue() const { - return m_value; + return m_returnValue; } -bool ApiTraceCall::hasError() const +QUrl ApiTraceCall::helpUrl() const { - return !m_error.isEmpty(); + return m_signature->helpUrl(); } -QString ApiTraceCall::error() const +bool ApiTraceCall::hasBinaryData() const { - return m_error; + return m_hasBinaryData; } -void ApiTraceCall::setError(const QString &msg) +int ApiTraceCall::binaryDataIndex() const { - if (m_error != msg) { - ApiTrace *trace = parentTrace(); - m_error = msg; - m_richText = QString(); - if (trace) - trace->callError(this); + return m_binaryDataIndex; +} + +QStaticText ApiTraceCall::staticText() const +{ + if (m_staticText && !m_staticText->text().isEmpty()) + return *m_staticText; + + QVector argValues = arguments(); + + QString richText = QString::fromLatin1( + "%1(").arg( + m_signature->name()); + QStringList argNames = m_signature->argNames(); + for (int i = 0; i < argNames.count(); ++i) { + richText += QLatin1String(""); + QString argText = apiVariantToString(argValues[i]); + + //if arguments are really long (e.g. shader text), cut them + // and elide it + if (argText.length() > 40) { + QString shortened = argText.mid(0, 40); + shortened[argText.length() - 5] = '.'; + shortened[argText.length() - 4] = '.'; + shortened[argText.length() - 3] = '.'; + shortened[argText.length() - 2] = argText.at(argText.length() - 2); + shortened[argText.length() - 1] = argText.at(argText.length() - 1); + richText += shortened; + } else { + richText += argText; + } + richText += QLatin1String(""); + if (i < argNames.count() - 1) + richText += QLatin1String(", "); + } + richText += QLatin1String(")"); + if (m_returnValue.isValid()) { + richText += + QLatin1Literal(" = ") % + QLatin1Literal("") % + apiVariantToString(m_returnValue) % + QLatin1Literal(""); } + + if (!m_staticText) + m_staticText = new QStaticText(richText); + else + m_staticText->setText(richText); + QTextOption opt; + opt.setWrapMode(QTextOption::NoWrap); + m_staticText->setTextOption(opt); + m_staticText->prepare(); + + return *m_staticText; } -ApiTrace * ApiTraceCall::parentTrace() const +QString ApiTraceCall::toHtml() const { - if (m_parentFrame) - return m_parentFrame->parentTrace(); - return NULL; + if (!m_richText.isEmpty()) + return m_richText; + + m_richText = QLatin1String("
"); + + QUrl helpUrl = m_signature->helpUrl(); + if (helpUrl.isEmpty()) { + m_richText += QString::fromLatin1( + "%1) %2(") + .arg(m_index) + .arg(m_signature->name()); + } else { + m_richText += QString::fromLatin1( + "%1) %3(") + .arg(m_index) + .arg(helpUrl.toString()) + .arg(m_signature->name()); + } + + QVector argValues = arguments(); + QStringList argNames = m_signature->argNames(); + for (int i = 0; i < argNames.count(); ++i) { + m_richText += + QLatin1String("") + + argNames[i] + + QLatin1String("") + + QLatin1Literal(" = ") + + QLatin1Literal("") + + apiVariantToString(argValues[i], true) + + QLatin1Literal(""); + if (i < argNames.count() - 1) + m_richText += QLatin1String(", "); + } + m_richText += QLatin1String(")"); + + if (m_returnValue.isValid()) { + m_richText += + QLatin1String(" = ") + + QLatin1String("") + + apiVariantToString(m_returnValue, true) + + QLatin1String(""); + } + m_richText += QLatin1String("
"); + + if (hasError()) { + QString errorStr = + QString::fromLatin1( + "
%1
") + .arg(m_error); + m_richText += errorStr; + } + + m_richText = + QString::fromLatin1( + "%2") + .arg(styleSheet) + .arg(m_richText); + m_richText.squeeze(); + + //qDebug()< argValues = arguments(); + m_searchText = m_signature->name() + QLatin1Literal("("); + QStringList argNames = m_signature->argNames(); + for (int i = 0; i < argNames.count(); ++i) { + m_searchText += argNames[i] + + QLatin1Literal(" = ") + + apiVariantToString(argValues[i]); + if (i < argNames.count() - 1) + m_searchText += QLatin1String(", "); + } + m_searchText += QLatin1String(")"); + + if (m_returnValue.isValid()) { + m_searchText += QLatin1Literal(" = ") + + apiVariantToString(m_returnValue); + } + m_searchText.squeeze(); + return m_searchText; +} + +int ApiTraceCall::numChildren() const +{ + return 0; +} + +ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace) + : ApiTraceEvent(ApiTraceEvent::Frame), + m_parentTrace(parentTrace), + m_binaryDataSize(0), + m_loaded(false), + m_callsToLoad(0) +{ +} + +QStaticText ApiTraceFrame::staticText() const +{ + if (m_staticText && !m_staticText->text().isEmpty()) + return *m_staticText; + + QString richText; + + //mark the frame if it uploads more than a meg a frame + if (m_binaryDataSize > (1024*1024)) { + richText = + QObject::tr( + "" + "Frame %1" + "" + "    (%2MB)") + .arg(number) + .arg(double(m_binaryDataSize / (1024.*1024.)), 0, 'g', 2); + } else { + richText = + QObject::tr( + "Frame %1") + .arg(number); + } + + if (!m_staticText) + m_staticText = new QStaticText(richText); + + QTextOption opt; + opt.setWrapMode(QTextOption::NoWrap); + m_staticText->setTextOption(opt); + m_staticText->prepare(); + + return *m_staticText; +} + +int ApiTraceFrame::numChildren() const +{ + if (m_loaded) { + return m_calls.count(); + } else { + return m_callsToLoad; + } +} + +ApiTrace * ApiTraceFrame::parentTrace() const +{ + return m_parentTrace; } void ApiTraceFrame::addCall(ApiTraceCall *call) @@ -907,7 +987,7 @@ void ApiTraceFrame::addCall(ApiTraceCall *call) } } -QList ApiTraceFrame::calls() const +QVector ApiTraceFrame::calls() const { return m_calls; } @@ -932,3 +1012,30 @@ int ApiTraceFrame::binaryDataSize() const return m_binaryDataSize; } +void ApiTraceFrame::setCalls(const QVector &calls, + quint64 binaryDataSize) +{ + m_calls = calls; + m_binaryDataSize = binaryDataSize; + m_loaded = true; +} + +bool ApiTraceFrame::loaded() const +{ + return m_loaded; +} + +void ApiTraceFrame::setLoaded(bool l) +{ + m_loaded = l; +} + +void ApiTraceFrame::setNumChildren(int num) +{ + m_callsToLoad = num; +} + +void ApiTraceFrame::setParentTrace(ApiTrace *parent) +{ + m_parentTrace = parent; +}