diff mde/gui/Gui.d @ 39:5132301e9ed7

Implemented widget saving. Widget creation data saving (sub-widgets, etc:) code there but not used. Widget mutable data saving & loading: window size/position, row/column dimensions saved (still needs a fix in GridWidget.setSize()). committer: Diggory Hardy <diggory.hardy@gmail.com>
author Diggory Hardy <diggory.hardy@gmail.com>
date Wed, 07 May 2008 13:07:03 +0100
parents 57d000574d75
children b3a6ca4516b4
line wrap: on
line diff
--- a/mde/gui/Gui.d	Mon May 05 17:02:21 2008 +0100
+++ b/mde/gui/Gui.d	Wed May 07 13:07:03 2008 +0100
@@ -37,6 +37,7 @@
 import mt = mde.mergetag.DefaultData;
 import mt = mde.mergetag.exception;
 import mde.mergetag.Reader;
+import mde.mergetag.Writer;
 import mde.resource.paths;
 
 import tango.util.log.Log : Log, Logger;
@@ -56,7 +57,7 @@
     //BEGIN Methods for external use
     //BEGIN Loading code
     /** Load all windows from the file gui. */
-    void load(char[] fileName) {
+    void load (char[] fileName) {
         if (!confDir.exists (fileName)) {
             logger.error ("Unable to load GUI: no config file!");
             return; // not a fatal error (so long as the game can run without a GUI!)
@@ -64,7 +65,7 @@
         
         IReader reader;
         try {
-            reader = confDir.makeMTReader (fileName, PRIORITY.HIGH_ONLY, null, true);
+            reader = confDir.makeMTReader (fileName, PRIORITY.HIGH_LOW, null, true);
             reader.dataSecCreator = delegate mt.IDataSection(mt.ID id) {
                 return new Window (id);
             };
@@ -77,12 +78,13 @@
         }
         
         // Get the renderer
-        char[]* p = "Renderer" in reader.dataset.header.Arg!(char[]).Arg;
+        char[]* p = RENDERER in reader.dataset.header.Arg!(char[]).Arg;
         if (p is null || *p is null) {
             logger.error ("Loading GUI aborted: no renderer specified");
             return;
         }
-        rend = createRenderer (*p);
+        rendName = *p;
+        rend = createRenderer (rendName);
         
         // get list
         windows.length = reader.dataset.sec.length; // pre-allocate
@@ -104,6 +106,32 @@
         imde.input.addMouseClickCallback(&clickEvent);
         imde.input.addMouseMotionCallback(&motionEvent);
     }
+    
+    void save (char[] fileName) {
+        mt.DataSet ds = new mt.DataSet;
+        
+        // Add header:
+        ds.header = new mt.DefaultData;
+        ds.header.Arg!(char[]).Arg[RENDERER] = rendName;
+        
+        // Add windows to be saved:
+        foreach (window; windows)
+            ds.sec [window.name] = window;
+        
+        try {   // Save
+            IWriter writer;
+            writer = confDir.makeMTWriter (fileName, ds);
+            writer.write;
+        } catch (mt.MTException e) {
+            logger.error ("Saving GUI failed:");
+            logger.error (e.msg);
+            
+            return;
+        }
+    }
+    private static const {
+        auto RENDERER = "Renderer";
+    }
     //END Loading code
     
     /** Draw each window.
@@ -171,7 +199,10 @@
     
 private:
     Window[] windows;   // Windows. First window is "on top", others may be obscured.
-    IRenderer rend;
+    
+    IRenderer rend;     // Renderer (synonymous with theme)
+    char[] rendName;    // Name of renderer; for saving
+    
     // callbacks indexed by their frame pointers:
     void delegate(ushort cx, ushort cy, ubyte b, bool state) [void*] clickCallbacks;
     void delegate(ushort cx, ushort cy) [void*] motionCallbacks;