Mercurial > projects > mde
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;