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->state().isEmpty())
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 = frame->staticText().text();
57 if (frame->state().isEmpty())
58 return QString::fromLatin1("<b>%1</b>").arg(text);
60 return QString::fromLatin1("<b>%1</b><br/>%2")
65 case ApiTraceModel::EventRole:
66 return QVariant::fromValue(itm);
72 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
77 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
80 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
83 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
98 QModelIndex ApiTraceModel::index(int row, int column,
99 const QModelIndex &parent) const
101 if (parent.isValid() && parent.column() != 0)
102 return QModelIndex();
104 ApiTraceEvent *event = item(parent);
106 if (event->type() != ApiTraceEvent::Frame) {
107 qDebug()<<"got a valid parent but it's not a frame "<<event->type();
108 return QModelIndex();
110 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
111 ApiTraceCall *call = frame->calls.value(row);
113 return createIndex(row, column, call);
115 return QModelIndex();
117 ApiTraceFrame *frame = m_trace->frameAt(row);
119 return createIndex(row, column, frame);
121 return QModelIndex();
123 return QModelIndex();
126 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
128 if (parent.isValid()) {
129 ApiTraceEvent *event = item(parent);
130 if (event && event->type() == ApiTraceEvent::Frame) {
131 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
132 return !frame->calls.isEmpty();
136 return (rowCount() > 0);
140 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
142 if (!index.isValid())
143 return QModelIndex();
145 ApiTraceEvent *event = item(index);
146 if (event && event->type() == ApiTraceEvent::Call) {
147 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
148 Q_ASSERT(call->parentFrame);
149 return createIndex(call->parentFrame->number,
150 0, call->parentFrame);
152 return QModelIndex();
155 int ApiTraceModel::rowCount(const QModelIndex &parent) const
157 if (!parent.isValid())
158 return m_trace->numFrames();
160 ApiTraceEvent *event = item(parent);
161 if (!event || event->type() == ApiTraceEvent::Call)
164 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
166 return frame->calls.count();
171 int ApiTraceModel::columnCount(const QModelIndex &parent) const
176 bool ApiTraceModel::insertRows(int position, int rows,
177 const QModelIndex &parent)
182 bool ApiTraceModel::removeRows(int position, int rows,
183 const QModelIndex &parent)
189 beginRemoveRows(parent, position, position + rows - 1);
190 //XXX remove it from ApiTrace
196 void ApiTraceModel::setApiTrace(ApiTrace *trace)
198 if (m_trace == trace)
203 connect(m_trace, SIGNAL(invalidated()),
204 this, SLOT(invalidateFrames()));
205 connect(m_trace, SIGNAL(framesInvalidated()),
206 this, SLOT(invalidateFrames()));
207 connect(m_trace, SIGNAL(framesAdded(int, int)),
208 this, SLOT(appendFrames(int, int)));
211 const ApiTrace * ApiTraceModel::apiTrace() const
216 void ApiTraceModel::invalidateFrames()
222 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
224 beginInsertRows(QModelIndex(), oldCount,
225 oldCount + numAdded - 1);
229 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
231 if (!index.isValid())
233 return static_cast<ApiTraceEvent*>(index.internalPointer());
236 void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
241 if (event->type() == ApiTraceEvent::Call) {
242 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
243 ApiTraceFrame *frame = call->parentFrame;
244 int row = frame->calls.indexOf(call);
245 QModelIndex index = createIndex(row, 0, call);
246 emit dataChanged(index, index);
247 } else if (event->type() == ApiTraceEvent::Frame) {
248 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
249 const QList<ApiTraceFrame*> frames = m_trace->frames();
250 int row = frames.indexOf(frame);
251 QModelIndex index = createIndex(row, 0, frame);
252 emit dataChanged(index, index);
256 QModelIndex ApiTraceModel::callIndex(int callNum) const
258 ApiTraceCall *call = m_trace->callWithIndex(callNum);
259 return indexForCall(call);
262 QModelIndex ApiTraceModel::indexForCall(ApiTraceCall *call) const
265 return QModelIndex();
268 ApiTraceFrame *frame = call->parentFrame;
271 int row = frame->calls.indexOf(call);
273 qDebug() << "Couldn't find call num "<<call->index<<" inside parent!";
274 return QModelIndex();
276 return createIndex(row, 0, call);
279 #include "apitracemodel.moc"