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 }