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