1 #include "apitracemodel.h"
3 #include "apitracecall.h"
4 #include "traceloader.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 Qt::ToolTipRole: {
42 const QString stateText = tr("State info available.");
43 if (itm->type() == ApiTraceEvent::Call) {
44 ApiTraceCall *call = static_cast<ApiTraceCall*>(itm);
45 if (!call->hasState())
46 return QString::fromLatin1("%1) <b>%2</b>")
50 return QString::fromLatin1("%1) <b>%2</b><br/>%3")
55 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(itm);
56 QString text = QObject::tr("%1) Frame ")
58 int binaryDataSize = frame->binaryDataSize() / 1024;
59 if (!frame->hasState())
61 "<b>%1 </b>(binary data size = %2kB)")
66 "<b>%1 (binary data size = %2kB)</b>"
73 case ApiTraceModel::EventRole:
74 return QVariant::fromValue(itm);
80 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
85 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
88 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
91 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
106 QModelIndex ApiTraceModel::index(int row, int column,
107 const QModelIndex &parent) const
109 if ((parent.isValid() && parent.column() != 0) || column != 0)
110 return QModelIndex();
112 ApiTraceEvent *event = item(parent);
114 if (event->type() != ApiTraceEvent::Frame) {
115 qDebug()<<"got a valid parent but it's not a frame "<<event->type();
116 return QModelIndex();
118 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
119 ApiTraceCall *call = frame->call(row);
121 return createIndex(row, column, call);
123 return QModelIndex();
125 ApiTraceFrame *frame = m_trace->frameAt(row);
127 return createIndex(row, column, frame);
129 return QModelIndex();
131 return QModelIndex();
134 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
136 if (parent.isValid()) {
137 ApiTraceEvent *event = item(parent);
138 if (event && event->type() == ApiTraceEvent::Frame) {
139 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
140 return !frame->isEmpty();
144 return (rowCount() > 0);
148 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
150 if (!index.isValid())
151 return QModelIndex();
153 ApiTraceEvent *event = item(index);
154 if (event && event->type() == ApiTraceEvent::Call) {
155 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
156 Q_ASSERT(call->parentFrame());
157 return createIndex(call->parentFrame()->number,
158 0, call->parentFrame());
160 return QModelIndex();
163 int ApiTraceModel::rowCount(const QModelIndex &parent) const
165 if (!parent.isValid())
166 return m_trace->numFrames();
168 ApiTraceEvent *event = item(parent);
169 if (!event || event->type() == ApiTraceEvent::Call)
172 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
174 return frame->numChildren();
179 int ApiTraceModel::columnCount(const QModelIndex &parent) const
184 bool ApiTraceModel::insertRows(int position, int rows,
185 const QModelIndex &parent)
190 bool ApiTraceModel::removeRows(int position, int rows,
191 const QModelIndex &parent)
197 beginRemoveRows(parent, position, position + rows - 1);
198 //XXX remove it from ApiTrace
204 void ApiTraceModel::setApiTrace(ApiTrace *trace)
206 if (m_trace == trace)
211 connect(m_trace, SIGNAL(invalidated()),
212 this, SLOT(invalidateFrames()));
213 connect(m_trace, SIGNAL(framesInvalidated()),
214 this, SLOT(invalidateFrames()));
215 connect(m_trace, SIGNAL(beginAddingFrames(int, int)),
216 this, SLOT(beginAddingFrames(int, int)));
217 connect(m_trace, SIGNAL(endAddingFrames()),
218 this, SLOT(endAddingFrames()));
219 connect(m_trace, SIGNAL(changed(ApiTraceCall*)),
220 this, SLOT(callChanged(ApiTraceCall*)));
221 connect(m_trace, SIGNAL(beginLoadingFrame(ApiTraceFrame*,int)),
222 this, SLOT(beginLoadingFrame(ApiTraceFrame*,int)));
223 connect(m_trace, SIGNAL(endLoadingFrame(ApiTraceFrame*)),
224 this, SLOT(endLoadingFrame(ApiTraceFrame*)));
228 const ApiTrace * ApiTraceModel::apiTrace() const
233 void ApiTraceModel::invalidateFrames()
239 void ApiTraceModel::beginAddingFrames(int oldCount, int numAdded)
241 beginInsertRows(QModelIndex(), oldCount,
242 oldCount + numAdded - 1);
245 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
247 if (!index.isValid())
249 return static_cast<ApiTraceEvent*>(index.internalPointer());
252 void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
257 if (event->type() == ApiTraceEvent::Call) {
258 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
259 ApiTraceFrame *frame = call->parentFrame();
260 int row = frame->callIndex(call);
261 QModelIndex index = createIndex(row, 0, call);
262 emit dataChanged(index, index);
263 } else if (event->type() == ApiTraceEvent::Frame) {
264 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
265 const QList<ApiTraceFrame*> frames = m_trace->frames();
266 int row = frames.indexOf(frame);
267 QModelIndex index = createIndex(row, 0, frame);
268 emit dataChanged(index, index);
272 QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const
275 return QModelIndex();
278 ApiTraceFrame *frame = call->parentFrame();
281 int row = frame->callIndex(call);
283 qDebug() << "Couldn't find call num "<<call->index()<<" inside parent!";
284 return QModelIndex();
286 return createIndex(row, 0, call);
289 void ApiTraceModel::callChanged(ApiTraceCall *call)
291 ApiTrace *trace = call->parentFrame()->parentTrace();
294 qDebug()<<"Call changed = "<<call->edited();
295 qDebug()<<"\ttrace edited = "<<trace->edited();
296 qDebug()<<"\ttrace file = "<<trace->fileName();
297 qDebug()<<"\ttrace needs saving = "<<trace->needsSaving();
301 if (trace->needsSaving())
304 ApiTraceFrame *frame = call->parentFrame();
305 int row = frame->callIndex(call);
306 QModelIndex index = createIndex(row, 0, call);
307 emit dataChanged(index, index);
310 void ApiTraceModel::endAddingFrames()
315 bool ApiTraceModel::canFetchMore(const QModelIndex &parent) const
317 if (parent.isValid()) {
318 ApiTraceEvent *event = item(parent);
319 if (event && event->type() == ApiTraceEvent::Frame) {
320 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
321 return !frame->loaded() && !m_loadingFrames.contains(frame);
329 void ApiTraceModel::fetchMore(const QModelIndex &parent)
331 if (parent.isValid()) {
332 ApiTraceEvent *event = item(parent);
333 if (event && event->type() == ApiTraceEvent::Frame) {
334 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
335 QModelIndex index = createIndex(frame->number, 0, frame);
337 Q_ASSERT(!frame->loaded());
338 m_loadingFrames.insert(frame);
340 m_trace->loadFrame(frame);
345 void ApiTraceModel::beginLoadingFrame(ApiTraceFrame *frame, int numAdded)
347 QModelIndex index = createIndex(frame->number, 0, frame);
348 beginInsertRows(index, 0, numAdded - 1);
351 void ApiTraceModel::endLoadingFrame(ApiTraceFrame *frame)
353 QModelIndex index = createIndex(frame->number, 0, frame);
355 qDebug()<<"Frame loaded = "<<frame->loaded();
356 qDebug()<<"\tframe idx = "<<frame->number;
357 qDebug()<<"\tis empty = "<<frame->isEmpty();
358 qDebug()<<"\tnum children = "<<frame->numChildren();
359 qDebug()<<"\tindex is "<<index;
364 emit dataChanged(index, index);
366 m_loadingFrames.remove(frame);
369 #include "apitracemodel.moc"