Mercurial > projects > mde
view mde/gui/content/Items.d @ 104:ee209602770d
Cleaned up Options.d removing old storage method. It's now possible to get a ContentList of the whole of Options.
Tweaked translation strings (added name and desc to Options classes).
Replaced Options.addSubClass (class, "name") with Options.this("name").
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Wed, 26 Nov 2008 13:07:46 +0000 |
parents | 42e241e7be3e |
children |
line wrap: on
line source
/* 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/>. */ /************************************************************************************************** * A generic way to access content items. *************************************************************************************************/ module mde.gui.content.ContentItems; import mde.gui.content.Content; import mde.gui.exception; import mde.lookup.Options; import mde.lookup.Translation; debug { import tango.util.log.Log : Log, Logger; private Logger logger; static this () { logger = Log.getLogger ("mde.gui.content.Items"); } } /** Get a specific content item. * * E.g. get ("Options.MiscOptions.L10n") returns miscOpts.L10n, * Items.get ("Options.MiscOptions") returns a ContentList of all misc options. */ IContent get (char[] item) { char[] h = head (item); if (h == "Options") return getOptions (item); throw new ContentItemException (h); } /** Same as calling get("Options."~item). */ IContent getOptions (char[] item) { if (item is null) { IContent[] list; list.length = Options.optionsClasses.length; size_t i; foreach (n,opts; Options.optionsClasses) { if (opts.name is null) loadTransl (opts, n); list[i++] = new ContentList (opts.content, opts.name, opts.desc); } return new ContentList (list, "Options"); } char[] h = head (item); auto p = h in Options.optionsClasses; if (p) { if (p.name is null) loadTransl (*p, h); if (item == null) return new ContentList (p.content, p.name, p.desc); auto q = (h = head (item)) in p.content; if (q && item is null) // enforce item is an exact match return *q; } throw new ContentItemException (h); } private: /** Takes the string "head.tail" where tail may contain '.' but head does not, returns "head", * with str set to "tail". */ char[] head (ref char[] str) { size_t i = 0; while (i < str.length && str[i] != '.') ++i; char[] ret = str[0..i]; if (i == str.length) str = null; else str = str[i+1..$]; return ret; } void loadTransl (Options p, char[] n) { debug logger.trace ("Loading translation strings for Options."~n); Translation trans = Translation.load ("L10n/"~n); Translation.Entry transled = trans.getStruct (n); p.name = transled.name; p.desc = transled.desc; foreach (s, v; p.content) { transled = trans.getStruct (s); v.name (transled.name, transled.desc); } }