]> git.cworth.org Git - apitrace/commitdiff
Implement state viewing for the current frame.
authorZack Rusin <zack@kde.org>
Thu, 31 Mar 2011 02:47:51 +0000 (22:47 -0400)
committerZack Rusin <zack@kde.org>
Thu, 31 Mar 2011 02:48:42 +0000 (22:48 -0400)
gui/apitracecall.h
gui/mainwindow.cpp
gui/mainwindow.h
gui/ui/mainwindow.ui

index fcafd5818e210e795fe0955b15b32f90c7486be2..f5c734a20a60f47f44f50e01d90d5de62f3e54a3 100644 (file)
@@ -153,7 +153,7 @@ public:
     int number;
     QList<ApiTraceCall*> calls;
 
-    QMap<QString, QVariant> state;
+    QVariantMap state;
 
     int numChildren() const;
     QStaticText staticText() const;
index 592841c63015b24d623e2604bddd1c9a756b2ef6..8a23ea3ad0b112f606d7fa96a70187e4508ab5b3 100644 (file)
 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<ApiTraceFrame*>();
         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 = "<<m_replayProcess->readAllStandardError();
     qDebug()<<"\tout = "<<output;
 #endif
 
     if (m_findingState) {
-        qDebug()<<"json parse";
+        bool ok = false;
+        QVariantMap parsedJson = m_jsonParser->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 = "<<err;
     qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
@@ -250,8 +263,76 @@ void MainWindow::lookupState()
             tr("To inspect the state select a frame in the trace."));
         return;
     }
+    m_stateFrame = m_currentFrame;
     m_findingState = true;
     replayTrace(true);
 }
 
+MainWindow::~MainWindow()
+{
+    delete m_jsonParser;
+}
+
+void MainWindow::parseState(const QVariantMap &params)
+{
+    QVariantMap::const_iterator itr;
+
+    m_stateFrame->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<QTreeWidgetItem *> items;
+    for (itr = params.constBegin(); itr != params.constEnd(); ++itr) {
+        QString key = itr.key();
+        QString val;
+
+        variantToString(itr.value(), val);
+        //qDebug()<<"key = "<<key;
+        //qDebug()<<"val = "<<val;
+        QStringList lst;
+        lst += key;
+        lst += val;
+        items.append(new QTreeWidgetItem((QTreeWidget*)0, lst));
+    }
+    m_ui.stateTreeWidget->insertTopLevelItems(0, items);
+    m_ui.stateDock->show();
+}
+
 #include "mainwindow.moc"
index 598a61236912ea71029315383bfe6184fd13fa37..9fbd7a8cce2fa763a292edd0082a1d96e758e26d 100644 (file)
@@ -15,11 +15,16 @@ class QModelIndex;
 class QProcess;
 class QProgressBar;
 
+namespace QJson {
+    class Parser;
+}
+
 class MainWindow : public QMainWindow
 {
     Q_OBJECT
 public:
     MainWindow();
+    ~MainWindow();
 
 public slots:
     void loadTrace(const QString &fileName);
@@ -39,6 +44,8 @@ private slots:
 private:
     void newTraceFile(const QString &fileName);
     void replayTrace(bool dumpState);
+    void parseState(const QVariantMap &params);
+    void fillStateForFrame();
 
 private:
     Ui_MainWindow m_ui;
@@ -54,7 +61,11 @@ private:
     QString m_traceFileName;
 
     ApiTraceFrame *m_currentFrame;
+
+    ApiTraceFrame *m_stateFrame;
     bool m_findingState;
+
+    QJson::Parser *m_jsonParser;
 };
 
 
index 229aaebb309f51baf8691fbf863cd98c41a76de0..6b2afdf2f3b81ded2cb6714c3b0a5cfdec647229 100644 (file)
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="windowTitle">
-   <string>MainWindow</string>
+   <string>ApiTrace</string>
   </property>
   <widget class="QWidget" name="centralwidget">
    <layout class="QHBoxLayout" name="horizontalLayout">
@@ -20,6 +20,9 @@
       <property name="alternatingRowColors">
        <bool>true</bool>
       </property>
+      <property name="textElideMode">
+       <enum>Qt::ElideMiddle</enum>
+      </property>
       <property name="uniformRowHeights">
        <bool>true</bool>
       </property>
     </layout>
    </widget>
   </widget>
+  <widget class="QDockWidget" name="stateDock">
+   <property name="windowTitle">
+    <string>Current State</string>
+   </property>
+   <attribute name="dockWidgetArea">
+    <number>2</number>
+   </attribute>
+   <widget class="QWidget" name="dockWidgetContents_2">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QTreeWidget" name="stateTreeWidget">
+       <property name="alternatingRowColors">
+        <bool>true</bool>
+       </property>
+       <property name="selectionMode">
+        <enum>QAbstractItemView::NoSelection</enum>
+       </property>
+       <column>
+        <property name="text">
+         <string>Variable</string>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string>Value</string>
+        </property>
+       </column>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+  </widget>
   <action name="actionExit">
    <property name="text">
     <string>Exit</string>