1 #include "apitracemodel.h"
3 #include "apitracecall.h"
4 #include "loaderthread.h"
5 #include "trace_parser.hpp"
11 ApiTraceModel::ApiTraceModel(QObject *parent)
12 : QAbstractItemModel(parent)
14 m_loader = new LoaderThread();
16 connect(m_loader, SIGNAL(parsedCalls(const QList<Trace::Call*>&)),
17 SLOT(appendCalls(const QList<Trace::Call*>&)));
20 ApiTraceModel::~ApiTraceModel()
26 QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
31 if (role != Qt::DisplayRole)
34 ApiTraceCall *item = m_calls.value(index.row());
39 switch (index.column()) {
41 return QVariant::fromValue(item);
48 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
53 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
56 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
59 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
62 return tr("Function");
72 QModelIndex ApiTraceModel::index(int row, int column,
73 const QModelIndex &parent) const
75 if (parent.isValid() && parent.column() != 0)
78 ApiTraceCall *call = m_calls.value(row);
81 return createIndex(row, column, call);
86 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
88 return parent.isValid() ? false : (rowCount() > 0);
91 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
100 int ApiTraceModel::rowCount(const QModelIndex &parent) const
102 return m_calls.count();
105 int ApiTraceModel::columnCount(const QModelIndex &parent) const
107 return parent.isValid() ? 0 : 1;
111 bool ApiTraceModel::insertRows(int position, int rows,
112 const QModelIndex &parent)
117 bool ApiTraceModel::removeRows(int position, int rows,
118 const QModelIndex &parent)
124 if (m_calls.count() <= position)
127 beginRemoveRows(parent, position, position + rows - 1);
128 for (int i = 0; i < rows; ++i) {
129 ApiTraceCall *call = m_calls.value(i);
138 void ApiTraceModel::loadTraceFile(const QString &fileName)
140 if (m_loader->isRunning()) {
141 m_loader->terminate();
144 removeRows(0, m_calls.count(), QModelIndex());
146 m_loader->loadFile(fileName);
149 void ApiTraceModel::appendCalls(const QList<Trace::Call*> traceCalls)
151 beginInsertRows(QModelIndex(), m_calls.count(),
152 m_calls.count() + traceCalls.count());
153 foreach(Trace::Call *call, traceCalls) {
154 ApiTraceCall *apiCall = new ApiTraceCall;
155 apiCall->name = QString::fromStdString(call->sig->name);
157 QString argumentsText;
158 for (int i = 0; i < call->sig->arg_names.size(); ++i) {
160 QString::fromStdString(call->sig->arg_names[i]);
163 VariantVisitor retVisitor;
164 call->ret->visit(retVisitor);
165 apiCall->returnValue = retVisitor.variant();
167 for (int i = 0; i < call->args.size(); ++i) {
168 VariantVisitor argVisitor;
169 call->args[i]->visit(argVisitor);
170 apiCall->argValues += argVisitor.variant();
173 m_calls.append(apiCall);
177 qDeleteAll(traceCalls);
180 #include "apitracemodel.moc"