}
int numCalls = frame->isLoaded()
- ? frame->numChildren()
+ ? frame->numTotalCalls()
: frame->numChildrenToLoad();
return tr(htmlTempl)
if ((parent.isValid() && parent.column() != 0) || column != 0)
return QModelIndex();
- ApiTraceEvent *event = item(parent);
- if (event) {
- if (event->type() != ApiTraceEvent::Frame) {
- qDebug()<<"got a valid parent but it's not a frame "<<event->type();
+ //qDebug()<<"At row = "<<row<<", column = "<<column<<", parent "<<parent;
+ ApiTraceEvent *parentEvent = item(parent);
+ if (parentEvent) {
+ ApiTraceEvent *event = parentEvent->eventAtRow(row);
+ if (event) {
+ Q_ASSERT(event->type() == ApiTraceEvent::Call);
+ return createIndex(row, column, event);
+ } else {
return QModelIndex();
}
- ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
- ApiTraceCall *call = frame->call(row);
- if (call)
- return createIndex(row, column, call);
- else
- return QModelIndex();
} else {
ApiTraceFrame *frame = m_trace->frameAt(row);
if (frame)
{
if (parent.isValid()) {
ApiTraceEvent *event = item(parent);
- if (event && event->type() == ApiTraceEvent::Frame) {
+ if (!event)
+ return false;
+ if (event->type() == ApiTraceEvent::Frame) {
ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
return !frame->isEmpty();
- } else
- return false;
+ } else {
+ Q_ASSERT(event->type() == ApiTraceEvent::Call);
+ ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+ return call->numChildren() != 0;
+ }
} else {
return (rowCount() > 0);
}
return QModelIndex();
ApiTraceEvent *event = item(index);
- if (event && event->type() == ApiTraceEvent::Call) {
+
+ if (event->type() == ApiTraceEvent::Call) {
ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
- Q_ASSERT(call->parentFrame());
- return createIndex(call->parentFrame()->number,
- 0, call->parentFrame());
+
+ if (call->parentCall()) {
+ ApiTraceCall *parentCall = call->parentCall();
+ ApiTraceEvent *topEvent = parentCall->parentEvent();
+ return createIndex(topEvent->callIndex(parentCall), 0, parentCall);
+ } else {
+ Q_ASSERT(call->parentFrame());
+ return createIndex(call->parentFrame()->number,
+ 0, call->parentFrame());
+ }
}
return QModelIndex();
}
return m_trace->numFrames();
ApiTraceEvent *event = item(parent);
- if (!event || event->type() == ApiTraceEvent::Call)
+ if (!event)
return 0;
- ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
- if (frame)
- return frame->numChildren();
-
- return 0;
+ return event->numChildren();
}
int ApiTraceModel::columnCount(const QModelIndex &parent) const
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(changed(ApiTraceEvent*)),
+ this, SLOT(changed(ApiTraceEvent*)));
connect(m_trace, SIGNAL(beginLoadingFrame(ApiTraceFrame*,int)),
this, SLOT(beginLoadingFrame(ApiTraceFrame*,int)));
connect(m_trace, SIGNAL(endLoadingFrame(ApiTraceFrame*)),
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);
+ QModelIndex index = indexForCall(call);
emit dataChanged(index, index);
} else if (event->type() == ApiTraceEvent::Frame) {
ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
- const QList<ApiTraceFrame*> frames = m_trace->frames();
+ const QList<ApiTraceFrame*> & frames = m_trace->frames();
int row = frames.indexOf(frame);
QModelIndex index = createIndex(row, 0, frame);
emit dataChanged(index, index);
return QModelIndex();
}
- ApiTraceFrame *frame = call->parentFrame();
- Q_ASSERT(frame);
+ ApiTraceEvent *parentEvent = call->parentEvent();
+ Q_ASSERT(parentEvent);
- int row = frame->callIndex(call);
+ int row = parentEvent->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)
+{
+ if (event->type() == ApiTraceEvent::Call) {
+ callChanged(static_cast<ApiTraceCall*>(event));
+ } else if (event->type() == ApiTraceEvent::Frame) {
+ frameChanged(static_cast<ApiTraceFrame*>(event));
+ }
+}
+
void ApiTraceModel::callChanged(ApiTraceCall *call)
{
ApiTrace *trace = call->parentFrame()->parentTrace();
if (trace->needsSaving())
trace->save();
- ApiTraceFrame *frame = call->parentFrame();
- int row = frame->callIndex(call);
- QModelIndex index = createIndex(row, 0, call);
+ QModelIndex index = indexForCall(call);
+ emit dataChanged(index, index);
+}
+
+void ApiTraceModel::frameChanged(ApiTraceFrame *frame)
+{
+ const QList<ApiTraceFrame*> & frames = m_trace->frames();
+ int row = frames.indexOf(frame);
+ QModelIndex index = createIndex(row, 0, frame);
emit dataChanged(index, index);
}