annotate d2/qtd/Signal.d @ 372:a032df77b6ab

Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author Max Samukha <maxter@spambox.com>
date Thu, 08 Jul 2010 17:19:05 +0300
parents f69341b40588
children d0a103f25091 e67ce7c21758
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /**
e78566595089 initial import
mandel
parents:
diff changeset
2 *
e78566595089 initial import
mandel
parents:
diff changeset
3 * Copyright: Copyright QtD Team, 2008-2009
e78566595089 initial import
mandel
parents:
diff changeset
4 * Authors: Max Samukha, Eldar Insafutdinov
e78566595089 initial import
mandel
parents:
diff changeset
5 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>
e78566595089 initial import
mandel
parents:
diff changeset
6 *
e78566595089 initial import
mandel
parents:
diff changeset
7 * Copyright QtD Team, 2008-2009
e78566595089 initial import
mandel
parents:
diff changeset
8 * Distributed under the Boost Software License, Version 1.0.
e78566595089 initial import
mandel
parents:
diff changeset
9 * (See accompanying file boost-license-1.0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
e78566595089 initial import
mandel
parents:
diff changeset
10 *
e78566595089 initial import
mandel
parents:
diff changeset
11 */
344
96a75b1e5b26 project structure changes
Max Samukha <maxter@spambox.com>
parents: 339
diff changeset
12 module qtd.Signal;
1
e78566595089 initial import
mandel
parents:
diff changeset
13
e78566595089 initial import
mandel
parents:
diff changeset
14 import core.stdc.stdlib : crealloc = realloc, cfree = free;
e78566595089 initial import
mandel
parents:
diff changeset
15 import core.stdc.string : memmove;
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 350
diff changeset
16 import std.string : strip;
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
17
1
e78566595089 initial import
mandel
parents:
diff changeset
18 import
188
7dd099050621 initial commit for D2 support
eldar
parents: 16
diff changeset
19 core.thread,
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
20 core.exception,
1
e78566595089 initial import
mandel
parents:
diff changeset
21
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
22 std.typetuple,
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
23 std.conv,
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
24 std.traits,
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
25
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
26 qt.QGlobal,
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 350
diff changeset
27 qtd.String,
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
28 qtd.Marshal,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
29 qtd.meta.Compiletime,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
30 qtd.ctfe.Format;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
31
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
32 /** The beast that takes string representation of function arguments
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
33 * and returns an array of default values it doesn't check if arguments
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
34 * without default values follow the arguments with default values for
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
35 * simplicity. It is done by mixing in a delegate alias.
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
36 */
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
37 string[] defaultValues(string signature)
1
e78566595089 initial import
mandel
parents:
diff changeset
38 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
39 int braces = 0;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
40 bool inDefaultValue = false;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
41 bool inStringLiteral = false;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
42 string[] res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
43 int startValue = 0;
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
44
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
45 if(strip(signature).length == 0)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
46 return res;
1
e78566595089 initial import
mandel
parents:
diff changeset
47
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
48 foreach (i,c; signature)
1
e78566595089 initial import
mandel
parents:
diff changeset
49 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
50 if(!inStringLiteral)
1
e78566595089 initial import
mandel
parents:
diff changeset
51 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
52 if(c == '{' || c =='(')
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
53 braces++;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
54 else if(c == '}' || c ==')')
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
55 braces--;
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
56 }
1
e78566595089 initial import
mandel
parents:
diff changeset
57
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
58 if(c == '\"' || c == '\'')
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
59 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
60 if (inStringLiteral)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
61 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
62 if(signature[i-1] != '\\')
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
63 inStringLiteral = false;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
64 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
65 else
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
66 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
67 inStringLiteral = true;
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
68 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
69 }
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
70
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
71 if (!inStringLiteral && braces == 0)
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
72 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
73 if(c == '=') // found default value
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
74 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
75 inDefaultValue = true;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
76 startValue = i+1;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
77 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
78 else if(c == ',') // next function argument
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
79 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
80 if (inDefaultValue)
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
81 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
82 res ~= signature[startValue..i];
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
83 inDefaultValue = false;
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
84 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
85 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
86 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
87 }
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
88
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
89 if (inDefaultValue)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
90 res ~= signature[startValue..$];
1
e78566595089 initial import
mandel
parents:
diff changeset
91
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
92 return res;
1
e78566595089 initial import
mandel
parents:
diff changeset
93 }
e78566595089 initial import
mandel
parents:
diff changeset
94
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
95 /**
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
96 Generates D-to-C++ conversion code for signals.
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
97 */
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
98 string genConvToCpp(uint argIndex)
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
99 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
100 string res = format_ctfe(q{
282
256ab6cb8e85 Signals look-up andNew syntax for connect. The old one will not work from now on. This will allow for the signals overload. Although changes are done for both D1 and D2 versions, D1 won't work because of compiler bugs. I am tired of waiting for fixes.
eldar
parents: 279
diff changeset
101
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
102 static if (isStringType!(Args[${0}]))
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
103 {
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
104 auto _tmp${0} = QString(_t${0});
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
105 _a[${0}] = cast(void*)&_tmp${0};
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
106 }
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
107 else static if (isQObjectType!(Args[${0}]) || isObjectType!(Args[${0}]))
372
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 367
diff changeset
108 {
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 367
diff changeset
109 void* _tmp${0} = _t${0} ? _t${0}.qtdNativeId : null;
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 367
diff changeset
110 _a[${0}] = &_tmp${0};
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 367
diff changeset
111 }
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
112 else static if (isValueType!(Args[${0}]))
372
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 367
diff changeset
113 _a[${0}] = _t${0}.qtdNativeId;
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
114 else
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
115 _a[${0}] = cast(void*)&_t${0};
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
116
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
117 }, argIndex);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
118
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
119 return res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
120 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
121
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
122 string genSignalEmitter(SignalKind signalKind, string name, uint localIndex, uint argCount)
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
123 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
124 string res;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
125
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
126 // signature
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
127 //
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
128 if (signalKind != SignalKind.BindQtSignal)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
129 res ~= "protected ";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
130
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
131 res ~= "Args[0] " ~ name;
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 350
diff changeset
132
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
133 if (signalKind == SignalKind.BindQtSignal)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
134 res ~= "_emit";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
135
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
136 res ~= "(";
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 350
diff changeset
137
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
138 foreach (i; 1..argCount)
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
139 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
140 auto iStr = to!string(i);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
141 if (i > 1)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
142 res ~= ", ";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
143 res ~= "Args[" ~ iStr ~ "] _t" ~ iStr;
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
144 }
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
145
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
146 res ~= ") {\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
147
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
148 // body
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
149 //
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
150 res ~= " void*[" ~ to!string(argCount) ~ "] _a;\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
151 foreach (i; 1..argCount)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
152 res ~= genConvToCpp(i);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
153
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
154 res ~= " QMetaObject.activate(this, typeof(this).staticMetaObject, "
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
155 ~ to!string(localIndex) ~ ", _a.ptr);\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
156
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
157 return res ~= "}\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
158 }
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
159
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
160 // BUG: parameter storage classes are not supported yet
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
161 mixin template SignalEmitter(SignalKind signalKind, int localIndex)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
162 {
367
f69341b40588 Removed dependencies on qtd.Traits
Max Samukha <maxter@spambox.com>
parents: 366
diff changeset
163 import std.traits;
f69341b40588 Removed dependencies on qtd.Traits
Max Samukha <maxter@spambox.com>
parents: 366
diff changeset
164
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
165 alias signals[localIndex] signal;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
166 alias TypeTuple!(ReturnType!(signal), ParameterTypeTuple!(signal)) Args;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
167
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
168 /+
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
169 pragma(msg, genSignalEmitter(signalKind,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
170 methodName!signal,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
171 localIndex,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
172 Args.length));
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
173 +/
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
174
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
175 mixin (genSignalEmitter(signalKind,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
176 methodName!signal,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
177 localIndex,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
178 Args.length));
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
179 }
278
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
180 /** ---------------- */
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
181
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
182
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
183 enum SignalKind
1
e78566595089 initial import
mandel
parents:
diff changeset
184 {
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
185 BindQtSignal,
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
186 NewSignal,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
187 NewSlot
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
188 }
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
189
322
7c2cf27391c4 A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents: 321
diff changeset
190 string signature(T...)(string name)
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
191 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
192 string res = name ~ "(";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
193 foreach(i, _; T)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
194 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
195 if(i > 0)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
196 res ~= ",";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
197 static if (isNativeType!(T[i]))
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
198 res ~= Unqual!(T[i]).stringof;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
199 else
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
200 res ~= T[i].stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
201 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
202 res ~= ")";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
203 return res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
204 }
1
e78566595089 initial import
mandel
parents:
diff changeset
205
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
206 // ------------------------------------------------------------------
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
207
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
208 string[] getSymbols(C)(string prefix)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
209 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
210 string[] result;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
211 auto allSymbols = __traits(derivedMembers, C);
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
212 foreach(s; allSymbols)
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
213 {
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
214 if(startsWith(s, prefix))
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
215 result ~= s;
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
216 }
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
217 return result;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
218 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
219
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
220 string removePrefix(string source)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
221 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
222 foreach (i, c; source)
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
223 {
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
224 if (c == '_')
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
225 return source[i+1..$];
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
226 }
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
227 return source;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
228 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
229
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
230 // recursive search in the static meta-information
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
231 template findSymbolsImpl2(C, alias signals, int id)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
232 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
233 alias qtd.meta.Compiletime.Alias!(__traits(getOverloads, C, signals[id])) current;
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
234 static if (signals.length - id - 1 > 0)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
235 alias TypeTuple!(current, findSymbolsImpl2!(C, signals, id + 1).result) result;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
236 else
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
237 alias TypeTuple!(current) result;
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
238 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
239
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
240 template findSymbols2(C, string prefix)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
241 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
242 enum signals = getSymbols!(C)(prefix);
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
243 static if (signals)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
244 alias findSymbolsImpl2!(C, signals, 0).result result;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
245 else
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
246 alias TypeTuple!() result;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
247 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
248
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
249 template findSignals(C)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
250 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
251 alias findSymbols2!(C, "signal_").result findSignals;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
252 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
253
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
254 template findSlots(C)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
255 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
256 alias findSymbols2!(C, "slot_").result findSlots;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
257 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
258
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
259 template methodName(alias method)
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
260 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
261 enum methodName = removePrefix(__traits(identifier, method));
372
a032df77b6ab Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents: 367
diff changeset
262 }