1 #include "apitracemodel.h"
3 #include "apitracecall.h"
4 #include "loaderthread.h"
5 #include "trace_parser.hpp"
12 ApiTraceModel::ApiTraceModel(QObject *parent)
13 : QAbstractItemModel(parent),
18 ApiTraceModel::~ApiTraceModel()
23 QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
28 if (index.column() != 0)
31 ApiTraceEvent *itm = item(index);
38 return itm->staticText().text();
39 case Qt::DecorationRole:
41 case ApiTraceModel::EventRole:
42 return QVariant::fromValue(itm);
48 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
53 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
56 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
59 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 ApiTraceEvent *event = item(parent);
82 if (event->type() != ApiTraceEvent::Frame) {
83 qDebug()<<"got a valid parent but it's not a frame "<<event->type();
86 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
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 ApiTraceEvent *event = item(parent);
106 if (event && event->type() == ApiTraceEvent::Frame) {
107 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
108 return !frame->calls.isEmpty();
112 return (rowCount() > 0);
116 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
118 if (!index.isValid())
119 return QModelIndex();
121 ApiTraceEvent *event = item(index);
122 if (event && event->type() == ApiTraceEvent::Call) {
123 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
124 Q_ASSERT(call->parentFrame);
125 return createIndex(call->parentFrame->number,
126 0, call->parentFrame);
128 return QModelIndex();
131 int ApiTraceModel::rowCount(const QModelIndex &parent) const
133 if (!parent.isValid())
134 return m_trace->numFrames();
136 ApiTraceEvent *event = item(parent);
137 if (!event || event->type() == ApiTraceEvent::Call)
140 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
142 return frame->calls.count();
147 int ApiTraceModel::columnCount(const QModelIndex &parent) const
152 bool ApiTraceModel::insertRows(int position, int rows,
153 const QModelIndex &parent)
158 bool ApiTraceModel::removeRows(int position, int rows,
159 const QModelIndex &parent)
165 beginRemoveRows(parent, position, position + rows - 1);
166 //XXX remove it from ApiTrace
172 void ApiTraceModel::setApiTrace(ApiTrace *trace)
174 if (m_trace == trace)
179 connect(m_trace, SIGNAL(framesInvalidated()),
180 this, SLOT(invalidateFrames()));
181 connect(m_trace, SIGNAL(framesAdded(int, int)),
182 this, SLOT(appendFrames(int, int)));
185 const ApiTrace * ApiTraceModel::apiTrace() const
190 void ApiTraceModel::invalidateFrames()
196 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
198 beginInsertRows(QModelIndex(), oldCount,
199 oldCount + numAdded - 1);
203 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
205 if (!index.isValid())
207 return static_cast<ApiTraceEvent*>(index.internalPointer());
210 void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
215 if (event->type() == ApiTraceEvent::Call) {
216 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
217 ApiTraceFrame *frame = call->parentFrame;
218 int row = frame->calls.indexOf(call);
219 QModelIndex index = createIndex(row, 0, call);
220 emit dataChanged(index, index);
221 } else if (event->type() == ApiTraceEvent::Frame) {
222 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
223 const QList<ApiTraceFrame*> frames = m_trace->frames();
224 int row = frames.indexOf(frame);
225 QModelIndex index = createIndex(row, 0, frame);
226 emit dataChanged(index, index);
230 #include "apitracemodel.moc"