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;
+}