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("<b>%1</b>").arg(call->name);
48 return QString::fromLatin1("<b>%1</b><br/>%2")
52 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(itm);
53 QString text = frame->staticText().text();
54 if (frame->state().isEmpty())
55 return QString::fromLatin1("<b>%1</b>").arg(text);
57 return QString::fromLatin1("<b>%1</b><br/>%2")
62 case ApiTraceModel::EventRole:
63 return QVariant::fromValue(itm);
69 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
74 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
77 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
80 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
95 QModelIndex ApiTraceModel::index(int row, int column,
96 const QModelIndex &parent) const
98 if (parent.isValid() && parent.column() != 0)
101 ApiTraceEvent *event = item(parent);
103 if (event->type() != ApiTraceEvent::Frame) {
104 qDebug()<<"got a valid parent but it's not a frame "<<event->type();
105 return QModelIndex();
107 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
108 ApiTraceCall *call = frame->calls.value(row);
110 return createIndex(row, column, call);
112 return QModelIndex();
114 ApiTraceFrame *frame = m_trace->frameAt(row);
116 return createIndex(row, column, frame);
118 return QModelIndex();
120 return QModelIndex();
123 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
125 if (parent.isValid()) {
126 ApiTraceEvent *event = item(parent);
127 if (event && event->type() == ApiTraceEvent::Frame) {
128 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
129 return !frame->calls.isEmpty();
133 return (rowCount() > 0);
137 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
139 if (!index.isValid())
140 return QModelIndex();
142 ApiTraceEvent *event = item(index);
143 if (event && event->type() == ApiTraceEvent::Call) {
144 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
145 Q_ASSERT(call->parentFrame);
146 return createIndex(call->parentFrame->number,
147 0, call->parentFrame);
149 return QModelIndex();
152 int ApiTraceModel::rowCount(const QModelIndex &parent) const
154 if (!parent.isValid())
155 return m_trace->numFrames();
157 ApiTraceEvent *event = item(parent);
158 if (!event || event->type() == ApiTraceEvent::Call)
161 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
163 return frame->calls.count();
168 int ApiTraceModel::columnCount(const QModelIndex &parent) const
173 bool ApiTraceModel::insertRows(int position, int rows,
174 const QModelIndex &parent)
179 bool ApiTraceModel::removeRows(int position, int rows,
180 const QModelIndex &parent)
186 beginRemoveRows(parent, position, position + rows - 1);
187 //XXX remove it from ApiTrace
193 void ApiTraceModel::setApiTrace(ApiTrace *trace)
195 if (m_trace == trace)
200 connect(m_trace, SIGNAL(framesInvalidated()),
201 this, SLOT(invalidateFrames()));
202 connect(m_trace, SIGNAL(framesAdded(int, int)),
203 this, SLOT(appendFrames(int, int)));
206 const ApiTrace * ApiTraceModel::apiTrace() const
211 void ApiTraceModel::invalidateFrames()
217 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
219 beginInsertRows(QModelIndex(), oldCount,
220 oldCount + numAdded - 1);
224 ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
226 if (!index.isValid())
228 return static_cast<ApiTraceEvent*>(index.internalPointer());
231 void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
236 if (event->type() == ApiTraceEvent::Call) {
237 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
238 ApiTraceFrame *frame = call->parentFrame;
239 int row = frame->calls.indexOf(call);
240 QModelIndex index = createIndex(row, 0, call);
241 emit dataChanged(index, index);
242 } else if (event->type() == ApiTraceEvent::Frame) {
243 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
244 const QList<ApiTraceFrame*> frames = m_trace->frames();
245 int row = frames.indexOf(frame);
246 QModelIndex index = createIndex(row, 0, frame);
247 emit dataChanged(index, index);
251 #include "apitracemodel.moc"