diff mde/content/AStringContent.d @ 126:c9843fbaac88

Dynamic minimal size changing improved; works over layouts sharing alignment. EnumContent sub-contents use EnumValueContent instead of BoolContent; fixes a few small bugs. EnumContent substrings get translated (bug fixed). The widget manager no longer attempts to set widget sizes smaller than their minimals, even though some will not be shown. SwitchWidget: has fixed sizableness now.
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 08 Jan 2009 13:05:44 +0000
parents a2ef6b549101
children 41582439a42b
line wrap: on
line diff
--- a/mde/content/AStringContent.d	Tue Jan 06 16:54:04 2009 +0000
+++ b/mde/content/AStringContent.d	Thu Jan 08 13:05:44 2009 +0000
@@ -154,6 +154,10 @@
 	assignNoCb (val);
 	super (symbol);
     }
+    // for use by EnumValueContent
+    protected this (char[] symbol, int dummy) {
+        super (symbol);
+    }
     
     void assignNoCb (bool val) {
 	v = val;
@@ -289,7 +293,6 @@
 /** A content representing an enumeration.
  *
  * Extends IntContent for Options support. */
-// maybe avoid problems by adding a special callback to BoolContent subclass?
 class EnumContent : IntContent, IContentList
 {
     /** CTOR.
@@ -300,29 +303,32 @@
     */
     this (char[] symbol, char[][] enumSymbols, int val = 0) {
         enums.length = enumSymbols.length;
+        char[] symPeriod = symbol~'.';
         foreach (i, ref e; enums) {
-            e = new BoolContent (enumSymbols[i], false);
-            e.addCallback (&enumAssignCb);
+            e = new EnumValueContent (this, i, symPeriod~enumSymbols[i]);
         }
-	super (symbol, val);
-        //NOTE: if val is 0, no enumeration should be set; however it seems to work!
+        super (symbol, val);	// calls assignNoCb
     }
     
-    override void assignNoCb (int val) {
-        if (val == v) return;
+    override void assignNoCb (int val) {	// called by children (via opAssign)
         if (val >= enums.length || val < 0) {
 	    logger.error ("EnumContent "~name_~" assigned invalid value; keeping value: "~sv);
 	    return;
 	}
-        enums[v] = false;
-        enums[val] = true;
+        enums[v]  .assignFromParent (false);
+        enums[val].assignFromParent (true);
 	v = val;
-        svAssign;
+        sv = enums[v].name_;
+        if (pos > sv.length) pos = sv.length;
+        endEvent;
     }
-    void svAssign () {
-	sv = enums[v].name_;
-	if (pos > sv.length) pos = sv.length;
-        endEvent;
+    // Change if true, assert current value if false
+    void childAssign (int val) {
+        debug assert (0 <= val && val < enums.length, "cA out of bounds");
+        if (enums[val].v)
+            assignNoCb (val);
+        else
+            enums[val].assignFromParent (v == val);
     }
     
     override char[] endEdit () {
@@ -346,19 +352,35 @@
     }
     
 protected:
-    void enumAssignCb (Content c) {
-        if (enums[v] is c) {	// No other is set so persist value
-            enums[v].assignNoCb (true);
+    EnumValueContent[] enums;
+    
+    /** Special version of BoolContent for each enumeration to update the parent Enum. */
+    private class EnumValueContent : BoolContent {
+        /** New enumeration of parent with index num. */
+        this (EnumContent parent, size_t num, char[] symbol) {
+            this.parent = parent;
+            i = num;
+            super (symbol, 0);	// parent sets value (if true); we shouldn't
+            sv = "false";	// except for this
+        }
+        
+        override void assignNoCb (bool val) {
+            v = val;
+            parent.childAssign (i);
         }
-        foreach (i,e; enums)
-            if (c is e) {
-            	enums[v].assignNoCb = false;	// NOTE: opAssign causes sigsegv (due to recursive calling?)
-                v = i;
-                svAssign;
-                return;
-            }
-        debug logger.error ("EnumContent.enumAssignCb: invalid value (code error)");
+        void assignFromParent (bool val) {	// don't call back to parent
+            super.assignNoCb (val);
+            endEvent;
+        }
+        
+        override char[] endEdit () {
+            v = sv && (sv[0] == 't' || sv[0] == 'T' || sv[0] == '1');
+            parent.childAssign (i);
+            return sv;
+        }
+    
+    protected:
+        EnumContent parent;
+        size_t i;
     }
-    
-    BoolContent[] enums;	// NOTE: an array isn't always fastest
 }