]> git.cworth.org Git - apitrace/blob - gui/apitracecall.h
Fix and cleanup state lookups on frames.
[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 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 ApiTraceEvent
207 {
208 public:
209     enum Type {
210         None  = 0,
211         Call  = 1 << 0,
212         Frame = 1 << 1
213     };
214 public:
215     ApiTraceEvent();
216     ApiTraceEvent(Type t);
217     virtual ~ApiTraceEvent();
218
219     Type type() const { return (Type)m_type; }
220
221     virtual QStaticText staticText() const = 0;
222     virtual int numChildren() const = 0;
223
224     QVariantMap stateParameters() const;
225     ApiTraceState *state() const;
226     void setState(ApiTraceState *state);
227     bool hasState() const
228     {
229         return m_state && !m_state->isEmpty();
230     }
231
232 protected:
233     int m_type : 4;
234     mutable bool m_hasBinaryData;
235     mutable int m_binaryDataIndex:8;
236     ApiTraceState *m_state;
237
238     mutable QStaticText *m_staticText;
239 };
240 Q_DECLARE_METATYPE(ApiTraceEvent*);
241
242 class ApiTraceCall : public ApiTraceEvent
243 {
244 public:
245     ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader,
246                  const Trace::Call *tcall);
247     ~ApiTraceCall();
248
249     int index() const;
250     QString name() const;
251     QStringList argNames() const;
252     QVector<QVariant> arguments() const;
253     QVariant returnValue() const;
254     QUrl helpUrl() const;
255     void setHelpUrl(const QUrl &url);
256     ApiTraceFrame *parentFrame()const;
257     void setParentFrame(ApiTraceFrame *frame);
258
259     bool hasError() const;
260     QString error() const;
261     void setError(const QString &msg);
262
263     QVector<QVariant> originalValues() const;
264
265     bool edited() const;
266     void setEditedValues(const QVector<QVariant> &lst);
267     QVector<QVariant> editedValues() const;
268     void revert();
269
270     bool contains(const QString &str,
271                   Qt::CaseSensitivity sensitivity) const;
272
273     ApiTrace *parentTrace() const;
274
275     QString toHtml() const;
276     QString searchText() const;
277     QStaticText staticText() const;
278     int numChildren() const;
279     bool hasBinaryData() const;
280     int binaryDataIndex() const;
281 private:
282     int m_index;
283     ApiTraceCallSignature *m_signature;
284     QVector<QVariant> m_argValues;
285     QVariant m_returnValue;
286     ApiTraceFrame *m_parentFrame;
287
288     QVector<QVariant> m_editedValues;
289
290     QString m_error;
291
292     mutable QString m_richText;
293     mutable QString m_searchText;
294 };
295 Q_DECLARE_METATYPE(ApiTraceCall*);
296
297 class ApiTraceFrame : public ApiTraceEvent
298 {
299 public:
300     ApiTraceFrame(ApiTrace *parent=0);
301     ~ApiTraceFrame();
302     int number;
303
304     bool isEmpty() const;
305
306     void setParentTrace(ApiTrace *parent);
307     ApiTrace *parentTrace() const;
308
309     void setNumChildren(int num);
310     int numChildren() const;
311     int numChildrenToLoad() const;
312     QStaticText staticText() const;
313
314     int callIndex(ApiTraceCall *call) const;
315     ApiTraceCall *call(int idx) const;
316     ApiTraceCall *callWithIndex(int index) const;
317     void addCall(ApiTraceCall *call);
318     QVector<ApiTraceCall*> calls() const;
319     void setCalls(const QVector<ApiTraceCall*> &calls,
320                   quint64 binaryDataSize);
321
322     ApiTraceCall *findNextCall(ApiTraceCall *from,
323                                const QString &str,
324                                Qt::CaseSensitivity sensitivity) const;
325
326     ApiTraceCall *findPrevCall(ApiTraceCall *from,
327                                const QString &str,
328                                Qt::CaseSensitivity sensitivity) const;
329
330     int binaryDataSize() const;
331
332     bool loaded() const;
333     void setLoaded(bool l);
334
335     void setLastCallIndex(unsigned index);
336     unsigned lastCallIndex() const;
337 private:
338     ApiTrace *m_parentTrace;
339     quint64 m_binaryDataSize;
340     QVector<ApiTraceCall*> m_calls;
341     bool m_loaded;
342     unsigned m_callsToLoad;
343     unsigned m_lastCallIndex;
344 };
345 Q_DECLARE_METATYPE(ApiTraceFrame*);
346
347
348 #endif