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