Mercurial > projects > mde
comparison mde/content/AStringContent.d @ 112:fe061009029d
EnumContent; log level can be selected from a popup list.
New EnumContent, with code to load translations in Items. Editable as an AStringContent.
Hacked OptionsMisc to use an EnumContent.
Implemented a EnumContentWidget providing a pop-up list to select from (still needs improving).
Moved IContent to its own module.
ContentExceptions thrown via WDCCheck now.
Fixed a small bug with reloading translations.
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Sat, 13 Dec 2008 12:54:43 +0000 |
parents | 08651e8a8c51 |
children | 1b1e2297e2fc |
comparison
equal
deleted
inserted
replaced
111:1655693702fc | 112:fe061009029d |
---|---|
48 /** Base class for content containing a simple value editable as text. All content types used by | 48 /** Base class for content containing a simple value editable as text. All content types used by |
49 * Options extend this class. | 49 * Options extend this class. |
50 * | 50 * |
51 * All derived classes should have the following functions: | 51 * All derived classes should have the following functions: |
52 * --- | 52 * --- |
53 * void endEdit (); // Should convert sv and assign to self, then call endEvent | 53 * char[] endEdit (); // Should convert sv and assign to self, then call endEvent |
54 * // Used by Options: | 54 * // Used by Options: |
55 * BoolContent changeCb (void delegate (char[] symbol,T value) cb); // The callback used by Options | 55 * BoolContent changeCb (void delegate (char[] symbol,T value) cb); // The callback used by Options |
56 * void assignNoCb (T val); // assign val, but without calling callbacks | 56 * void assignNoCb (T val); // assign val, but without calling callbacks |
57 * --- | 57 * --- |
58 * On any assignation (by this, assignNoCb, opAssign) the value should be converted to a string and | 58 * On any assignation (by this, assignNoCb, opAssign) the value should be converted to a string and |
124 if (!(sv[p] & 0x80) || sv[p] & 0x40) | 124 if (!(sv[p] & 0x80) || sv[p] & 0x40) |
125 ++i; | 125 ++i; |
126 return i; | 126 return i; |
127 } | 127 } |
128 | 128 |
129 /// Call after editing a string | 129 /** Call after editing a string; return new string (may be changed/reverted). */ |
130 void endEdit (); | 130 char[] endEdit (); |
131 | 131 |
132 protected: | 132 protected: |
133 char[] sv; // string of value; updated on assignment for displaying and editing | 133 char[] sv; // string of value; updated on assignment for displaying and editing |
134 size_t pos; // editing position; used by keyStroke | 134 size_t pos; // editing position; used by keyStroke |
135 } | 135 } |
154 bool opCall () { | 154 bool opCall () { |
155 return v; | 155 return v; |
156 } | 156 } |
157 alias opCall opCast; | 157 alias opCall opCast; |
158 | 158 |
159 override void endEdit () { | 159 override char[] endEdit () { |
160 v = sv && (sv[0] == 't' || sv[0] == 'T' || sv[0] == '1'); | 160 v = sv && (sv[0] == 't' || sv[0] == 'T' || sv[0] == '1'); |
161 endEvent; | 161 endEvent; |
162 return sv; | |
162 } | 163 } |
163 | 164 |
164 protected: | 165 protected: |
165 bool v; | 166 bool v; |
166 } | 167 } |
184 char[] opCall () { | 185 char[] opCall () { |
185 return v; | 186 return v; |
186 } | 187 } |
187 alias opCall opCast; | 188 alias opCall opCast; |
188 | 189 |
189 override void endEdit () { | 190 override char[] endEdit () { |
190 endEvent; | 191 endEvent; |
192 return sv; | |
191 } | 193 } |
192 | 194 |
193 protected: | 195 protected: |
194 alias sv v; // don't need separate v and sv in this case | 196 alias sv v; // don't need separate v and sv in this case |
195 } | 197 } |
215 int opCall () { | 217 int opCall () { |
216 return v; | 218 return v; |
217 } | 219 } |
218 alias opCall opCast; | 220 alias opCall opCast; |
219 | 221 |
220 override void endEdit () { | 222 override char[] endEdit () { |
221 v = Int.toInt (sv); | 223 v = Int.toInt (sv); |
222 endEvent; | 224 endEvent; |
225 return sv; | |
223 } | 226 } |
224 | 227 |
225 protected: | 228 protected: |
226 int v; | 229 int v; |
227 } | 230 } |
247 double opCall () { | 250 double opCall () { |
248 return v; | 251 return v; |
249 } | 252 } |
250 alias opCall opCast; | 253 alias opCall opCast; |
251 | 254 |
252 override void endEdit () { | 255 override char[] endEdit () { |
253 v = Float.toFloat (sv); | 256 v = Float.toFloat (sv); |
254 endEvent; | 257 endEvent; |
258 return sv; | |
255 } | 259 } |
256 | 260 |
257 protected: | 261 protected: |
258 double v; | 262 double v; |
259 } | 263 } |
264 | |
265 /** A content representing an enumeration. */ | |
266 class EnumContent : IntContent | |
267 { | |
268 /** CTOR. | |
269 * | |
270 * Params: | |
271 * enumSymbols = Symbol names for each | |
272 * val = which value is active; must be in [0,length-1] | |
273 */ | |
274 this (char[] symbol, char[][] enumSymbols, int val = 0) { | |
275 this.enumSymbols = enumSymbols; | |
276 enumName = enumSymbols.dup; // dup top array but not strings; elements of top array are replaced when tranlated | |
277 enumDesc.length = enumSymbols.length; // top array should always be allocated | |
278 super (symbol, val); | |
279 } | |
280 | |
281 void nameEnum (uint i, char[] name, char[] desc = null) { | |
282 enumName[i] = name; | |
283 enumDesc[i] = desc; | |
284 if (v == i) | |
285 sv = name; // keep sv in sync | |
286 } | |
287 | |
288 char[] toString (uint i) { | |
289 return i >= 3 ? enumName[i-3] | |
290 : i == 0 ? enumName[v] | |
291 : i == 1 ? name_ | |
292 : i == 2 ? desc_ | |
293 : null; | |
294 } | |
295 | |
296 void assignNoCb (int val) { | |
297 if (val >= enumSymbols.length || val < 0) { | |
298 logger.error ("EnumContent "~name_~" assigned invalid value; keeping value: "~enumName[v]); | |
299 return; | |
300 } | |
301 v = val; | |
302 sv = enumName[v]; | |
303 if (pos > sv.length) pos = sv.length; | |
304 } | |
305 | |
306 override char[] endEdit () { | |
307 foreach (i,n; enumName) | |
308 if (sv == n) { | |
309 v = i; | |
310 goto break1; | |
311 } | |
312 | |
313 logger.error ("EnumContent "~name_~" assigned invalid value; keeping value: "~enumName[v]); | |
314 sv = enumName[v]; // sv was edited; revert | |
315 if (pos > sv.length) pos = sv.length; | |
316 | |
317 break1: | |
318 endEvent; | |
319 logger.trace ("All logging levels: {}", enumName); | |
320 return sv; | |
321 } | |
322 | |
323 final char[][] enumSymbols; | |
324 protected: | |
325 char[][] enumName; | |
326 char[][] enumDesc; | |
327 uint value; | |
328 } |