]> git.cworth.org Git - apitrace/blobdiff - gui/apitracemodel.cpp
Switch list to a vector.
[apitrace] / gui / apitracemodel.cpp
index c135bc15fac605d12a500dab081c3e0252b3bd2f..5860cf9530e4d66310d6497db52454b7f9f085fc 100644 (file)
@@ -5,6 +5,7 @@
 #include "trace_parser.hpp"
 
 #include <QDebug>
+#include <QImage>
 #include <QVariant>
 
 
@@ -24,25 +25,54 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
     if (!index.isValid())
         return QVariant();
 
-    if (role != Qt::DisplayRole)
-        return QVariant();
-
-    //data only in the first column
     if (index.column() != 0)
         return QVariant();
 
     ApiTraceEvent *itm = item(index);
-    if (itm) {
-        if (itm->type() == ApiTraceEvent::Frame) {
-            ApiTraceFrame *frame =
-                static_cast<ApiTraceFrame *>(itm);
-            return QVariant::fromValue(frame);
-        } else if (itm->type() == ApiTraceEvent::Call) {
-            ApiTraceCall *call =
-                static_cast<ApiTraceCall *>(itm);
-            return QVariant::fromValue(call);
+    if (!itm) {
+        return QVariant();
+    }
+
+    switch (role) {
+    case Qt::DisplayRole:
+        return itm->staticText().text();
+    case Qt::DecorationRole:
+        return QImage();
+    case Qt::ToolTipRole: {
+        const QString stateText = tr("State info available.");
+        if (itm->type() == ApiTraceEvent::Call) {
+            ApiTraceCall *call = static_cast<ApiTraceCall*>(itm);
+            if (!call->hasState())
+                return QString::fromLatin1("%1)&nbsp;<b>%2</b>")
+                    .arg(call->index())
+                    .arg(call->name());
+            else
+                return QString::fromLatin1("%1)&nbsp;<b>%2</b><br/>%3")
+                    .arg(call->index())
+                    .arg(call->name())
+                    .arg(stateText);
+        } else {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(itm);
+            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 QObject::tr(
+                    "<b>%1&nbsp;(binary&nbsp;data&nbsp;size&nbsp;=&nbsp;%2kB)</b>"
+                    "<br/>%3")
+                    .arg(text)
+                    .arg(binaryDataSize)
+                    .arg(stateText);
         }
     }
+    case ApiTraceModel::EventRole:
+        return QVariant::fromValue(itm);
+    }
 
     return QVariant();
 }
@@ -61,7 +91,9 @@ QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
         switch (section) {
         case 0:
-            return tr("Event");
+            return tr("Events");
+        case 1:
+            return tr("Flags");
         default:
             //fall through
             break;
@@ -74,17 +106,17 @@ 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();
 
-    if (parent.isValid()) {
-        QVariant data = parent.data();
-        ApiTraceFrame *frame = data.value<ApiTraceFrame*>();
-        if (!frame) {
-            qDebug()<<"got a valid parent but it's not a frame "<<data;
+    ApiTraceEvent *event = item(parent);
+    if (event) {
+        if (event->type() != ApiTraceEvent::Frame) {
+            qDebug()<<"got a valid parent but it's not a frame "<<event->type();
             return QModelIndex();
         }
-        ApiTraceCall *call = frame->calls.value(row);
+        ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+        ApiTraceCall *call = frame->call(row);
         if (call)
             return createIndex(row, column, call);
         else
@@ -102,10 +134,11 @@ QModelIndex ApiTraceModel::index(int row, int column,
 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
 {
     if (parent.isValid()) {
-        ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
-        if (frame)
-            return !frame->calls.isEmpty();
-        else
+        ApiTraceEvent *event = item(parent);
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+            return !frame->isEmpty();
+        } else
             return false;
     } else {
         return (rowCount() > 0);
@@ -117,11 +150,12 @@ QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
     if (!index.isValid())
         return QModelIndex();
 
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
-        Q_ASSERT(call->parentFrame);
-        return createIndex(call->parentFrame->number,
-                           0, call->parentFrame);
+    ApiTraceEvent *event = item(index);
+    if (event && event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+        Q_ASSERT(call->parentFrame());
+        return createIndex(call->parentFrame()->number,
+                           0, call->parentFrame());
     }
     return QModelIndex();
 }
@@ -131,13 +165,13 @@ int ApiTraceModel::rowCount(const QModelIndex &parent) const
     if (!parent.isValid())
         return m_trace->numFrames();
 
-    ApiTraceCall *call = parent.data().value<ApiTraceCall*>();
-    if (call)
+    ApiTraceEvent *event = item(parent);
+    if (!event || event->type() == ApiTraceEvent::Call)
         return 0;
 
-    ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
+    ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
     if (frame)
-        return frame->calls.count();
+        return frame->numChildren();
 
     return 0;
 }
@@ -147,7 +181,6 @@ int ApiTraceModel::columnCount(const QModelIndex &parent) const
     return 1;
 }
 
-
 bool ApiTraceModel::insertRows(int position, int rows,
                                const QModelIndex &parent)
 {
@@ -175,10 +208,16 @@ void ApiTraceModel::setApiTrace(ApiTrace *trace)
     if (m_trace)
         disconnect(m_trace);
     m_trace = trace;
+    connect(m_trace, SIGNAL(invalidated()),
+            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*)));
 }
 
 const ApiTrace * ApiTraceModel::apiTrace() const
@@ -192,11 +231,10 @@ void ApiTraceModel::invalidateFrames()
     endResetModel();
 }
 
-void ApiTraceModel::appendFrames(int oldCount, int numAdded)
+void ApiTraceModel::beginAddingFrames(int oldCount, int numAdded)
 {
     beginInsertRows(QModelIndex(), oldCount,
-                    oldCount + numAdded);
-    endInsertRows();
+                    oldCount + numAdded - 1);
 }
 
 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
@@ -206,4 +244,73 @@ ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
     return static_cast<ApiTraceEvent*>(index.internalPointer());
 }
 
+void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
+{
+    if (!event)
+        return;
+
+    if (event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+        ApiTraceFrame *frame = call->parentFrame();
+        int row = frame->callIndex(call);
+        QModelIndex index = createIndex(row, 0, call);
+        emit dataChanged(index, index);
+    } else if (event->type() == ApiTraceEvent::Frame) {
+        ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+        const QList<ApiTraceFrame*> frames = m_trace->frames();
+        int row = frames.indexOf(frame);
+        QModelIndex index = createIndex(row, 0, frame);
+        emit dataChanged(index, index);
+    }
+}
+
+QModelIndex ApiTraceModel::callIndex(int callNum) const
+{
+    ApiTraceCall *call = m_trace->callWithIndex(callNum);
+    return indexForCall(call);
+}
+
+QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const
+{
+    if (!call) {
+        return QModelIndex();
+    }
+
+    ApiTraceFrame *frame = call->parentFrame();
+    Q_ASSERT(frame);
+
+    int row = frame->callIndex(call);
+    if (row < 0) {
+        qDebug() << "Couldn't find call num "<<call->index()<<" inside parent!";
+        return QModelIndex();
+    }
+    return createIndex(row, 0, call);
+}
+
+void ApiTraceModel::callChanged(ApiTraceCall *call)
+{
+    ApiTrace *trace = call->parentFrame()->parentTrace();
+
+#if 0
+    qDebug()<<"Call changed = "<<call->edited();
+    qDebug()<<"\ttrace edited = "<<trace->edited();
+    qDebug()<<"\ttrace file = "<<trace->fileName();
+    qDebug()<<"\ttrace needs saving = "<<trace->needsSaving();
+#endif
+
+    Q_ASSERT(trace);
+    if (trace->needsSaving())
+        trace->save();
+
+    ApiTraceFrame *frame = call->parentFrame();
+    int row = frame->callIndex(call);
+    QModelIndex index = createIndex(row, 0, call);
+    emit dataChanged(index, index);
+}
+
+void ApiTraceModel::endAddingFrames()
+{
+    endInsertRows();
+}
+
 #include "apitracemodel.moc"