]> git.cworth.org Git - apitrace/blob - gui/apitracecall.h
Introduce call flags.
[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
37     QVariant variant() const
38     {
39         return m_variant;
40     }
41 private:
42     TraceLoader *m_loader;
43     QVariant m_variant;
44 };
45
46
47 struct ApiTraceError
48 {
49     int callIndex;
50     QString type;
51     QString message;
52 };
53
54 class ApiTraceEnumSignature
55 {
56 public:
57     ApiTraceEnumSignature(const QString &name = QString(),
58                           const QVariant &val=QVariant())\
59         : m_name(name),
60           m_value(val)
61     {}
62
63     QVariant value() const { return m_value; }
64     QString name() const { return m_name; }
65 private:
66     QString m_name;
67     QVariant m_value;
68 };
69
70 class ApiEnum
71 {
72 public:
73     ApiEnum(ApiTraceEnumSignature *sig=0);
74
75     QString toString() const;
76
77     QVariant value() const;
78     QString name() const;
79 private:
80     ApiTraceEnumSignature *m_sig;
81 };
82 Q_DECLARE_METATYPE(ApiEnum);
83
84 class ApiPointer
85 {
86 public:
87     ApiPointer(unsigned long long val=0);
88
89     QString toString() const;
90
91     unsigned long long value() const;
92
93 private:
94     unsigned long long m_value;
95 };
96 Q_DECLARE_METATYPE(ApiPointer);
97
98 class ApiBitmask
99 {
100 public:
101     typedef QList<QPair<QString, unsigned long long> > Signature;
102
103     ApiBitmask(const trace::Bitmask *bitmask = 0);
104
105     QString toString() const;
106
107     unsigned long long value() const;
108     Signature signature() const;
109
110 private:
111     void init(const trace::Bitmask *bitmask);
112 private:
113     Signature m_sig;
114     unsigned long long m_value;
115 };
116 Q_DECLARE_METATYPE(ApiBitmask);
117
118 class ApiStruct
119 {
120 public:
121     struct Signature {
122         QString name;
123         QStringList memberNames;
124     };
125
126     ApiStruct(const trace::Struct *s = 0);
127
128     QString toString(bool multiLine = false) const;
129     Signature signature() const;
130     QList<QVariant> values() const;
131
132 private:
133     void init(const trace::Struct *bitmask);
134 private:
135     Signature m_sig;
136     QList<QVariant> m_members;
137 };
138 Q_DECLARE_METATYPE(ApiStruct);
139
140 class ApiArray
141 {
142 public:
143     ApiArray(const trace::Array *arr = 0);
144     ApiArray(const QVector<QVariant> &vals);
145
146     QString toString(bool multiLine = false) const;
147
148     QVector<QVariant> values() const;
149 private:
150     void init(const trace::Array *arr);
151 private:
152     QVector<QVariant> m_array;
153 };
154 Q_DECLARE_METATYPE(ApiArray);
155
156
157 QString apiVariantToString(const QVariant &variant, bool multiLine = false);
158
159 class ApiTraceFrame;
160
161 class ApiTraceState {
162 public:
163     ApiTraceState();
164     explicit ApiTraceState(const QVariantMap &parseJson);
165
166     bool isEmpty() const;
167     const QVariantMap & parameters() const;
168     const QMap<QString, QString> & shaderSources() const;
169     const QVariantMap & uniforms() const;
170     const QList<ApiTexture> & textures() const;
171     const QList<ApiFramebuffer> & framebuffers() const;
172
173     ApiFramebuffer colorBuffer() const;
174 private:
175     QVariantMap m_parameters;
176     QMap<QString, QString> m_shaderSources;
177     QVariantMap m_uniforms;
178     QList<ApiTexture> m_textures;
179     QList<ApiFramebuffer> m_framebuffers;
180 };
181 Q_DECLARE_METATYPE(ApiTraceState);
182
183 class ApiTraceCallSignature
184 {
185 public:
186     ApiTraceCallSignature(const QString &name,
187                           const QStringList &argNames);
188     ~ApiTraceCallSignature();
189
190     QString name() const
191     {
192         return m_name;
193     }
194     QStringList argNames() const
195     {
196         return m_argNames;
197     }
198
199     QUrl helpUrl() const;
200     void setHelpUrl(const QUrl &url);
201
202 private:
203     QString m_name;
204     QStringList m_argNames;
205     QUrl m_helpUrl;
206 };
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
226     QVariantMap stateParameters() const;
227     ApiTraceState *state() const;
228     void setState(ApiTraceState *state);
229     bool hasState() const
230     {
231         return m_state && !m_state->isEmpty();
232     }
233
234 protected:
235     int m_type : 4;
236     mutable bool m_hasBinaryData;
237     mutable int m_binaryDataIndex:8;
238     ApiTraceState *m_state;
239
240     mutable QStaticText *m_staticText;
241 };
242 Q_DECLARE_METATYPE(ApiTraceEvent*);
243
244 class ApiTraceCall : public ApiTraceEvent
245 {
246 public:
247     ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader,
248                  const trace::Call *tcall);
249     ~ApiTraceCall();
250
251     int index() const;
252     QString name() const;
253     QStringList argNames() const;
254     QVector<QVariant> arguments() const;
255     QVariant returnValue() const;
256     trace::CallFlags flags() const;
257     QUrl helpUrl() const;
258     void setHelpUrl(const QUrl &url);
259     ApiTraceFrame *parentFrame()const;
260     void setParentFrame(ApiTraceFrame *frame);
261
262     bool hasError() const;
263     QString error() const;
264     void setError(const QString &msg);
265
266     QVector<QVariant> originalValues() const;
267
268     bool edited() const;
269     void setEditedValues(const QVector<QVariant> &lst);
270     QVector<QVariant> editedValues() const;
271     void revert();
272
273     bool contains(const QString &str,
274                   Qt::CaseSensitivity sensitivity) const;
275
276     ApiTrace *parentTrace() const;
277
278     QString toHtml() const;
279     QString searchText() const;
280     QStaticText staticText() const;
281     int numChildren() const;
282     bool hasBinaryData() const;
283     int binaryDataIndex() const;
284 private:
285     int m_index;
286     ApiTraceCallSignature *m_signature;
287     QVector<QVariant> m_argValues;
288     QVariant m_returnValue;
289     trace::CallFlags m_flags;
290     ApiTraceFrame *m_parentFrame;
291
292     QVector<QVariant> m_editedValues;
293
294     QString m_error;
295
296     mutable QString m_richText;
297     mutable QString m_searchText;
298 };
299 Q_DECLARE_METATYPE(ApiTraceCall*);
300
301 class ApiTraceFrame : public ApiTraceEvent
302 {
303 public:
304     ApiTraceFrame(ApiTrace *parent=0);
305     ~ApiTraceFrame();
306     int number;
307
308     bool isEmpty() const;
309
310     void setParentTrace(ApiTrace *parent);
311     ApiTrace *parentTrace() const;
312
313     void setNumChildren(int num);
314     int numChildren() const;
315     int numChildrenToLoad() const;
316     QStaticText staticText() const;
317
318     int callIndex(ApiTraceCall *call) const;
319     ApiTraceCall *call(int idx) const;
320     ApiTraceCall *callWithIndex(int index) const;
321     void addCall(ApiTraceCall *call);
322     QVector<ApiTraceCall*> calls() const;
323     void setCalls(const QVector<ApiTraceCall*> &calls,
324                   quint64 binaryDataSize);
325
326     ApiTraceCall *findNextCall(ApiTraceCall *from,
327                                const QString &str,
328                                Qt::CaseSensitivity sensitivity) const;
329
330     ApiTraceCall *findPrevCall(ApiTraceCall *from,
331                                const QString &str,
332                                Qt::CaseSensitivity sensitivity) const;
333
334     int binaryDataSize() const;
335
336     bool isLoaded() const;
337     void setLoaded(bool l);
338
339     void setLastCallIndex(unsigned index);
340     unsigned lastCallIndex() const;
341 private:
342     ApiTrace *m_parentTrace;
343     quint64 m_binaryDataSize;
344     QVector<ApiTraceCall*> m_calls;
345     bool m_loaded;
346     unsigned m_callsToLoad;
347     unsigned m_lastCallIndex;
348 };
349 Q_DECLARE_METATYPE(ApiTraceFrame*);
350
351
352 #endif