From 11f7e632acbf1d2ee0fbd1a3c7d8e4865bd8faaf Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Wed, 30 Mar 2011 22:47:51 -0400 Subject: [PATCH] Implement state viewing for the current frame. --- gui/apitracecall.h | 2 +- gui/mainwindow.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++-- gui/mainwindow.h | 11 ++++++ gui/ui/mainwindow.ui | 37 ++++++++++++++++++- 4 files changed, 132 insertions(+), 5 deletions(-) diff --git a/gui/apitracecall.h b/gui/apitracecall.h index fcafd58..f5c734a 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -153,7 +153,7 @@ public: int number; QList calls; - QMap state; + QVariantMap state; int numChildren() const; QStaticText staticText() const; diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 592841c..8a23ea3 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -23,7 +23,10 @@ MainWindow::MainWindow() : QMainWindow(), m_replayProcess(0), - m_findingState(false) + m_currentFrame(0), + m_stateFrame(0), + m_findingState(false), + m_jsonParser(new QJson::Parser()) { m_ui.setupUi(this); @@ -52,6 +55,7 @@ MainWindow::MainWindow() m_progressBar->hide(); m_ui.detailsDock->hide(); + m_ui.stateDock->hide(); connect(m_ui.actionOpen, SIGNAL(triggered()), this, SLOT(openTrace())); @@ -109,6 +113,10 @@ void MainWindow::callItemSelected(const QModelIndex &index) m_currentFrame = index.data().value(); m_ui.detailsDock->hide(); } + if (m_currentFrame && !m_currentFrame->state.isEmpty()) { + fillStateForFrame(); + } else + m_ui.stateDock->hide(); } void MainWindow::filterTrace() @@ -154,17 +162,21 @@ void MainWindow::replayFinished() QByteArray output = m_replayProcess->readAllStandardOutput(); -#if 1 +#if 0 qDebug()<<"Process finished = "; qDebug()<<"\terr = "<readAllStandardError(); qDebug()<<"\tout = "<parse(output, &ok).toMap(); + parseState(parsedJson[QLatin1String("parameters")].toMap()); } else if (output.length() < 80) { statusBar()->showMessage(output); } + m_stateFrame = 0; + m_findingState = false; } void MainWindow::replayError(QProcess::ProcessError err) @@ -173,6 +185,7 @@ void MainWindow::replayError(QProcess::ProcessError err) m_ui.actionReplay->setEnabled(true); m_ui.actionLookupState->setEnabled(true); m_findingState = false; + m_stateFrame = 0; qDebug()<<"Process error = "<state.clear(); + m_stateFrame->state = params; + if (m_currentFrame == m_stateFrame) { + fillStateForFrame(); + } else { + m_ui.stateDock->hide(); + } +} + +static void +variantToString(const QVariant &var, QString &str) +{ + if (var.type() == QVariant::List) { + QVariantList lst = var.toList(); + str += QLatin1String("["); + for (int i = 0; i < lst.count(); ++i) { + QVariant val = lst[i]; + variantToString(val, str); + if (i < lst.count() - 1) + str += QLatin1String(", "); + } + str += QLatin1String("]"); + } else if (var.type() == QVariant::Map) { + Q_ASSERT(!"unsupported state type"); + } else if (var.type() == QVariant::Hash) { + Q_ASSERT(!"unsupported state type"); + } else { + str += var.toString(); + } +} + +void MainWindow::fillStateForFrame() +{ + QVariantMap::const_iterator itr; + QVariantMap params; + + if (!m_currentFrame || m_currentFrame->state.isEmpty()) + return; + + m_ui.stateTreeWidget->clear(); + params = m_currentFrame->state; + QList items; + for (itr = params.constBegin(); itr != params.constEnd(); ++itr) { + QString key = itr.key(); + QString val; + + variantToString(itr.value(), val); + //qDebug()<<"key = "< - MainWindow + ApiTrace @@ -20,6 +20,9 @@ true + + Qt::ElideMiddle + true @@ -98,6 +101,38 @@ + + + Current State + + + 2 + + + + + + + true + + + QAbstractItemView::NoSelection + + + + Variable + + + + + Value + + + + + + + Exit -- 2.43.0