From: Zack Rusin Date: Sat, 16 Apr 2011 02:16:18 +0000 (-0400) Subject: Make apitracecall an actual class. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=ead6aad30fdde3921e0224895aa066c907d76c85;p=apitrace Make apitracecall an actual class. abstract the data in preparation for editing the arguments --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 592202f..40032ba 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -29,13 +29,13 @@ bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call, switch (marker) { case FrameMarker_SwapBuffers: - return call->name.contains(QLatin1String("SwapBuffers")); + return call->name().contains(QLatin1String("SwapBuffers")); case FrameMarker_Flush: - return call->name == QLatin1String("glFlush"); + return call->name() == QLatin1String("glFlush"); case FrameMarker_Finish: - return call->name == QLatin1String("glFinish"); + return call->name() == QLatin1String("glFinish"); case FrameMarker_Clear: - return call->name == QLatin1String("glClear"); + return call->name() == QLatin1String("glClear"); } Q_ASSERT(!"unknown frame marker"); @@ -153,7 +153,7 @@ void ApiTrace::detectFrames() currentFrame = new ApiTraceFrame(); currentFrame->number = m_frames.count(); } - apiCall->parentFrame = currentFrame; + apiCall->setParentFrame(currentFrame); currentFrame->calls.append(apiCall); if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) { @@ -175,7 +175,7 @@ ApiTraceCall * ApiTrace::callWithIndex(int idx) const { for (int i = 0; i < m_calls.count(); ++i) { ApiTraceCall *call = m_calls[i]; - if (call->index == idx) + if (call->index() == idx) return call; } return NULL; diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 3c58542..69bfdc7 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -240,10 +240,10 @@ QStaticText ApiTraceCall::staticText() const if (!m_staticText.text().isEmpty()) return m_staticText; - QString richText = QString::fromLatin1("%1(").arg(name); - for (int i = 0; i < argNames.count(); ++i) { + QString richText = QString::fromLatin1("%1(").arg(m_name); + for (int i = 0; i < m_argNames.count(); ++i) { richText += QLatin1String(""); - QString argText = apiVariantToString(argValues[i]); + QString argText = apiVariantToString(m_argValues[i]); //if arguments are really long (e.g. shader text), cut them // and elide it @@ -259,14 +259,14 @@ QStaticText ApiTraceCall::staticText() const richText += argText; } richText += QLatin1String(""); - if (i < argNames.count() - 1) + if (i < m_argNames.count() - 1) richText += QString::fromLatin1(", "); } richText += QLatin1String(")"); - if (returnValue.isValid()) { + if (m_returnValue.isValid()) { richText += QLatin1String(" = "); richText += QLatin1String(""); - richText += apiVariantToString(returnValue); + richText += apiVariantToString(m_returnValue); richText += QLatin1String(""); } @@ -284,34 +284,34 @@ QString ApiTraceCall::toHtml() const if (!m_richText.isEmpty()) return m_richText; - if (helpUrl.isEmpty()) { + if (m_helpUrl.isEmpty()) { m_richText = QString::fromLatin1( "%1) %2(") - .arg(index) - .arg(name); + .arg(m_index) + .arg(m_name); } else { m_richText = QString::fromLatin1( "%1) %3(") - .arg(index) - .arg(helpUrl.toString()) - .arg(name); + .arg(m_index) + .arg(m_helpUrl.toString()) + .arg(m_name); } - for (int i = 0; i < argNames.count(); ++i) { - m_richText += argNames[i]; + for (int i = 0; i < m_argNames.count(); ++i) { + m_richText += m_argNames[i]; m_richText += QString::fromLatin1(" = "); m_richText += QLatin1String(""); - m_richText += apiVariantToString(argValues[i]); + m_richText += apiVariantToString(m_argValues[i]); m_richText += QLatin1String(""); - if (i < argNames.count() - 1) + if (i < m_argNames.count() - 1) m_richText += QString::fromLatin1(", "); } m_richText += QLatin1String(")"); - if (returnValue.isValid()) { + if (m_returnValue.isValid()) { m_richText += QLatin1String(" = "); m_richText += QLatin1String(""); - m_richText += apiVariantToString(returnValue); + m_richText += apiVariantToString(m_returnValue); m_richText += QLatin1String(""); } return m_richText; @@ -322,25 +322,25 @@ QString ApiTraceCall::filterText() const if (!m_filterText.isEmpty()) return m_filterText; - m_filterText = name; + m_filterText = m_name; m_filterText += QLatin1String("("); - for (int i = 0; i < argNames.count(); ++i) { - m_filterText += argNames[i]; + for (int i = 0; i < m_argNames.count(); ++i) { + m_filterText += m_argNames[i]; m_filterText += QString::fromLatin1(" = "); - if (argValues[i].type() == QVariant::ByteArray) { + if (m_argValues[i].type() == QVariant::ByteArray) { m_hasBinaryData = true; m_binaryDataIndex = i; } - m_filterText += apiVariantToString(argValues[i]); - if (i < argNames.count() - 1) + m_filterText += apiVariantToString(m_argValues[i]); + if (i < m_argNames.count() - 1) m_filterText += QString::fromLatin1(", "); } m_filterText += QLatin1String(")"); - if (returnValue.isValid()) { + if (m_returnValue.isValid()) { m_filterText += QLatin1String(" = "); - m_filterText += apiVariantToString(returnValue); + m_filterText += apiVariantToString(m_returnValue); } return m_filterText; } @@ -536,3 +536,73 @@ QList ApiArray::values() const { return m_array; } + +int ApiTraceCall::index() const +{ + return m_index; +} + +QString ApiTraceCall::name() const +{ + return m_name; +} + +QStringList ApiTraceCall::argNames() const +{ + return m_argNames; +} + +QVariantList ApiTraceCall::arguments() const +{ + return m_argValues; +} + +QVariant ApiTraceCall::returnValue() const +{ + return m_returnValue; +} + +QUrl ApiTraceCall::helpUrl() const +{ + return m_helpUrl; +} + +ApiTraceCall::ApiTraceCall(const Trace::Call *call) + : ApiTraceEvent(ApiTraceEvent::Call), + m_hasBinaryData(false), + m_binaryDataIndex(0) +{ + m_name = QString::fromStdString(call->sig->name); + m_index = call->no; + + QString argumentsText; + for (int i = 0; i < call->sig->arg_names.size(); ++i) { + m_argNames += + QString::fromStdString(call->sig->arg_names[i]); + } + if (call->ret) { + VariantVisitor retVisitor; + call->ret->visit(retVisitor); + m_returnValue = retVisitor.variant(); + } + for (int i = 0; i < call->args.size(); ++i) { + VariantVisitor argVisitor; + call->args[i]->visit(argVisitor); + m_argValues += argVisitor.variant(); + } +} + +void ApiTraceCall::setHelpUrl(const QUrl &url) +{ + m_helpUrl = url; +} + +void ApiTraceCall::setParentFrame(ApiTraceFrame *frame) +{ + m_parentFrame = frame; +} + +ApiTraceFrame * ApiTraceCall::parentFrame()const +{ + return m_parentFrame; +} diff --git a/gui/apitracecall.h b/gui/apitracecall.h index 355b8c8..14ef52d 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -154,15 +154,18 @@ class ApiTraceCall : public ApiTraceEvent { public: ApiTraceCall(); + ApiTraceCall(const Trace::Call *tcall); ~ApiTraceCall(); - int index; - QString name; - QStringList argNames; - QVariantList argValues; - QVariant returnValue; - ApiTraceFrame *parentFrame; - QUrl helpUrl; + int index() const; + QString name() const; + QStringList argNames() const; + QVariantList arguments() const; + QVariant returnValue() const; + QUrl helpUrl() const; + void setHelpUrl(const QUrl &url); + ApiTraceFrame *parentFrame()const; + void setParentFrame(ApiTraceFrame *frame); QString toHtml() const; QString filterText() const; @@ -171,6 +174,14 @@ public: bool hasBinaryData() const; int binaryDataIndex() const; private: + int m_index; + QString m_name; + QStringList m_argNames; + QVariantList m_argValues; + QVariant m_returnValue; + ApiTraceFrame *m_parentFrame; + QUrl m_helpUrl; + mutable QString m_richText; mutable QString m_filterText; mutable QStaticText m_staticText; diff --git a/gui/apitracefilter.cpp b/gui/apitracefilter.cpp index 8a40faf..f541f73 100644 --- a/gui/apitracefilter.cpp +++ b/gui/apitracefilter.cpp @@ -29,7 +29,7 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow, } ApiTraceCall *call = static_cast(event); - QString function = call->name; + QString function = call->name(); if (!m_regexp.isEmpty() && m_regexp.isValid()) { return function.contains(m_regexp); diff --git a/gui/apitracemodel.cpp b/gui/apitracemodel.cpp index d3f3e6a..b41920e 100644 --- a/gui/apitracemodel.cpp +++ b/gui/apitracemodel.cpp @@ -44,12 +44,12 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const ApiTraceCall *call = static_cast(itm); if (call->state().isEmpty()) return QString::fromLatin1("%1) %2") - .arg(call->index) - .arg(call->name); + .arg(call->index()) + .arg(call->name()); else return QString::fromLatin1("%1) %2
%3") - .arg(call->index) - .arg(call->name) + .arg(call->index()) + .arg(call->name()) .arg(stateText); } else { ApiTraceFrame *frame = static_cast(itm); @@ -145,9 +145,9 @@ QModelIndex ApiTraceModel::parent(const QModelIndex &index) const ApiTraceEvent *event = item(index); if (event && event->type() == ApiTraceEvent::Call) { ApiTraceCall *call = static_cast(event); - Q_ASSERT(call->parentFrame); - return createIndex(call->parentFrame->number, - 0, call->parentFrame); + Q_ASSERT(call->parentFrame()); + return createIndex(call->parentFrame()->number, + 0, call->parentFrame()); } return QModelIndex(); } @@ -240,7 +240,7 @@ void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event) if (event->type() == ApiTraceEvent::Call) { ApiTraceCall *call = static_cast(event); - ApiTraceFrame *frame = call->parentFrame; + ApiTraceFrame *frame = call->parentFrame(); int row = frame->calls.indexOf(call); QModelIndex index = createIndex(row, 0, call); emit dataChanged(index, index); @@ -265,12 +265,12 @@ QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const return QModelIndex(); } - ApiTraceFrame *frame = call->parentFrame; + ApiTraceFrame *frame = call->parentFrame(); Q_ASSERT(frame); int row = frame->calls.indexOf(call); if (row < 0) { - qDebug() << "Couldn't find call num "<index<<" inside parent!"; + qDebug() << "Couldn't find call num "<index()<<" inside parent!"; return QModelIndex(); } return createIndex(row, 0, call); diff --git a/gui/argumentseditor.cpp b/gui/argumentseditor.cpp index de46784..7f75d2c 100644 --- a/gui/argumentseditor.cpp +++ b/gui/argumentseditor.cpp @@ -175,11 +175,11 @@ void ArgumentsEditor::setupCall() if (!m_call) return; - m_ui.callLabel->setText(m_call->name); + m_ui.callLabel->setText(m_call->name()); QStandardItem *rootItem = m_model->invisibleRootItem(); - for (int i = 0; i < m_call->argNames.count(); ++i) { - QString argName = m_call->argNames[i]; - QVariant val = m_call->argValues[i]; + for (int i = 0; i < m_call->argNames().count(); ++i) { + QString argName = m_call->argNames()[i]; + QVariant val = m_call->arguments()[i]; QStandardItem *nameItem = new QStandardItem(argName); nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable); QList topRow; diff --git a/gui/loaderthread.cpp b/gui/loaderthread.cpp index 37898a4..bc3d32e 100644 --- a/gui/loaderthread.cpp +++ b/gui/loaderthread.cpp @@ -14,27 +14,9 @@ static ApiTraceCall * apiCallFromTraceCall(const Trace::Call *call, const QHash &helpHash) { - ApiTraceCall *apiCall = new ApiTraceCall(); - apiCall->name = QString::fromStdString(call->sig->name); - apiCall->index = call->no; - - QString argumentsText; - for (int i = 0; i < call->sig->arg_names.size(); ++i) { - apiCall->argNames += - QString::fromStdString(call->sig->arg_names[i]); - } - if (call->ret) { - VariantVisitor retVisitor; - call->ret->visit(retVisitor); - apiCall->returnValue = retVisitor.variant(); - } - for (int i = 0; i < call->args.size(); ++i) { - VariantVisitor argVisitor; - call->args[i]->visit(argVisitor); - apiCall->argValues += argVisitor.variant(); - } + ApiTraceCall *apiCall = new ApiTraceCall(call); - apiCall->helpUrl = helpHash.value(apiCall->name); + apiCall->setHelpUrl(helpHash.value(apiCall->name())); //force generation of the internal state apiCall->filterText(); @@ -85,7 +67,7 @@ void LoaderThread::run() } ApiTraceCall *apiCall = apiCallFromTraceCall(call, helpHash); - apiCall->parentFrame = currentFrame; + apiCall->setParentFrame(currentFrame); currentFrame->calls.append(apiCall); if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) { diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index d67bc03..420c715 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -102,19 +102,20 @@ void MainWindow::callItemSelected(const QModelIndex &index) m_ui.detailsDock->show(); if (call->hasBinaryData()) { QByteArray data = - call->argValues[call->binaryDataIndex()].toByteArray(); + call->arguments()[call->binaryDataIndex()].toByteArray(); m_vdataInterpreter->setData(data); + QVariantList args = call->arguments(); - for (int i = 0; i < call->argNames.count(); ++i) { - QString name = call->argNames[i]; + for (int i = 0; i < call->argNames().count(); ++i) { + QString name = call->argNames()[i]; if (name == QLatin1String("stride")) { - int stride = call->argValues[i].toInt(); + int stride = args[i].toInt(); m_ui.vertexStrideSB->setValue(stride); } else if (name == QLatin1String("size")) { - int components = call->argValues[i].toInt(); + int components = args[i].toInt(); m_ui.vertexComponentsSB->setValue(components); } else if (name == QLatin1String("type")) { - QString val = call->argValues[i].toString(); + QString val = args[i].toString(); int textIndex = m_ui.vertexTypeCB->findText(val); if (textIndex >= 0) m_ui.vertexTypeCB->setCurrentIndex(textIndex); @@ -242,7 +243,7 @@ void MainWindow::replayTrace(bool dumpState) if (m_retracer->captureState() && m_selectedEvent) { int index = 0; if (m_selectedEvent->type() == ApiTraceEvent::Call) { - index = static_cast(m_selectedEvent)->index; + index = static_cast(m_selectedEvent)->index(); } else if (m_selectedEvent->type() == ApiTraceEvent::Frame) { ApiTraceFrame *frame = static_cast(m_selectedEvent); @@ -251,7 +252,7 @@ void MainWindow::replayTrace(bool dumpState) qDebug()<<"tried to get a state for an empty frame"; return; } - index = frame->calls.first()->index; + index = frame->calls.first()->index(); } else { qDebug()<<"Unknown event type"; return;