glvdebug: Add 'Step' functionality to ReplayWidget
authorPeter Lohrmann <peterl@valvesoftware.com>
Wed, 14 Jan 2015 01:20:21 +0000 (17:20 -0800)
committerJon Ashburn <jon@lunarg.com>
Thu, 12 Feb 2015 15:08:26 +0000 (08:08 -0700)
* Stepping is enabled initially so that the user can step through the initial API Calls.
* Stepping is disabled while the trace is playing, and re-enabled if the replay is paused or stopped.
* Stepping is implement by setting the pause flag and then continuing the replay, so that it will pause after replaying a single packet.
* As a result of this new feature, Stopping the replay now specifically resets the replay back to packet 0, so that stepping will restart at the beginning of the trace file.

tools/glave/src/glvdebug/glvdebug_QReplayWidget.h
tools/glave/src/glvdebug/glvdebug_QReplayWorker.h

index 105ecc0..63f0ce6 100755 (executable)
@@ -53,6 +53,12 @@ public:
         m_pToolBar->addWidget(m_pPlayButton);\r
         connect(m_pPlayButton, SIGNAL(clicked()), this, SLOT(onPlayButtonClicked()));\r
 \r
+        m_pStepButton = new QToolButton(m_pToolBar);\r
+        m_pStepButton->setText("Step");\r
+        m_pStepButton->setEnabled(true);\r
+        m_pToolBar->addWidget(m_pStepButton);\r
+        connect(m_pStepButton, SIGNAL(clicked()), this, SLOT(onStepButtonClicked()));\r
+\r
         m_pPauseButton = new QToolButton(m_pToolBar);\r
         m_pPauseButton->setText("Pause");\r
         m_pPauseButton->setEnabled(false);\r
@@ -75,6 +81,7 @@ public:
         pLayout->addWidget(m_pReplayWindow);\r
 \r
         connect(this, SIGNAL(PlayButtonClicked()), m_pWorker, SLOT(StartReplay()));\r
+        connect(this, SIGNAL(StepButtonClicked()), m_pWorker, SLOT(StepReplay()));\r
         connect(this, SIGNAL(PauseButtonClicked()), m_pWorker, SLOT(PauseReplay()));\r
         connect(this, SIGNAL(ContinueButtonClicked()), m_pWorker, SLOT(ContinueReplay()));\r
         connect(this, SIGNAL(StopButtonClicked()), m_pWorker, SLOT(StopReplay()));\r
@@ -83,6 +90,7 @@ public:
 \r
         // connect worker signals to widget actions\r
         connect(m_pWorker, SIGNAL(ReplayStarted()), this, SLOT(slotReplayStarted()));\r
+        connect(m_pWorker, SIGNAL(ReplayStepped()), this, SLOT(slotReplayStepped()));\r
         connect(m_pWorker, SIGNAL(ReplayPaused(uint64_t)), this, SLOT(slotReplayPaused(uint64_t)));\r
         connect(m_pWorker, SIGNAL(ReplayContinued()), this, SLOT(slotReplayContinued()));\r
         connect(m_pWorker, SIGNAL(ReplayStopped(uint64_t)), this, SLOT(slotReplayStopped(uint64_t)));\r
@@ -117,6 +125,7 @@ public:
 \r
 signals:\r
     void PlayButtonClicked();\r
+    void StepButtonClicked();\r
     void PauseButtonClicked();\r
     void ContinueButtonClicked();\r
     void StopButtonClicked();\r
@@ -132,14 +141,22 @@ private slots:
     void slotReplayStarted()\r
     {\r
         m_pPlayButton->setEnabled(false);\r
+        m_pStepButton->setEnabled(false);\r
         m_pPauseButton->setEnabled(true);\r
         m_pContinueButton->setEnabled(false);\r
         m_pStopButton->setEnabled(true);\r
     }\r
 \r
+    void slotReplayStepped()\r
+    {\r
+        // treated the same as continue\r
+        slotReplayContinued();\r
+    }\r
+\r
     void slotReplayPaused(uint64_t)\r
     {\r
         m_pPlayButton->setEnabled(false);\r
+        m_pStepButton->setEnabled(true);\r
         m_pPauseButton->setEnabled(false);\r
         m_pContinueButton->setEnabled(true);\r
         m_pStopButton->setEnabled(false);\r
@@ -148,6 +165,7 @@ private slots:
     void slotReplayContinued()\r
     {\r
         m_pPlayButton->setEnabled(false);\r
+        m_pStepButton->setEnabled(false);\r
         m_pPauseButton->setEnabled(true);\r
         m_pContinueButton->setEnabled(false);\r
         m_pStopButton->setEnabled(true);\r
@@ -156,6 +174,7 @@ private slots:
     void slotReplayStopped(uint64_t)\r
     {\r
         m_pPlayButton->setEnabled(true);\r
+        m_pStepButton->setEnabled(true);\r
         m_pPauseButton->setEnabled(false);\r
         m_pContinueButton->setEnabled(false);\r
         m_pStopButton->setEnabled(false);\r
@@ -164,6 +183,7 @@ private slots:
     void slotReplayFinished()\r
     {\r
         m_pPlayButton->setEnabled(true);\r
+        m_pStepButton->setEnabled(true);\r
         m_pPauseButton->setEnabled(false);\r
         m_pContinueButton->setEnabled(false);\r
         m_pStopButton->setEnabled(false);\r
@@ -175,6 +195,11 @@ public slots:
         emit PlayButtonClicked();\r
     }\r
 \r
+    void onStepButtonClicked()\r
+    {\r
+        emit StepButtonClicked();\r
+    }\r
+\r
     void onPauseButtonClicked()\r
     {\r
         m_pPlayButton->setEnabled(false);\r
@@ -208,6 +233,7 @@ private:
     QWidget* m_pReplayWindow;\r
     QToolBar* m_pToolBar;\r
     QToolButton* m_pPlayButton;\r
+    QToolButton* m_pStepButton;\r
     QToolButton* m_pPauseButton;\r
     QToolButton* m_pContinueButton;\r
     QToolButton* m_pStopButton;\r
index f8fd570..a44447f 100644 (file)
@@ -179,6 +179,7 @@ protected slots:
             if (m_bStopReplay)
             {
                 emit ReplayStopped(m_currentReplayPacketIndex);
+                m_currentReplayPacketIndex = 0;
                 return;
             }
         }
@@ -196,6 +197,13 @@ public slots:
         playCurrentTraceFile(0);
     }
 
+    void StepReplay()
+    {
+        emit ReplayContinued();
+        m_bPauseReplay = true;
+        playCurrentTraceFile(m_currentReplayPacketIndex+1);
+    }
+
     void PauseReplay()
     {
         m_bPauseReplay = true;