annotate d2/qtd/Signal.d @ 366:da4235301224

Fixed VoidFunc. Updated to dmd.2.047.
author Max Samukha <maxter@spambox.com>
date Wed, 23 Jun 2010 21:34:43 +0300
parents 31520b2c0b3c
children f69341b40588
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}]))
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
108 _a[${0}] = _t${0} ? &(_t${0}.__nativeId) : cast(void*)&_t${0};
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
109 else static if (isValueType!(Args[${0}]))
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
110 _a[${0}] = _t${0}.__nativeId;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
111 else
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
112 _a[${0}] = cast(void*)&_t${0};
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
113
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
114 }, argIndex);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
115
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
116 return res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
117 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
118
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
119 string genSignalEmitter(SignalKind signalKind, string name, uint localIndex, uint argCount)
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
120 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
121 string res;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
122
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
123 // signature
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
124 //
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
125 if (signalKind != SignalKind.BindQtSignal)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
126 res ~= "protected ";
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 res ~= "Args[0] " ~ name;
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 350
diff changeset
129
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
130 if (signalKind == SignalKind.BindQtSignal)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
131 res ~= "_emit";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
132
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
133 res ~= "(";
366
da4235301224 Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents: 350
diff changeset
134
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
135 foreach (i; 1..argCount)
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
136 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
137 auto iStr = to!string(i);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
138 if (i > 1)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
139 res ~= ", ";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
140 res ~= "Args[" ~ iStr ~ "] _t" ~ iStr;
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
141 }
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
142
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
143 res ~= ") {\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
144
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
145 // body
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
146 //
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
147 res ~= " void*[" ~ to!string(argCount) ~ "] _a;\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
148 foreach (i; 1..argCount)
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
149 res ~= genConvToCpp(i);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
150
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
151 res ~= " QMetaObject.activate(this, typeof(this).staticMetaObject, "
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
152 ~ to!string(localIndex) ~ ", _a.ptr);\n";
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 return res ~= "}\n";
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
155 }
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 // 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
158 mixin template SignalEmitter(SignalKind signalKind, int localIndex)
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 alias signals[localIndex] signal;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
161 alias TypeTuple!(ReturnType!(signal), ParameterTypeTuple!(signal)) Args;
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
162
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
163 /+
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
164 pragma(msg, genSignalEmitter(signalKind,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
165 methodName!signal,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
166 localIndex,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
167 Args.length));
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
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
170 mixin (genSignalEmitter(signalKind,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
171 methodName!signal,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
172 localIndex,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
173 Args.length));
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
174 }
278
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
175 /** ---------------- */
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
176
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
177
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
178 enum SignalKind
1
e78566595089 initial import
mandel
parents:
diff changeset
179 {
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
180 BindQtSignal,
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
181 NewSignal,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
182 NewSlot
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
183 }
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
184
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
185 string signature(T...)(string name)
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
186 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
187 string res = name ~ "(";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
188 foreach(i, _; T)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
189 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
190 if(i > 0)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
191 res ~= ",";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
192 static if (isNativeType!(T[i]))
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
193 res ~= Unqual!(T[i]).stringof;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
194 else
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
195 res ~= T[i].stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
196 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
197 res ~= ")";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
198 return res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
199 }
1
e78566595089 initial import
mandel
parents:
diff changeset
200
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
201 // ------------------------------------------------------------------
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
202
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
203 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
204 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
205 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
206 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
207 foreach(s; allSymbols)
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
208 {
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
209 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
210 result ~= s;
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
211 }
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
212 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
213 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
214
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 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
216 {
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 foreach (i, c; source)
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
218 {
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
219 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
220 return source[i+1..$];
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
221 }
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
222 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
223 }
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
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 // 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
226 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
227 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
228 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
229 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
230 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
231 else
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
232 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
233 }
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
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 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
236 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
237 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
238 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
239 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
240 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
241 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
242 }
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
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 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
245 {
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 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
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 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
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, "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
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
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
254 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
255 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
256 enum methodName = removePrefix(__traits(identifier, method));
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 347
diff changeset
257 }