Mercurial > projects > mde
diff mde/gui/WidgetDataSet.d @ 80:ea58f277f487
Gui reorganization and changes; partial implementation of floating widgets.
Moved contents of mde/gui/WidgetData.d elsewhere; new gui/WidgetDataSet.d and gui/types.d modules.
Changes to widget/createWidget.d
Partially implemented FloatingAreaWidget to provide an area for floating "window" widgets.
New DebugWidget and some uses of it (e.g. bad widget data).
Decoupled OptionChanges from Options.
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Thu, 07 Aug 2008 11:25:27 +0100 |
parents | mde/gui/WidgetData.d@61ea26abe4dd |
children | d8fccaa45d5f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mde/gui/WidgetDataSet.d Thu Aug 07 11:25:27 2008 +0100 @@ -0,0 +1,110 @@ +/* LICENSE BLOCK +Part of mde: a Modular D game-oriented Engine +Copyright © 2007-2008 Diggory Hardy + +This program is free software: you can redistribute it and/or modify it under the terms +of the GNU General Public License as published by the Free Software Foundation, either +version 2 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/************************************************************************************************* + * Code to manage the data used to create widgets and save changes to it. + * + * When loading, a WidgetDataSet instance is loaded from file and its data used to create the + * widgets. An empty WidgetDataChanges instance is also created. + * + * If any data requires changing, it is added to the WidgetDataChanges instance, which also + * updates the the WidgetDataSet instance used to load the widgets (in case of a re-load from this + * data). When the data should be saved, if the WidgetDataChanges instance is not empty, data from + * the highest priority (i.e. the user) file is merged into it, preserving both the current + * changes and previous changes saved to the use file, before saving to the user file. + *************************************************************************************************/ +module mde.gui.WidgetDataSet; + +public import mde.gui.types; + +// For loading from file: +import mt = mde.mergetag.DataSet; +import mt = mde.mergetag.DefaultData; +import mt = mde.mergetag.exception; +import mde.mergetag.serialize; +import tango.util.log.Log : Log, Logger; + +private Logger logger; +static this () { + logger = Log.getLogger ("mde.gui.WidgetDataSet"); +} + +/************************************************************************************************* + * Contains data for all widgets in a GUI. + *************************************************************************************************/ +class WidgetDataSet : mt.IDataSection +{ + //BEGIN Mergetag code + void addTag (char[] tp, mt.ID id, char[] dt) { + // Priority is HIGH_LOW. Only load tag if it doesn't already exist. + if (tp == "WidgetData" && (id in widgetData) is null) { + widgetData[id] = deserialize!(WidgetData) (dt); + } + } + // Only WidgetDataChanges is used for writing. + void writeAll (ItemDelg dlg) {} + //END Mergetag code + + /** Get the widget data for widget i. */ + WidgetData opIndex (widgetID id) { + auto p = id in widgetData; + if (p is null) { + logger.error ("No data for widget "~id~"; creating a debug widget instead."); + return WidgetData.dbg; + } + return *p; + } + + // Per-widget data: + protected WidgetData[widgetID] widgetData; +} + +/************************************************************************************************* + * Contains changes to widget data. + * + * Can be read as normal and written. + *************************************************************************************************/ +class WidgetDataChanges : WidgetDataSet +{ + /** + * Params: + * wds = The base WidgetDataSet these changes are applied against. */ + this (WidgetDataSet wds) { + base = wds; + } + + //BEGIN Mergetag code + // HIGH_LOW priority of addTag allows existing entries (i.e. the changes) to be preserved while + // other entries are read from files. + void writeAll (ItemDelg dlg) { + foreach (id,data; widgetData) + dlg ("WidgetData", id, serialize!(WidgetData) (data)); + } + //END Mergetag code + + /** Set the widget data for widget i. + */ + void opIndexAssign (WidgetData d, widgetID i) { + widgetData[i] = d; + base.widgetData[i] = d; + } + + /** Do any changes exist? True if no changes have been stored. */ + bool none () { + return widgetData.length == 0; + } + + protected WidgetDataSet base; +}