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