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()) {
42 str += QString::number(index.row());
43 str += QLatin1String(") ");
45 str += QLatin1String("(");
46 for (int i = 0; i < item->argNames.count(); ++i) {
47 str += item->argNames[i];
48 str += QString::fromLatin1(" = ");
49 str += apiVariantToString(item->argValues[i]);
50 if (i < item->argNames.count() - 1)
51 str += QString::fromLatin1(", ");
53 str += QLatin1String(")");
55 if (item->returnValue.isValid()) {
56 str += QLatin1String(" = ");
57 str += apiVariantToString(item->returnValue);
66 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
71 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
74 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
77 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
80 return tr("Function");
90 QModelIndex ApiTraceModel::index(int row, int column,
91 const QModelIndex &parent) const
93 if (parent.isValid() && parent.column() != 0)
96 ApiTraceCall *call = m_calls.value(row);
99 return createIndex(row, column, call);
101 return QModelIndex();
104 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
106 return parent.isValid() ? false : (rowCount() > 0);
109 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
111 if (!index.isValid())
112 return QModelIndex();
115 return QModelIndex();
118 int ApiTraceModel::rowCount(const QModelIndex &parent) const
120 return m_calls.count();
123 int ApiTraceModel::columnCount(const QModelIndex &parent) const
125 return parent.isValid() ? 0 : 1;
129 bool ApiTraceModel::insertRows(int position, int rows,
130 const QModelIndex &parent)
135 bool ApiTraceModel::removeRows(int position, int rows,
136 const QModelIndex &parent)
142 if (m_calls.count() <= position)
145 beginRemoveRows(parent, position, position + rows - 1);
146 for (int i = 0; i < rows; ++i) {
147 ApiTraceCall *call = m_calls.value(i);
156 void ApiTraceModel::loadTraceFile(const QString &fileName)
158 if (m_loader->isRunning()) {
159 m_loader->terminate();
162 removeRows(0, m_calls.count(), QModelIndex());
164 m_loader->loadFile(fileName);
167 void ApiTraceModel::appendCalls(const QList<Trace::Call*> traceCalls)
169 beginInsertRows(QModelIndex(), m_calls.count(),
170 m_calls.count() + traceCalls.count());
171 foreach(Trace::Call *call, traceCalls) {
172 ApiTraceCall *apiCall = new ApiTraceCall;
173 apiCall->name = QString::fromStdString(call->sig->name);
175 QString argumentsText;
176 for (int i = 0; i < call->sig->arg_names.size(); ++i) {
178 QString::fromStdString(call->sig->arg_names[i]);
181 VariantVisitor retVisitor;
182 call->ret->visit(retVisitor);
183 apiCall->returnValue = retVisitor.variant();
185 for (int i = 0; i < call->args.size(); ++i) {
186 VariantVisitor argVisitor;
187 call->args[i]->visit(argVisitor);
188 apiCall->argValues += argVisitor.variant();
191 m_calls.append(apiCall);
195 qDeleteAll(traceCalls);
198 #include "apitracemodel.moc"