Mercurial > projects > qtd
annotate d2/qtd/MOC.d @ 356:12cec2d14e1c
a better name for qtd.Str
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Tue, 25 May 2010 20:14:04 +0300 |
parents | 31520b2c0b3c |
children | 9784459f0750 |
rev | line source |
---|---|
344 | 1 module qtd.MOC; |
288 | 2 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
3 import |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
4 std.typetuple, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
5 std.traits, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
6 std.typetuple, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
7 std.conv, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
8 qt.QGlobal, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
9 qtd.Signal, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
10 qtd.Marshal, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
11 qtd.Array, |
356 | 12 qtd.String, |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
13 qtd.meta.Compiletime, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
14 qtd.ctfe.Format; |
288 | 15 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
16 import qt.core.QString; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
17 |
288 | 18 /** |
19 Utils. | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
20 */ |
288 | 21 int lastIndexOf(T)(T[] haystack, T[] needle, int from = -1) |
22 { | |
23 auto l = haystack.length; | |
24 auto ol = needle.length; | |
25 int delta = l - ol; | |
26 if (from < 0) | |
27 from = delta; | |
28 if (from < 0 || from > l) | |
29 return -1; | |
30 if (from > delta) | |
31 from = delta; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
32 |
288 | 33 while(from >= 0) |
34 { | |
35 if (haystack[from..from+ol] == needle) | |
36 return from; | |
37 from--; | |
38 } | |
39 return -1; | |
40 } | |
41 | |
42 string replicate(int n, char value) | |
43 { | |
44 char[] ret = "".dup; | |
45 if (n > 0) | |
46 { | |
47 // ret = newArray!char(n); | |
48 for(int i = 0; i < n; i++) | |
49 ret ~= value; | |
50 } | |
51 return cast(string)ret; | |
52 } | |
53 | |
54 /** | |
55 CTFE MOC port. | |
56 */ | |
57 | |
58 enum MethodFlags { | |
59 AccessPrivate = 0x00, | |
60 AccessProtected = 0x01, | |
61 AccessPublic = 0x02, | |
62 MethodMethod = 0x00, | |
63 MethodSignal = 0x04, | |
64 MethodSlot = 0x08, | |
65 MethodConstructor = 0x0c, | |
66 MethodCompatibility = 0x10, | |
67 MethodCloned = 0x20, | |
68 MethodScriptable = 0x40 | |
69 } | |
70 | |
71 enum Access { Private, Protected, Public } | |
72 | |
73 struct FunctionDef | |
74 { | |
75 /* FunctionDef(): returnTypeIsVolatile(false), access(Private), isConst(false), isVirtual(false), | |
76 inlineCode(false), wasCloned(false), isCompat(false), isInvokable(false), | |
77 isScriptable(false), isSlot(false), isSignal(false), | |
78 isConstructor(false), isDestructor(false), isAbstract(false) {} | |
79 */ | |
80 // Type type; | |
81 // string normalizedType; | |
82 // string tag; | |
83 // string name; | |
84 string sig; | |
85 string arguments; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
86 Access access; |
288 | 87 /* bool returnTypeIsVolatile; |
88 | |
89 QList<ArgumentDef> arguments; | |
90 | |
91 enum Access { Private, Protected, Public }; | |
92 bool isConst; | |
93 bool isVirtual; | |
94 bool inlineCode; | |
95 bool wasCloned; | |
96 | |
97 QByteArray inPrivateClass; | |
98 bool isCompat; | |
99 bool isInvokable; | |
100 bool isScriptable; | |
101 bool isSlot; | |
102 bool isSignal; | |
103 bool isConstructor; | |
104 bool isDestructor; | |
105 bool isAbstract; | |
106 */ | |
107 } | |
108 | |
109 FunctionDef newSlot(string sig, string args) | |
110 { | |
111 return FunctionDef(sig, args, Access.Public); | |
112 } | |
113 | |
114 FunctionDef newSignal(string sig, string args) | |
115 { | |
116 return FunctionDef(sig, args, Access.Protected); | |
117 } | |
118 | |
119 struct Generator | |
120 { | |
121 string output; | |
122 string[] strings; | |
123 // QByteArray purestSuperClass; | |
124 // QList<QByteArray> metaTypes; | |
125 } | |
126 | |
127 int lengthOfEscapeSequence(string s, uint i) | |
128 { | |
129 if (s[i] != '\\' || i >= s.length - 1) | |
130 return 1; | |
131 const int startPos = i; | |
132 ++i; | |
133 auto ch = s[i]; | |
134 if (ch == 'x') { | |
135 ++i; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
136 while (i < s.length && isHexChar(s[i])) |
288 | 137 ++i; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
138 } else if (isOctalChar(ch)) { |
288 | 139 while (i < startPos + 4 |
140 && i < s.length | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
141 && isOctalChar(s[i])) { |
288 | 142 ++i; |
143 } | |
144 } else { // single character escape sequence | |
145 i = qMin(i + 1, s.length); | |
146 } | |
147 return i - startPos; | |
148 } | |
149 | |
150 int strreg(ref Generator gen, string s) | |
151 { | |
152 int idx = 0; | |
153 foreach (str; gen.strings) { | |
154 if (str == s) | |
155 return idx; | |
156 idx += str.length + 1; | |
157 foreach (i, c; str) { | |
158 if (c == '\\') { | |
159 int cnt = lengthOfEscapeSequence(str, i) - 1; | |
160 idx -= cnt; | |
161 i += cnt; | |
162 } | |
163 } | |
164 } | |
165 gen.strings ~= s; | |
166 return idx; | |
167 } | |
168 | |
169 void generateFunctions(ref Generator gen, FunctionDef[] list, string functype, byte type) | |
170 { | |
171 if (!list.length) | |
172 return; | |
173 gen.output ~= format_ctfe("\n // ${}s: signature, parameters, type, tag, flags\n", functype); | |
174 | |
175 foreach (i, f; list) { | |
176 byte flags = type; | |
177 | |
178 if (f.access == Access.Private) | |
179 flags |= MethodFlags.AccessPrivate; | |
180 else if (f.access == Access.Public) | |
181 flags |= MethodFlags.AccessPublic; | |
182 else if (f.access == Access.Protected) | |
183 flags |= MethodFlags.AccessProtected; | |
184 | |
185 gen.output ~= format_ctfe(" ${}, ${}, ${}, ${}, 0x${:x},\n", strreg(gen, f.sig), | |
186 strreg(gen, f.arguments), strreg(gen, ""/*f.normalizedType*/), strreg(gen, ""/*f.tag*/), flags); | |
187 } | |
188 } | |
189 | |
190 string generateCode(string className, FunctionDef[] signalList, FunctionDef[] slotList) | |
191 { | |
192 auto gen = Generator("", []); | |
193 | |
194 /* bool isQt = (cdef->classname == "Qt"); | |
195 bool isQObject = (cdef->classname == "QObject"); | |
196 bool isConstructible = !cdef->constructorList.isEmpty(); | |
197 | |
198 // | |
199 // build the data array | |
200 // | |
201 int i = 0; | |
202 | |
203 | |
204 // filter out undeclared enumerators and sets | |
205 { | |
206 QList<EnumDef> enumList; | |
207 for (i = 0; i < cdef->enumList.count(); ++i) { | |
208 EnumDef def = cdef->enumList.at(i); | |
209 if (cdef->enumDeclarations.contains(def.name)) { | |
210 enumList += def; | |
211 } | |
212 QByteArray alias = cdef->flagAliases.value(def.name); | |
213 if (cdef->enumDeclarations.contains(alias)) { | |
214 def.name = alias; | |
215 enumList += def; | |
216 } | |
217 } | |
218 cdef->enumList = enumList; | |
219 } | |
220 | |
221 | |
222 QByteArray qualifiedClassNameIdentifier = cdef->qualified; | |
223 qualifiedClassNameIdentifier.replace(':', '_'); | |
224 */ | |
225 bool isConstructible = false; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
226 |
288 | 227 FunctionDef[] propertyList, enumList, constructorList; |
228 int index = 12; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
229 gen.output ~= "private static const uint[] qt_meta_data = [\n"; |
288 | 230 gen.output ~= format_ctfe("\n // content:\n"); |
231 gen.output ~= format_ctfe(" ${}, // revision\n", 2); | |
232 gen.output ~= format_ctfe(" ${}, // classname\n", strreg(gen, className)); | |
233 gen.output ~= format_ctfe(" ${}, ${}, // classinfo\n", 0, 0); | |
234 // index += cdef->classInfoList.count() * 2; | |
235 | |
236 int methodCount = signalList.length + slotList.length;// + cdef->methodList.count(); | |
237 gen.output ~= format_ctfe(" ${}, ${}, // methods\n", methodCount, methodCount ? index : 0); | |
238 index += methodCount * 5; | |
239 gen.output ~= format_ctfe(" ${}, ${}, // properties\n", propertyList.length, propertyList.length ? index : 0); | |
240 index += propertyList.length * 3; | |
241 // if(cdef->notifyableProperties) | |
242 // index += cdef->propertyList.count(); | |
243 gen.output ~= format_ctfe(" ${}, ${}, // enums/sets\n", enumList.length, enumList.length ? index : 0); | |
244 | |
245 // int enumsIndex = index; | |
246 // for (i = 0; i < cdef->enumList.count(); ++i) | |
247 // index += 4 + (cdef->enumList.at(i).values.count() * 2); | |
248 gen.output ~= format_ctfe(" ${}, ${}, // constructors\n", isConstructible ? constructorList.length : 0, | |
249 isConstructible ? index : 0); | |
250 | |
251 // | |
252 // Build classinfo array | |
253 // | |
254 // generateClassInfos(); | |
255 | |
256 // | |
257 // Build signals array first, otherwise the signal indices would be wrong | |
258 // | |
259 generateFunctions(gen, signalList, "signal", MethodFlags.MethodSignal); | |
260 | |
261 // | |
262 // Build slots array | |
263 // | |
264 generateFunctions(gen, slotList, "slot", MethodFlags.MethodSlot); | |
265 | |
266 // | |
267 // Build method array | |
268 // | |
269 // generateFunctions(cdef->methodList, "method", MethodMethod); | |
270 | |
271 | |
272 // | |
273 // Build property array | |
274 // | |
275 // generateProperties(); | |
276 | |
277 // | |
278 // Build enums array | |
279 // | |
280 // generateEnums(enumsIndex); | |
281 | |
282 // | |
283 // Build constructors array | |
284 // | |
285 // if (isConstructible) | |
286 // generateFunctions(cdef->constructorList, "constructor", MethodConstructor); | |
287 | |
288 // | |
289 // Terminate data array | |
290 // | |
291 gen.output ~= format_ctfe("\n 0 // eod\n];\n\n"); | |
292 | |
293 // | |
294 // Build stringdata array | |
295 // | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
296 gen.output ~= "private static const string qt_meta_stringdata = \n"; |
288 | 297 gen.output ~= format_ctfe(" \""); |
298 int col = 0; | |
299 int len = 0; | |
300 foreach (i, s; gen.strings) { | |
301 len = s.length; | |
302 if (col && col + len >= 72) { | |
303 gen.output ~= format_ctfe("\"\n \""); | |
304 col = 0; | |
305 } else if (len && s[0] >= '0' && s[0] <= '9') { | |
306 gen.output ~= format_ctfe("\"\""); | |
307 len += 2; | |
308 } | |
309 int idx = 0; | |
310 while (idx < s.length) { | |
311 if (idx > 0) { | |
312 col = 0; | |
313 gen.output ~= format_ctfe("\"\n \""); | |
314 } | |
315 int spanLen = qMin(cast(uint)70, s.length - idx); | |
316 // don't cut escape sequences at the end of a line | |
317 int backSlashPos = s.lastIndexOf("\\", idx + spanLen - 1); | |
318 if (backSlashPos >= idx) { | |
319 int escapeLen = lengthOfEscapeSequence(s, backSlashPos); | |
320 spanLen = qBound(spanLen, backSlashPos + escapeLen - idx, cast(int)(s.length - idx)); | |
321 } | |
322 gen.output ~= s[idx..idx+spanLen]; | |
323 idx += spanLen; | |
324 col += spanLen; | |
325 } | |
326 | |
327 gen.output ~= "\\0"; | |
328 col += len + 2; | |
329 } | |
330 gen.output ~= "\";\n\n"; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
331 |
288 | 332 return gen.output; |
333 } | |
334 | |
335 string qtDeclArgs(Args...)() | |
336 { | |
337 string ret; | |
338 foreach(i, _; Args) | |
339 { | |
340 if(i > 0) | |
341 ret ~= ","; | |
342 ret ~= qtDeclArg!(Args[i]); | |
343 } | |
344 return ret; | |
345 } | |
346 | |
347 string dDeclArgs(Args...)() | |
348 { | |
349 string ret; | |
350 foreach(i, _; Args) | |
322
7c2cf27391c4
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents:
320
diff
changeset
|
351 { |
7c2cf27391c4
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents:
320
diff
changeset
|
352 if (i > 0) |
7c2cf27391c4
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents:
320
diff
changeset
|
353 ret ~= ", "; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
354 ret ~= fullName!(Args[i]); |
322
7c2cf27391c4
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents:
320
diff
changeset
|
355 } |
288 | 356 return ret; |
357 } | |
358 | |
359 size_t commaCount(int argCount) | |
360 { | |
361 size_t ret = 0; | |
362 if(argCount > 1) | |
363 ret = argCount - 1; | |
364 return ret; | |
365 } | |
366 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
367 FunctionDef[] generateFuncDefs(alias newFunc, Funcs...)() |
288 | 368 { |
369 typeof(return) res; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
370 enum funcsCount = Funcs.length; |
288 | 371 foreach(i, bogus; Repeat!(void, funcsCount)) |
372 { | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
373 alias ParameterTypeTuple!(Funcs[i]) Args; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
374 string args = replicate(commaCount(Args.length), ','); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
375 string funcSig = methodName!(Funcs[i]) ~ "(" ~ qtDeclArgs!(Args)() ~ ")"; |
288 | 376 res ~= newFunc(funcSig, args); |
377 } | |
378 return res; | |
379 } | |
380 | |
381 template Q_OBJECT_BIND() | |
382 { | |
383 } | |
322
7c2cf27391c4
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents:
320
diff
changeset
|
384 |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
385 // ------------------------------------------------------------------------------------------ |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
386 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
387 string generateSignalEmitters(uint signalCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
388 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
389 string res = ""; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
390 foreach (i; 0..signalCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
391 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
392 auto iStr = to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
393 res ~= "mixin SignalEmitter!(SignalKind.NewSignal, " ~ iStr ~ ");\n"; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
394 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
395 return res; |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
396 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
397 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
398 private mixin template SlotAlias(alias slot) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
399 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
400 mixin ("alias slot " ~ methodName!slot ~ ";"); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
401 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
402 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
403 string generateSlotAliases(uint slotCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
404 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
405 string res = ""; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
406 foreach(i; 0..slotCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
407 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
408 auto iStr = to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
409 res ~= "mixin SlotAlias!(slots[" ~ iStr ~ "]);\n"; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
410 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
411 return res; |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
412 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
413 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
414 string generateMetaCall(string methodName, size_t argCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
415 { |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
416 string res = ""; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
417 foreach (i; 1..argCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
418 res ~= generateConvToD(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
419 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
420 res ~= methodName ~ "("; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
421 foreach (i; 1..argCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
422 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
423 if (i > 1) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
424 res ~= ", "; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
425 res ~= "_out" ~ to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
426 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
427 return res ~ ");\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
428 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
429 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
430 string generateDispatchSwitch(size_t methodCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
431 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
432 string res = "switch(_id) {\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
433 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
434 foreach(i; 0..methodCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
435 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
436 string iStr = to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
437 res ~= " case " ~ iStr ~ ":\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
438 res ~= " alias methods[" ~ iStr ~ "] method;\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
439 res ~= " alias TypeTuple!(void, ParameterTypeTuple!method) Args;\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
440 res ~= " mixin(generateMetaCall(methodName!method, Args.length));\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
441 res ~= " break;\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
442 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
443 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
444 res ~= " default:\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
445 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
446 return res ~ "}\n"; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
447 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
448 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
449 mixin template Q_OBJECT() |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
450 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
451 import std.typetuple; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
452 import qtd.Marshal; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
453 import qt.core.QString; // for QStringUtil.toNative |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
454 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
455 public: // required to override the outside scope protection. |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
456 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
457 alias typeof(this) This; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
458 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
459 alias findSignals!(This) signals; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
460 alias findSlots!(This) slots; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
461 alias TypeTuple!(signals, slots) methods; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
462 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
463 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
464 mixin (generateSignalEmitters(signals.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
465 mixin (generateSlotAliases(slots.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
466 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
467 auto signalList = generateFuncDefs!(newSignal, signals)(); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
468 auto slotList = generateFuncDefs!(newSlot, slots)(); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
469 mixin (generateCode(typeof(this).stringof, signalList, slotList)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
470 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
471 protected int qt_metacall(QMetaObject.Call _c, int _id, void **_a) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
472 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
473 _id = super.qt_metacall(_c, _id, _a); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
474 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
475 static if (methods.length) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
476 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
477 if (_id < 0) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
478 return _id; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
479 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
480 if (_c == QMetaObject.Call.InvokeMetaMethod) { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
481 //pragma(msg, generateDispatchSwitch(methods.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
482 mixin (generateDispatchSwitch(methods.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
483 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
484 _id -= methods.length; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
485 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
486 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
487 return _id; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
488 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
489 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
490 @property |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
491 override QMetaObject metaObject() const { return staticMetaObject(); } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
492 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
493 private static __gshared QMetaObject _staticMetaObject; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
494 private static __gshared QMetaObjectNative _nativeStaticMetaObject; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
495 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
496 @property |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
497 static QMetaObject staticMetaObject() |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
498 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
499 // TODO: synchronize or enable static constructors in circular modules |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
500 if(!_staticMetaObject) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
501 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
502 alias BaseClassesTuple!(This)[0] Base; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
503 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
504 _nativeStaticMetaObject = QMetaObjectNative( |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
505 Base.staticMetaObject.nativeId, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
506 qt_meta_stringdata.ptr, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
507 qt_meta_data.ptr, null); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
508 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
509 QMetaObject.create!This(&_nativeStaticMetaObject); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
510 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
511 return _staticMetaObject; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
512 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
513 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
514 /*internal*/ static void setStaticMetaObject(QMetaObject m) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
515 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
516 _staticMetaObject = m; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
517 } |
327 | 518 } |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
519 |