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(framesInvalidated()),
204 this, SLOT(invalidateFrames()));
205 connect(m_trace, SIGNAL(framesAdded(int, int)),
206 this, SLOT(appendFrames(int, int)));
209 const ApiTrace * ApiTraceModel::apiTrace() const
214 void ApiTraceModel::invalidateFrames()
220 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
222 beginInsertRows(QModelIndex(), oldCount,
223 oldCount + numAdded - 1);
227 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
229 if (!index.isValid())
231 return static_cast<ApiTraceEvent*>(index.internalPointer());
234 void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
239 if (event->type() == ApiTraceEvent::Call) {
240 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
241 ApiTraceFrame *frame = call->parentFrame;
242 int row = frame->calls.indexOf(call);
243 QModelIndex index = createIndex(row, 0, call);
244 emit dataChanged(index, index);
245 } else if (event->type() == ApiTraceEvent::Frame) {
246 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
247 const QList<ApiTraceFrame*> frames = m_trace->frames();
248 int row = frames.indexOf(frame);
249 QModelIndex index = createIndex(row, 0, frame);
250 emit dataChanged(index, index);
254 #include "apitracemodel.moc"