]> git.cworth.org Git - apitrace/blobdiff - gui/apitracemodel.cpp
Make state lookups with on-demand loading work.
[apitrace] / gui / apitracemodel.cpp
index 951d6ac085c006dc9eff305e9f8b34e00020c66c..8f4892f63e494d5580ecdc361d3b64ccb63b71a6 100644 (file)
@@ -1,7 +1,7 @@
 #include "apitracemodel.h"
 
 #include "apitracecall.h"
-#include "loaderthread.h"
+#include "traceloader.h"
 #include "trace_parser.hpp"
 
 #include <QDebug>
@@ -42,7 +42,7 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
         const QString stateText = tr("State info available.");
         if (itm->type() == ApiTraceEvent::Call) {
             ApiTraceCall *call = static_cast<ApiTraceCall*>(itm);
-            if (call->state().isEmpty())
+            if (!call->hasState())
                 return QString::fromLatin1("%1)&nbsp;<b>%2</b>")
                     .arg(call->index())
                     .arg(call->name());
@@ -53,12 +53,20 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
                     .arg(stateText);
         } else {
             ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(itm);
-            QString text = frame->staticText().text();
-            if (frame->state().isEmpty())
-                return QString::fromLatin1("<b>%1</b>").arg(text);
+            QString text = QObject::tr("%1)&nbsp;Frame&nbsp;")
+                           .arg(frame->number);
+            int binaryDataSize = frame->binaryDataSize() / 1024;
+            if (!frame->hasState())
+                return QObject::tr(
+                    "<b>%1&nbsp;</b>(binary&nbsp;data&nbsp;size&nbsp;=&nbsp;%2kB)")
+                    .arg(text)
+                    .arg(binaryDataSize);
             else
-                return QString::fromLatin1("<b>%1</b><br/>%2")
+                return QObject::tr(
+                    "<b>%1&nbsp;(binary&nbsp;data&nbsp;size&nbsp;=&nbsp;%2kB)</b>"
+                    "<br/>%3")
                     .arg(text)
+                    .arg(binaryDataSize)
                     .arg(stateText);
         }
     }
@@ -98,7 +106,7 @@ QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
 QModelIndex ApiTraceModel::index(int row, int column,
                                  const QModelIndex &parent) const
 {
-    if (parent.isValid() && parent.column() != 0)
+    if ((parent.isValid() && parent.column() != 0) || column != 0)
         return QModelIndex();
 
     ApiTraceEvent *event = item(parent);
@@ -108,7 +116,7 @@ QModelIndex ApiTraceModel::index(int row, int column,
             return QModelIndex();
         }
         ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
-        ApiTraceCall *call = frame->calls.value(row);
+        ApiTraceCall *call = frame->call(row);
         if (call)
             return createIndex(row, column, call);
         else
@@ -129,7 +137,7 @@ bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
         ApiTraceEvent *event = item(parent);
         if (event && event->type() == ApiTraceEvent::Frame) {
             ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
-            return !frame->calls.isEmpty();
+            return !frame->isEmpty();
         } else
             return false;
     } else {
@@ -163,7 +171,7 @@ int ApiTraceModel::rowCount(const QModelIndex &parent) const
 
     ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
     if (frame)
-        return frame->calls.count();
+        return frame->numChildren();
 
     return 0;
 }
@@ -204,10 +212,17 @@ void ApiTraceModel::setApiTrace(ApiTrace *trace)
             this, SLOT(invalidateFrames()));
     connect(m_trace, SIGNAL(framesInvalidated()),
             this, SLOT(invalidateFrames()));
-    connect(m_trace, SIGNAL(framesAdded(int, int)),
-            this, SLOT(appendFrames(int, int)));
+    connect(m_trace, SIGNAL(beginAddingFrames(int, int)),
+            this, SLOT(beginAddingFrames(int, int)));
+    connect(m_trace, SIGNAL(endAddingFrames()),
+            this, SLOT(endAddingFrames()));
     connect(m_trace, SIGNAL(changed(ApiTraceCall*)),
             this, SLOT(callChanged(ApiTraceCall*)));
+    connect(m_trace, SIGNAL(beginLoadingFrame(ApiTraceFrame*,int)),
+            this, SLOT(beginLoadingFrame(ApiTraceFrame*,int)));
+    connect(m_trace, SIGNAL(endLoadingFrame(ApiTraceFrame*)),
+            this, SLOT(endLoadingFrame(ApiTraceFrame*)));
+
 }
 
 const ApiTrace * ApiTraceModel::apiTrace() const
@@ -221,11 +236,10 @@ void ApiTraceModel::invalidateFrames()
     endResetModel();
 }
 
-void ApiTraceModel::appendFrames(int oldCount, int numAdded)
+void ApiTraceModel::beginAddingFrames(int oldCount, int numAdded)
 {
     beginInsertRows(QModelIndex(), oldCount,
                     oldCount + numAdded - 1);
-    endInsertRows();
 }
 
 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
@@ -243,7 +257,7 @@ void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
     if (event->type() == ApiTraceEvent::Call) {
         ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
         ApiTraceFrame *frame = call->parentFrame();
-        int row = frame->calls.indexOf(call);
+        int row = frame->callIndex(call);
         QModelIndex index = createIndex(row, 0, call);
         emit dataChanged(index, index);
     } else if (event->type() == ApiTraceEvent::Frame) {
@@ -270,7 +284,7 @@ QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const
     ApiTraceFrame *frame = call->parentFrame();
     Q_ASSERT(frame);
 
-    int row = frame->calls.indexOf(call);
+    int row = frame->callIndex(call);
     if (row < 0) {
         qDebug() << "Couldn't find call num "<<call->index()<<" inside parent!";
         return QModelIndex();
@@ -294,9 +308,68 @@ void ApiTraceModel::callChanged(ApiTraceCall *call)
         trace->save();
 
     ApiTraceFrame *frame = call->parentFrame();
-    int row = frame->calls.indexOf(call);
+    int row = frame->callIndex(call);
     QModelIndex index = createIndex(row, 0, call);
     emit dataChanged(index, index);
 }
 
+void ApiTraceModel::endAddingFrames()
+{
+    endInsertRows();
+}
+
+bool ApiTraceModel::canFetchMore(const QModelIndex &parent) const
+{
+    if (parent.isValid()) {
+        ApiTraceEvent *event = item(parent);
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+            return !frame->loaded() && !m_loadingFrames.contains(frame);
+        } else
+            return false;
+    } else {
+        return false;
+    }
+}
+
+void ApiTraceModel::fetchMore(const QModelIndex &parent)
+{
+    if (parent.isValid()) {
+        ApiTraceEvent *event = item(parent);
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+            QModelIndex index = createIndex(frame->number, 0, frame);
+
+            Q_ASSERT(!frame->loaded());
+            m_loadingFrames.insert(frame);
+
+            m_trace->loadFrame(frame);
+        }
+    }
+}
+
+void ApiTraceModel::beginLoadingFrame(ApiTraceFrame *frame, int numAdded)
+{
+    QModelIndex index = createIndex(frame->number, 0, frame);
+    beginInsertRows(index, 0, numAdded - 1);
+}
+
+void ApiTraceModel::endLoadingFrame(ApiTraceFrame *frame)
+{
+    QModelIndex index = createIndex(frame->number, 0, frame);
+#if 0
+    qDebug()<<"Frame loaded = "<<frame->loaded();
+    qDebug()<<"\tframe idx = "<<frame->number;
+    qDebug()<<"\tis empty = "<<frame->isEmpty();
+    qDebug()<<"\tnum children = "<<frame->numChildren();
+    qDebug()<<"\tindex is "<<index;
+#endif
+
+    endInsertRows();
+
+    emit dataChanged(index, index);
+
+    m_loadingFrames.remove(frame);
+}
+
 #include "apitracemodel.moc"