]> git.cworth.org Git - apitrace/blob - gui/apitracecall.h
Implement grouping of calls.
[apitrace] / gui / apitracecall.h
1 #ifndef APITRACECALL_H
2 #define APITRACECALL_H
3
4 #include "apisurface.h"
5
6 #include <QStaticText>
7 #include <QStringList>
8 #include <QUrl>
9 #include <QVariant>
10
11 #include "trace_model.hpp"
12
13
14 class ApiTrace;
15 class TraceLoader;
16
17 class VariantVisitor : public trace::Visitor
18 {
19 public:
20     VariantVisitor(TraceLoader *loader)
21         : m_loader(loader)
22     {}
23     virtual void visit(trace::Null *);
24     virtual void visit(trace::Bool *node);
25     virtual void visit(trace::SInt *node);
26     virtual void visit(trace::UInt *node);
27     virtual void visit(trace::Float *node);
28     virtual void visit(trace::Double *node);
29     virtual void visit(trace::String *node);
30     virtual void visit(trace::Enum *e);
31     virtual void visit(trace::Bitmask *bitmask);
32     virtual void visit(trace::Struct *str);
33     virtual void visit(trace::Array *array);
34     virtual void visit(trace::Blob *blob);
35     virtual void visit(trace::Pointer *ptr);
36     virtual void visit(trace::Repr *ptr);
37
38     QVariant variant() const
39     {
40         return m_variant;
41     }
42 private:
43     TraceLoader *m_loader;
44     QVariant m_variant;
45 };
46
47
48 struct ApiTraceError
49 {
50     int callIndex;
51     QString type;
52     QString message;
53 };
54
55 class ApiTraceEnumSignature
56 {
57 public:
58     ApiTraceEnumSignature(const trace::EnumSig *sig);
59
60     QString name(signed long long value) const;
61
62 private:
63     typedef QList<QPair<QString, signed long long> > ValueList;
64     ValueList m_names;
65 };
66
67 class ApiEnum
68 {
69 public:
70     ApiEnum(ApiTraceEnumSignature *sig=0, signed long long value = 0);
71
72     QString toString() const;
73
74     QVariant value() const;
75     QString name() const;
76 private:
77     ApiTraceEnumSignature *m_sig;
78     signed long long m_value;
79 };
80 Q_DECLARE_METATYPE(ApiEnum);
81
82 class ApiPointer
83 {
84 public:
85     ApiPointer(unsigned long long val=0);
86
87     QString toString() const;
88
89     unsigned long long value() const;
90
91 private:
92     unsigned long long m_value;
93 };
94 Q_DECLARE_METATYPE(ApiPointer);
95
96 class ApiBitmask
97 {
98 public:
99     typedef QList<QPair<QString, unsigned long long> > Signature;
100
101     ApiBitmask(const trace::Bitmask *bitmask = 0);
102
103     QString toString() const;
104
105     unsigned long long value() const;
106     Signature signature() const;
107
108 private:
109     void init(const trace::Bitmask *bitmask);
110 private:
111     Signature m_sig;
112     unsigned long long m_value;
113 };
114 Q_DECLARE_METATYPE(ApiBitmask);
115
116 class ApiStruct
117 {
118 public:
119     struct Signature {
120         QString name;
121         QStringList memberNames;
122     };
123
124     ApiStruct(const trace::Struct *s = 0);
125
126     QString toString(bool multiLine = false) const;
127     Signature signature() const;
128     QList<QVariant> values() const;
129
130 private:
131     void init(const trace::Struct *bitmask);
132 private:
133     Signature m_sig;
134     QList<QVariant> m_members;
135 };
136 Q_DECLARE_METATYPE(ApiStruct);
137
138 class ApiArray
139 {
140 public:
141     ApiArray(const trace::Array *arr = 0);
142     ApiArray(const QVector<QVariant> &vals);
143
144     QString toString(bool multiLine = false) const;
145
146     QVector<QVariant> values() const;
147 private:
148     void init(const trace::Array *arr);
149 private:
150     QVector<QVariant> m_array;
151 };
152 Q_DECLARE_METATYPE(ApiArray);
153
154
155 QString apiVariantToString(const QVariant &variant, bool multiLine = false);
156
157 class ApiTraceFrame;
158
159 class ApiTraceState {
160 public:
161     ApiTraceState();
162     explicit ApiTraceState(const QVariantMap &parseJson);
163
164     bool isEmpty() const;
165     const QVariantMap & parameters() const;
166     const QMap<QString, QString> & shaderSources() const;
167     const QVariantMap & uniforms() const;
168     const QList<ApiTexture> & textures() const;
169     const QList<ApiFramebuffer> & framebuffers() const;
170
171     ApiFramebuffer colorBuffer() const;
172 private:
173     QVariantMap m_parameters;
174     QMap<QString, QString> m_shaderSources;
175     QVariantMap m_uniforms;
176     QList<ApiTexture> m_textures;
177     QList<ApiFramebuffer> m_framebuffers;
178 };
179 Q_DECLARE_METATYPE(ApiTraceState);
180
181 class ApiTraceCallSignature
182 {
183 public:
184     ApiTraceCallSignature(const QString &name,
185                           const QStringList &argNames);
186     ~ApiTraceCallSignature();
187
188     QString name() const
189     {
190         return m_name;
191     }
192     QStringList argNames() const
193     {
194         return m_argNames;
195     }
196
197     QUrl helpUrl() const;
198     void setHelpUrl(const QUrl &url);
199
200 private:
201     QString m_name;
202     QStringList m_argNames;
203     QUrl m_helpUrl;
204 };
205
206 class ApiTraceCall;
207
208 class ApiTraceEvent
209 {
210 public:
211     enum Type {
212         None  = 0,
213         Call  = 1 << 0,
214         Frame = 1 << 1
215     };
216 public:
217     ApiTraceEvent();
218     ApiTraceEvent(Type t);
219     virtual ~ApiTraceEvent();
220
221     Type type() const { return (Type)m_type; }
222
223     virtual QStaticText staticText() const = 0;
224     virtual int numChildren() const = 0;
225     virtual int callIndex(ApiTraceCall *call) const = 0;
226     virtual ApiTraceEvent *eventAtRow(int row) const = 0;
227
228     QVariantMap stateParameters() const;
229     ApiTraceState *state() const;
230     void setState(ApiTraceState *state);
231     bool hasState() const
232     {
233         return m_state && !m_state->isEmpty();
234     }
235
236 protected:
237     int m_type : 4;
238     mutable bool m_hasBinaryData;
239     mutable int m_binaryDataIndex:8;
240     ApiTraceState *m_state;
241
242     mutable QStaticText *m_staticText;
243 };
244 Q_DECLARE_METATYPE(ApiTraceEvent*);
245
246 class ApiTraceCall : public ApiTraceEvent
247 {
248 public:
249     ApiTraceCall(ApiTraceCall *parentCall, TraceLoader *loader,
250                  const trace::Call *tcall);
251     ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader,
252                  const trace::Call *tcall);
253     ~ApiTraceCall();
254
255     int index() const;
256     QString name() const;
257     QStringList argNames() const;
258     QVector<QVariant> arguments() const;
259     QVariant returnValue() const;
260     trace::CallFlags flags() const;
261     QUrl helpUrl() const;
262     void setHelpUrl(const QUrl &url);
263     ApiTraceFrame *parentFrame()const;
264     void setParentFrame(ApiTraceFrame *frame);
265
266     int callIndex(ApiTraceCall *call) const;
267
268     ApiTraceEvent *parentEvent() const;
269     ApiTraceCall *parentCall() const;
270     QVector<ApiTraceCall*> children() const;
271     ApiTraceEvent *eventAtRow(int row) const;
272     void addChild(ApiTraceCall *call);
273     void finishedAddingChildren();
274
275     bool hasError() const;
276     QString error() const;
277     void setError(const QString &msg);
278
279     QVector<QVariant> originalValues() const;
280
281     bool edited() const;
282     void setEditedValues(const QVector<QVariant> &lst);
283     QVector<QVariant> editedValues() const;
284     void revert();
285
286     bool contains(const QString &str,
287                   Qt::CaseSensitivity sensitivity) const;
288
289     ApiTrace *parentTrace() const;
290
291     QString toHtml() const;
292     QString searchText() const;
293     QStaticText staticText() const;
294     int numChildren() const;
295     bool hasBinaryData() const;
296     int binaryDataIndex() const;
297
298     QString backtrace() const;
299     void setBacktrace(QString backtrace);
300 private:
301     void loadData(TraceLoader *loader,
302                   const trace::Call *tcall);
303 private:
304     int m_index;
305     ApiTraceCallSignature *m_signature;
306     QVector<QVariant> m_argValues;
307     QVariant m_returnValue;
308     trace::CallFlags m_flags;
309     ApiTraceFrame *m_parentFrame;
310     ApiTraceCall *m_parentCall;
311     QVector<ApiTraceCall*> m_children;
312
313     QVector<QVariant> m_editedValues;
314
315     QString m_error;
316
317     QString m_backtrace;
318
319     mutable QString m_richText;
320     mutable QString m_searchText;
321 };
322 Q_DECLARE_METATYPE(ApiTraceCall*);
323
324 class ApiTraceFrame : public ApiTraceEvent
325 {
326 public:
327     ApiTraceFrame(ApiTrace *parent=0);
328     ~ApiTraceFrame();
329     int number;
330
331     bool isEmpty() const;
332
333     void setParentTrace(ApiTrace *parent);
334     ApiTrace *parentTrace() const;
335
336     void setNumChildren(int num);
337     int numChildren() const;
338     int numChildrenToLoad() const;
339     int numTotalCalls() const;
340     QStaticText staticText() const;
341
342     ApiTraceEvent *eventAtRow(int row) const;
343     int callIndex(ApiTraceCall *call) const;
344     ApiTraceCall *callWithIndex(int index) const;
345     QVector<ApiTraceCall*> calls() const;
346     void setCalls(const QVector<ApiTraceCall*> &topLevelCalls,
347                   const QVector<ApiTraceCall*> &allCalls,
348                   quint64 binaryDataSize);
349
350     ApiTraceCall *findNextCall(ApiTraceCall *from,
351                                const QString &str,
352                                Qt::CaseSensitivity sensitivity) const;
353
354     ApiTraceCall *findPrevCall(ApiTraceCall *from,
355                                const QString &str,
356                                Qt::CaseSensitivity sensitivity) const;
357
358     int binaryDataSize() const;
359
360     bool isLoaded() const;
361
362     void setLastCallIndex(unsigned index);
363     unsigned lastCallIndex() const;
364
365     void setThumbnail(const QImage & thumbnail);
366     const QImage & thumbnail() const;
367
368 private:
369     ApiTrace *m_parentTrace;
370     quint64 m_binaryDataSize;
371     QVector<ApiTraceCall*> m_children;
372     QVector<ApiTraceCall*> m_calls;
373     bool m_loaded;
374     unsigned m_callsToLoad;
375     unsigned m_lastCallIndex;
376     QImage m_thumbnail;
377 };
378 Q_DECLARE_METATYPE(ApiTraceFrame*);
379
380
381 #endif