+void ApiTraceModel::setApiTrace(ApiTrace *trace)
+{
+ if (m_trace == trace)
+ return;
+ 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(beginAddingFrames(int, int)),
+ this, SLOT(beginAddingFrames(int, int)));
+ connect(m_trace, SIGNAL(endAddingFrames()),
+ this, SLOT(endAddingFrames()));
+ connect(m_trace, SIGNAL(changed(ApiTraceEvent*)),
+ this, SLOT(changed(ApiTraceEvent*)));
+ 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
+{
+ return m_trace;
+}
+
+void ApiTraceModel::invalidateFrames()
+{
+ beginResetModel();
+ endResetModel();
+}
+
+void ApiTraceModel::beginAddingFrames(int oldCount, int numAdded)
+{
+ beginInsertRows(QModelIndex(), oldCount,
+ oldCount + numAdded - 1);
+}
+
+ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
+{
+ if (!index.isValid())
+ return 0;
+ 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::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::changed(ApiTraceEvent *event)