Mercurial > projects > mde
diff 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 |
line wrap: on
line diff
--- a/mde/content/AStringContent.d Sat Dec 06 17:41:42 2008 +0000 +++ b/mde/content/AStringContent.d Sat Dec 13 12:54:43 2008 +0000 @@ -50,7 +50,7 @@ * * All derived classes should have the following functions: * --- - * void endEdit (); // Should convert sv and assign to self, then call endEvent + * char[] endEdit (); // Should convert sv and assign to self, then call endEvent * // Used by Options: * BoolContent changeCb (void delegate (char[] symbol,T value) cb); // The callback used by Options * void assignNoCb (T val); // assign val, but without calling callbacks @@ -126,8 +126,8 @@ return i; } - /// Call after editing a string - void endEdit (); + /** Call after editing a string; return new string (may be changed/reverted). */ + char[] endEdit (); protected: char[] sv; // string of value; updated on assignment for displaying and editing @@ -156,9 +156,10 @@ } alias opCall opCast; - override void endEdit () { + override char[] endEdit () { v = sv && (sv[0] == 't' || sv[0] == 'T' || sv[0] == '1'); endEvent; + return sv; } protected: @@ -186,8 +187,9 @@ } alias opCall opCast; - override void endEdit () { + override char[] endEdit () { endEvent; + return sv; } protected: @@ -217,9 +219,10 @@ } alias opCall opCast; - override void endEdit () { + override char[] endEdit () { v = Int.toInt (sv); endEvent; + return sv; } protected: @@ -249,11 +252,77 @@ } alias opCall opCast; - override void endEdit () { + override char[] endEdit () { v = Float.toFloat (sv); endEvent; + return sv; } protected: double v; } + +/** A content representing an enumeration. */ +class EnumContent : IntContent +{ + /** CTOR. + * + * Params: + * enumSymbols = Symbol names for each + * val = which value is active; must be in [0,length-1] + */ + this (char[] symbol, char[][] enumSymbols, int val = 0) { + this.enumSymbols = enumSymbols; + enumName = enumSymbols.dup; // dup top array but not strings; elements of top array are replaced when tranlated + enumDesc.length = enumSymbols.length; // top array should always be allocated + super (symbol, val); + } + + void nameEnum (uint i, char[] name, char[] desc = null) { + enumName[i] = name; + enumDesc[i] = desc; + if (v == i) + sv = name; // keep sv in sync + } + + char[] toString (uint i) { + return i >= 3 ? enumName[i-3] + : i == 0 ? enumName[v] + : i == 1 ? name_ + : i == 2 ? desc_ + : null; + } + + void assignNoCb (int val) { + if (val >= enumSymbols.length || val < 0) { + logger.error ("EnumContent "~name_~" assigned invalid value; keeping value: "~enumName[v]); + return; + } + v = val; + sv = enumName[v]; + if (pos > sv.length) pos = sv.length; + } + + override char[] endEdit () { + foreach (i,n; enumName) + if (sv == n) { + v = i; + goto break1; + } + + logger.error ("EnumContent "~name_~" assigned invalid value; keeping value: "~enumName[v]); + sv = enumName[v]; // sv was edited; revert + if (pos > sv.length) pos = sv.length; + + break1: + endEvent; + logger.trace ("All logging levels: {}", enumName); + return sv; + } + + final char[][] enumSymbols; +protected: + char[][] enumName; + char[][] enumDesc; + uint value; +}