#include "trace_parser.hpp"
#include <QDebug>
+#include <QImage>
#include <QVariant>
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 ApiTraceModel::EventRole:
+ return QVariant::fromValue(itm);
}
return QVariant();
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;
if (parent.isValid() && parent.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();
}
+ ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
ApiTraceCall *call = frame->calls.value(row);
if (call)
return createIndex(row, column, call);
bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
{
if (parent.isValid()) {
- ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
- if (frame)
+ ApiTraceEvent *event = item(parent);
+ if (event && event->type() == ApiTraceEvent::Frame) {
+ ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
return !frame->calls.isEmpty();
- else
+ } else
return false;
} else {
return (rowCount() > 0);
if (!index.isValid())
return QModelIndex();
- ApiTraceCall *call = index.data().value<ApiTraceCall*>();
- if (call) {
+ 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);
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 1;
}
-
bool ApiTraceModel::insertRows(int position, int rows,
const QModelIndex &parent)
{
void ApiTraceModel::appendFrames(int oldCount, int numAdded)
{
beginInsertRows(QModelIndex(), oldCount,
- oldCount + numAdded);
+ oldCount + numAdded - 1);
endInsertRows();
}
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->calls.indexOf(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);
+ }
+}
+
#include "apitracemodel.moc"