1 #include "apitracemodel.h"
3 #include "apitracecall.h"
4 #include "loaderthread.h"
5 #include "trace_parser.hpp"
11 ApiTraceModel::ApiTraceModel(QObject *parent)
12 : QAbstractItemModel(parent),
17 ApiTraceModel::~ApiTraceModel()
22 QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
27 if (role != Qt::DisplayRole)
30 //data only in the first column
31 if (index.column() != 0)
34 ApiTraceEvent *itm = item(index);
36 if (itm->type() == ApiTraceEvent::Frame) {
37 ApiTraceFrame *frame =
38 static_cast<ApiTraceFrame *>(itm);
39 return QVariant::fromValue(frame);
40 } else if (itm->type() == ApiTraceEvent::Call) {
42 static_cast<ApiTraceCall *>(itm);
43 return QVariant::fromValue(call);
50 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
55 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
58 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
61 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
74 QModelIndex ApiTraceModel::index(int row, int column,
75 const QModelIndex &parent) const
77 if (parent.isValid() && parent.column() != 0)
80 if (parent.isValid()) {
81 QVariant data = parent.data();
82 ApiTraceFrame *frame = data.value<ApiTraceFrame*>();
84 qDebug()<<"got a valid parent but it's not a frame "<<data;
87 ApiTraceCall *call = frame->calls.value(row);
89 return createIndex(row, column, call);
93 ApiTraceFrame *frame = m_trace->frameAt(row);
95 return createIndex(row, column, frame);
102 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
104 if (parent.isValid()) {
105 ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
107 return !frame->calls.isEmpty();
111 return (rowCount() > 0);
115 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
117 if (!index.isValid())
118 return QModelIndex();
120 ApiTraceCall *call = index.data().value<ApiTraceCall*>();
122 Q_ASSERT(call->parentFrame);
123 return createIndex(call->parentFrame->number,
124 0, call->parentFrame);
126 return QModelIndex();
129 int ApiTraceModel::rowCount(const QModelIndex &parent) const
131 if (!parent.isValid())
132 return m_trace->numFrames();
134 ApiTraceCall *call = parent.data().value<ApiTraceCall*>();
138 ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
140 return frame->calls.count();
145 int ApiTraceModel::columnCount(const QModelIndex &parent) const
151 bool ApiTraceModel::insertRows(int position, int rows,
152 const QModelIndex &parent)
157 bool ApiTraceModel::removeRows(int position, int rows,
158 const QModelIndex &parent)
164 beginRemoveRows(parent, position, position + rows - 1);
165 //XXX remove it from ApiTrace
171 void ApiTraceModel::setApiTrace(ApiTrace *trace)
173 if (m_trace == trace)
178 connect(m_trace, SIGNAL(framesInvalidated()),
179 this, SLOT(invalidateFrames()));
180 connect(m_trace, SIGNAL(framesAdded(int, int)),
181 this, SLOT(appendFrames(int, int)));
184 const ApiTrace * ApiTraceModel::apiTrace() const
189 void ApiTraceModel::invalidateFrames()
195 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
197 beginInsertRows(QModelIndex(), oldCount,
198 oldCount + numAdded);
202 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
204 if (!index.isValid())
206 return static_cast<ApiTraceEvent*>(index.internalPointer());
209 #include "apitracemodel.moc"