]> git.cworth.org Git - apitrace/blob - gui/apitracemodel.cpp
add lots of quirks and details view
[apitrace] / gui / apitracemodel.cpp
1 #include "apitracemodel.h"
2
3 #include "apitracecall.h"
4 #include "loaderthread.h"
5 #include "trace_parser.hpp"
6
7 #include <QDebug>
8 #include <QVariant>
9
10
11 ApiTraceModel::ApiTraceModel(QObject *parent)
12     : QAbstractItemModel(parent)
13 {
14     m_loader = new LoaderThread();
15
16     connect(m_loader, SIGNAL(parsedCalls(const QList<Trace::Call*>&)),
17             SLOT(appendCalls(const QList<Trace::Call*>&)));
18 }
19
20 ApiTraceModel::~ApiTraceModel()
21 {
22     qDeleteAll(m_calls);
23     delete m_loader;
24 }
25
26 QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
27 {
28     if (!index.isValid())
29         return QVariant();
30
31     if (role != Qt::DisplayRole)
32         return QVariant();
33
34     ApiTraceCall *item = m_calls.value(index.row());
35
36     if (!item)
37         return QVariant();
38
39     switch (index.column()) {
40     case 0: {
41         return QVariant::fromValue(item);
42     }
43     default:
44         return QVariant();
45     }
46 }
47
48 Qt::ItemFlags ApiTraceModel::flags(const QModelIndex &index) const
49 {
50     if (!index.isValid())
51         return 0;
52
53     return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
54 }
55
56 QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
57                                    int role ) const
58 {
59     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
60         switch (section) {
61         case 0:
62             return tr("Function");
63         default:
64             //fall through
65             break;
66         }
67     }
68
69     return QVariant();
70 }
71
72 QModelIndex ApiTraceModel::index(int row, int column,
73                                  const QModelIndex &parent) const
74 {
75     if (parent.isValid() && parent.column() != 0)
76         return QModelIndex();
77
78     ApiTraceCall *call = m_calls.value(row);
79
80     if (call)
81         return createIndex(row, column, call);
82     else
83         return QModelIndex();
84 }
85
86 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
87 {
88     return parent.isValid() ? false : (rowCount() > 0);
89 }
90
91 QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
92 {
93     if (!index.isValid())
94         return QModelIndex();
95
96     //list for now
97     return QModelIndex();
98 }
99
100 int ApiTraceModel::rowCount(const QModelIndex &parent) const
101 {
102     return m_calls.count();
103 }
104
105 int ApiTraceModel::columnCount(const QModelIndex &parent) const
106 {
107     return parent.isValid() ? 0 : 1;
108 }
109
110
111 bool ApiTraceModel::insertRows(int position, int rows,
112                                const QModelIndex &parent)
113 {
114     return false;
115 }
116
117 bool ApiTraceModel::removeRows(int position, int rows,
118                                const QModelIndex &parent)
119 {
120     bool success = true;
121
122     Q_UNUSED(parent);
123
124     if (m_calls.count() <= position)
125         return false;
126
127     beginRemoveRows(parent, position, position + rows - 1);
128     for (int i = 0; i < rows; ++i) {
129         ApiTraceCall *call = m_calls.value(i);
130         m_calls.removeAt(i);
131         delete call;
132     }
133     endRemoveRows();
134
135     return success;
136 }
137
138 void ApiTraceModel::loadTraceFile(const QString &fileName)
139 {
140     if (m_loader->isRunning()) {
141         m_loader->terminate();
142         m_loader->wait();
143     }
144     removeRows(0, m_calls.count(), QModelIndex());
145
146     m_loader->loadFile(fileName);
147 }
148
149 void ApiTraceModel::appendCalls(const QList<Trace::Call*> traceCalls)
150 {
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);
156
157         QString argumentsText;
158         for (int i = 0; i < call->sig->arg_names.size(); ++i) {
159             apiCall->argNames +=
160                 QString::fromStdString(call->sig->arg_names[i]);
161         }
162         if (call->ret) {
163             VariantVisitor retVisitor;
164             call->ret->visit(retVisitor);
165             apiCall->returnValue = retVisitor.variant();
166         }
167         for (int i = 0; i < call->args.size(); ++i) {
168             VariantVisitor argVisitor;
169             call->args[i]->visit(argVisitor);
170             apiCall->argValues += argVisitor.variant();
171         }
172
173         m_calls.append(apiCall);
174     }
175     endInsertRows();
176
177     qDeleteAll(traceCalls);
178 }
179
180 #include "apitracemodel.moc"