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