annotate qt/d2/qt/Signal.d @ 322:7c2cf27391c4 signals

A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
author eldar_ins@eldar-laptop
date Sun, 27 Dec 2009 21:13:38 +0500
parents d458ed66e871
children 7a3c43424dca
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 */
16
6faf3d3cb95e CMake: implement install and package targets.
SokoL_SD
parents: 1
diff changeset
12 module qt.Signal;
1
e78566595089 initial import
mandel
parents:
diff changeset
13
e78566595089 initial import
mandel
parents:
diff changeset
14 public import qt.QGlobal;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
15 import qt.qtd.MetaMarshall;
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
16 import qt.qtd.Meta;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
17
1
e78566595089 initial import
mandel
parents:
diff changeset
18 import core.stdc.stdlib : crealloc = realloc, cfree = free;
e78566595089 initial import
mandel
parents:
diff changeset
19 import core.stdc.string : memmove;
e78566595089 initial import
mandel
parents:
diff changeset
20 import
188
7dd099050621 initial commit for D2 support
eldar
parents: 16
diff changeset
21 core.thread,
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
22 core.exception,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
23 std.algorithm;
1
e78566595089 initial import
mandel
parents:
diff changeset
24
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
25 public import
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
26 std.typetuple,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
27 std.traits,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
28 std.conv,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
29 std.metastrings;
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
30
321
d458ed66e871 minor stuff
eldar_ins@eldar-laptop
parents: 320
diff changeset
31 public import std.string : strip, toStringz;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
32
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
33 /** The beast that takes string representation of function arguments
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
34 * and returns an array of default values it doesn't check if arguments
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
35 * without default values follow the arguments with default values for
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
36 * simplicity. It is done by mixing in an delegate alias.
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
37 */
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
38 string[] defaultValues(string signature)
1
e78566595089 initial import
mandel
parents:
diff changeset
39 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
40 int braces = 0;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
41 bool inDefaultValue = false;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
42 bool inStringLiteral = false;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
43 string[] res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
44 int startValue = 0;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
45
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
46 if(strip(signature).length == 0)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
47 return res;
1
e78566595089 initial import
mandel
parents:
diff changeset
48
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
49 foreach (i,c; signature)
1
e78566595089 initial import
mandel
parents:
diff changeset
50 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
51 if(!inStringLiteral)
1
e78566595089 initial import
mandel
parents:
diff changeset
52 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
53 if(c == '{' || c =='(')
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
54 braces++;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
55 else if(c == '}' || c ==')')
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
56 braces--;
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
57 }
1
e78566595089 initial import
mandel
parents:
diff changeset
58
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
59 if(c == '\"' || c == '\'')
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
60 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
61 if (inStringLiteral)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
62 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
63 if(signature[i-1] != '\\')
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
64 inStringLiteral = false;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
65 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
66 else
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
67 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
68 inStringLiteral = true;
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
69 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
70 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
71
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
72 if (!inStringLiteral && braces == 0)
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
73 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
74 if(c == '=') // found default value
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
75 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
76 inDefaultValue = true;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
77 startValue = i+1;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
78 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
79 else if(c == ',') // next function argument
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
80 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
81 if (inDefaultValue)
276
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
82 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
83 res ~= signature[startValue..i];
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
84 inDefaultValue = false;
276
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 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
88 }
501128ac7a2c signals cleaned up correctly on receiver destruction
maxter
parents: 268
diff changeset
89
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
90 if (inDefaultValue)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
91 res ~= signature[startValue..$];
1
e78566595089 initial import
mandel
parents:
diff changeset
92
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
93 return res;
1
e78566595089 initial import
mandel
parents:
diff changeset
94 }
e78566595089 initial import
mandel
parents:
diff changeset
95
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
96 int defaultValuesLength(string[] defVals)
1
e78566595089 initial import
mandel
parents:
diff changeset
97 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
98 return defVals.length;
1
e78566595089 initial import
mandel
parents:
diff changeset
99 }
e78566595089 initial import
mandel
parents:
diff changeset
100
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
101
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
102 // templates for extracting data from static meta-information of signals, slots or properties
289
c9d1aac290e9 clean up of unneeded functionality
eldar
parents: 288
diff changeset
103 // public alias TypeTuple!("name", index, OwnerClass, ArgTypes) __signal
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
104 template MetaEntryName(source...)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
105 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
106 enum MetaEntryName = source[0]; // name of the metaentry is the first element
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
107 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
108
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
109 template MetaEntryOwner(source...)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
110 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
111 alias TupleWrapper!(source[2]).at[0] MetaEntryOwner; // class that owns the property is the third
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
112 // Compiler #BUG 3092 - evaluates MetaEntryOwner as a Tuple with one element
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
113 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
114
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
115 template MetaEntryArgs(source...)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
116 {
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
117 alias ParameterTypeTuple!(source[1]) MetaEntryArgs; // arguments-tuple starts from the fourth position
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
118 }
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
119
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
120 template TupleWrapper(A...) { alias A at; }
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
121
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
122 string convertSignalArguments(Args...)()
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
123 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
124 // void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
125 // at least for string argument need to construct a QString value
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
126 string res = prepareSignalArguments!(Args);
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
127
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
128 res ~= "void*[" ~ __toString(Args.length+1) ~ "] _a = [null";
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
129 foreach(i, _; Args)
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 302
diff changeset
130 res ~= ", " ~ "cast(void*) " ~ convertSignalArgument!(Args[i])("_t" ~ __toString(i));
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
131 res ~= "];\n";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
132 return res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
133 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
134
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
135 public string SignalEmitter(A...)(SignalType signalType, string name, string[] defVals, int localIndex)
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
136 {
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
137 string fullArgs, args;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
138 int defValsLength = defVals.length;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
139 string argsConversion = "";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
140 string argsPtr = "null";
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
141 static if (A.length)
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
142 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
143 while(A.length != defVals.length)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
144 defVals = "" ~ defVals;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
145
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
146 fullArgs = A[0].stringof ~ " _t0";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
147 if (defVals[0].length)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
148 fullArgs ~= " = " ~ defVals[0];
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
149 args = "_t0";
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
150 foreach(i, _; A[1..$])
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
151 {
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
152 fullArgs ~= ", " ~ A[i+1].stringof ~ " _t" ~ __toString(i+1);
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
153 if (defVals[i+1].length)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
154 fullArgs ~= " = " ~ defVals[i+1];
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
155 args ~= ", _t" ~ __toString(i+1);
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
156 }
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
157 // build up conversion of signal args from D to C++
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
158 argsPtr = "_a.ptr";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
159 argsConversion = convertSignalArguments!(A)();
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
160 }
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
161 string attribute;
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
162 string sigName = name;
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
163 if (signalType == SignalType.BindQtSignal)
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
164 name ~= "_emit";
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
165 else
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
166 attribute = "protected ";
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
167
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
168 string indexArgs = __toString(localIndex);
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
169 if(defValsLength > 0)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
170 indexArgs ~= ", " ~ __toString(localIndex+defValsLength);
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
171 string str = attribute ~ "final void " ~ name ~ "(" ~ fullArgs ~ ") {\n" ~ argsConversion ~ "\n"
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
172 ~ " QMetaObject.activate(this, typeof(this).staticMetaObject, " ~ indexArgs ~ ", " ~ argsPtr ~ ");\n"
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
173 ~ "}\n"; // ~
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
174 return str;
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
175 }
278
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
5df570e79cfc new syntax for connecting using static information
eldar
parents: 276
diff changeset
178
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
179 const string signalPrefix = "__signal";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
180 const string slotPrefix = "__slot";
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
181
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
182 enum SignalType
1
e78566595089 initial import
mandel
parents:
diff changeset
183 {
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
184 BindQtSignal,
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
185 NewSignal,
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
186 NewSlot
284
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
187 }
1f6923c8cba0 consistent emit syntax.
eldar
parents: 282
diff changeset
188
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
189 string signature(T...)(string name)
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
190 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
191 string res = name ~ "(";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
192 foreach(i, _; T)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
193 {
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
194 if(i > 0)
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
195 res ~= ",";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
196 static if (isNativeType!(T[i]))
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
197 res ~= Unqual!(T[i]).stringof;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
198 else
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
199 res ~= T[i].stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
200 }
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
201 res ~= ")";
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
202 return res;
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
203 }
1
e78566595089 initial import
mandel
parents:
diff changeset
204
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
205 // ------------------------------------------------------------------
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 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
208 {
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 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
210 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
211 foreach(s; allSymbols)
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 if(ctfeStartsWith(s, 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
213 result ~= s;
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 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
215 }
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 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
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 foreach (i, c; 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
220 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
221 return source[i+1..$];
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 template Alias(T...)
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 {
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 alias T Alias;
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 {
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 alias Alias!(__traits(getOverloads, C, signals[id])) current;
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
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 alias current 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
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
320
5c6455c4889b remove rubbish
eldar_ins@eldar-laptop
parents: 319
diff changeset
259 /* commented out for future when we will implement default arguments
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 template metaMethods(alias func, int index, int defValsCount)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
261 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
262 static if(defValsCount >= 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
263 alias TupleWrapper!(func, index) current;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
264 // pragma(msg, __traits(identifier, (current.at)[0]) ~ " " ~ typeof(&(current.at)[0]).stringof);
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
265 alias metaMethods!(func, index+1, defValsCount-1).result next;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
266 alias TypeTuple!(current, next) 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
267 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
268 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
269 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
270 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
271 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
272 }
320
5c6455c4889b remove rubbish
eldar_ins@eldar-laptop
parents: 319
diff changeset
273 */
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
274
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
275 template toMetaEntriesImpl(int id, Methods...)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
276 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
277 static if (Methods.length > 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
278 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
279 alias typeof(&Methods[id]) Fn;
320
5c6455c4889b remove rubbish
eldar_ins@eldar-laptop
parents: 319
diff changeset
280 // commented out for future when we will implement default arguments
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
281 // enum defValsLength = 0; //ParameterTypeTuple!(Fn).length - requiredArgCount!(Methods[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
282 // pragma(msg, __traits(identifier, Methods[id]) ~ " " ~ typeof(&Methods[id]).stringof);
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
283 // alias metaMethods!(Methods[id], 0, defValsLength).result subres;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
284 alias TupleWrapper!(removePrefix(__traits(identifier, Methods[id])), typeof(&Methods[id])) subres;
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
285 alias TypeTuple!(subres, toMetaEntriesImpl!(id+1, Methods).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
286 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
287 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
288 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
289 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
290 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
291 }
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
292
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
293 template toMetaEntries(Methods...)
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
294 {
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
295 alias TupleWrapper!(toMetaEntriesImpl!(0, Methods).result) toMetaEntries;
288
f9559a957be9 new signals and slots implementation
eldar
parents: 284
diff changeset
296 }