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 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*)));
223 const ApiTrace * ApiTraceModel::apiTrace() const
228 void ApiTraceModel::invalidateFrames()
234 void ApiTraceModel::beginAddingFrames(int oldCount, int numAdded)
236 beginInsertRows(QModelIndex(), oldCount,
237 oldCount + numAdded - 1);
240 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
242 if (!index.isValid())
244 return static_cast<ApiTraceEvent*>(index.internalPointer());
247 void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
252 if (event->type() == ApiTraceEvent::Call) {
253 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
254 ApiTraceFrame *frame = call->parentFrame();
255 int row = frame->callIndex(call);
256 QModelIndex index = createIndex(row, 0, call);
257 emit dataChanged(index, index);
258 } else if (event->type() == ApiTraceEvent::Frame) {
259 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
260 const QList<ApiTraceFrame*> frames = m_trace->frames();
261 int row = frames.indexOf(frame);
262 QModelIndex index = createIndex(row, 0, frame);
263 emit dataChanged(index, index);
267 QModelIndex ApiTraceModel::callIndex(int callNum) const
269 ApiTraceCall *call = m_trace->callWithIndex(callNum);
270 return indexForCall(call);
273 QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const
276 return QModelIndex();
279 ApiTraceFrame *frame = call->parentFrame();
282 int row = frame->callIndex(call);
284 qDebug() << "Couldn't find call num "<<call->index()<<" inside parent!";
285 return QModelIndex();
287 return createIndex(row, 0, call);
290 void ApiTraceModel::callChanged(ApiTraceCall *call)
292 ApiTrace *trace = call->parentFrame()->parentTrace();
295 qDebug()<<"Call changed = "<<call->edited();
296 qDebug()<<"\ttrace edited = "<<trace->edited();
297 qDebug()<<"\ttrace file = "<<trace->fileName();
298 qDebug()<<"\ttrace needs saving = "<<trace->needsSaving();
302 if (trace->needsSaving())
305 ApiTraceFrame *frame = call->parentFrame();
306 int row = frame->callIndex(call);
307 QModelIndex index = createIndex(row, 0, call);
308 emit dataChanged(index, index);
311 void ApiTraceModel::endAddingFrames()
316 #include "apitracemodel.moc"