]> git.cworth.org Git - apitrace/commitdiff
Fix and cleanup state lookups on frames.
authorZack Rusin <zack@kde.org>
Thu, 15 Sep 2011 02:04:07 +0000 (22:04 -0400)
committerZack Rusin <zack@kde.org>
Thu, 15 Sep 2011 02:04:07 +0000 (22:04 -0400)
gui/apitrace.cpp
gui/apitracecall.cpp
gui/apitracecall.h
gui/mainwindow.cpp
gui/traceloader.cpp

index 1087ccab1e698d8207a372deff0ac6a8b5fbe74a..6f101cd9f789aa21dc7ae13d83683ba4e638fe2d 100644 (file)
@@ -190,10 +190,15 @@ ApiTraceCall * ApiTrace::callWithIndex(int idx) const
 ApiTraceState ApiTrace::defaultState() const
 {
     ApiTraceFrame *frame = frameAt(0);
-    if (!frame || !frame->hasState())
+    if (!frame || !frame->loaded() || frame->isEmpty())
         return ApiTraceState();
 
-    return *frame->state();
+    ApiTraceCall *firstCall = frame->calls().first();
+    if (!firstCall->hasState()) {
+        return ApiTraceState();
+    }
+
+    return *firstCall->state();
 }
 
 void ApiTrace::callEdited(ApiTraceCall *call)
index c917662ff2d6afba8d4f4fcd1012c8a65ea71d5b..5ac88292399cf225212e9db95dbbe484b87f1bfa 100644 (file)
@@ -929,7 +929,8 @@ ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace)
       m_parentTrace(parentTrace),
       m_binaryDataSize(0),
       m_loaded(false),
-      m_callsToLoad(0)
+      m_callsToLoad(0),
+      m_lastCallIndex(0)
 {
 }
 
@@ -1112,3 +1113,17 @@ ApiTraceFrame::findPrevCall(ApiTraceCall *from,
     }
     return 0;
 }
+
+void ApiTraceFrame::setLastCallIndex(unsigned index)
+{
+    m_lastCallIndex = index;
+}
+
+unsigned ApiTraceFrame::lastCallIndex() const
+{
+    if (m_loaded && !m_calls.isEmpty()) {
+        return m_calls.last()->index();
+    } else {
+        return m_lastCallIndex;
+    }
+}
index d30bf1db22bf30843689a7241d935f9118ee292b..572b302b643ab23957cdf79c9851b19fdc0e0367 100644 (file)
@@ -331,12 +331,16 @@ public:
 
     bool loaded() const;
     void setLoaded(bool l);
+
+    void setLastCallIndex(unsigned index);
+    unsigned lastCallIndex() const;
 private:
     ApiTrace *m_parentTrace;
     quint64 m_binaryDataSize;
     QVector<ApiTraceCall*> m_calls;
     bool m_loaded;
     unsigned m_callsToLoad;
+    unsigned m_lastCallIndex;
 };
 Q_DECLARE_METATYPE(ApiTraceFrame*);
 
index 9e7fbad9994e0934a81d5e0d5f58214c43e1dec4..2974f31228af14fa2c7d91fcf1172769491ee7fe 100644 (file)
@@ -268,7 +268,7 @@ void MainWindow::replayTrace(bool dumpState)
                 qDebug()<<"tried to get a state for an empty frame";
                 return;
             }
-            index = frame->calls().first()->index();
+            index = frame->lastCallIndex();
         } else {
             qDebug()<<"Unknown event type";
             return;
@@ -873,11 +873,16 @@ void MainWindow::fillState(bool nonDefaults)
             m_ui.nonDefaultsCB->blockSignals(false);
             ApiTraceFrame *firstFrame =
                 m_trace->frameAt(0);
-            ApiTraceEvent *oldSelected = m_selectedEvent;
             if (!firstFrame)
                 return;
+            if (!firstFrame->loaded()) {
+                m_trace->loadFrame(firstFrame);
+                return;
+            }
+            ApiTraceCall *firstCall = firstFrame->calls().first();
+            ApiTraceEvent *oldSelected = m_selectedEvent;
             m_nonDefaultsLookupEvent = m_selectedEvent;
-            m_selectedEvent = firstFrame;
+            m_selectedEvent = firstCall;
             lookupState();
             m_selectedEvent = oldSelected;
         }
index 7bd7dbd56a462614fe44d701fc597f036f5d6ab8..9480f459e015505e79266843e0f2d80ae2568ffb 100644 (file)
@@ -144,6 +144,7 @@ void TraceLoader::scanTrace()
             currentFrame = new ApiTraceFrame();
             currentFrame->number = numOfFrames;
             currentFrame->setNumChildren(numOfCalls);
+            currentFrame->setLastCallIndex(call->no);
             frames.append(currentFrame);
 
             m_createdFrames.append(currentFrame);