view mde/content/Content.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 1b1e2297e2fc
children 9f035cd139c6
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/>. */

/*************************************************************************************************
 * The content system − interfaces and base Content class.
 *************************************************************************************************/
module mde.content.Content;

import util = mde.util;

debug {
    import tango.util.log.Log : Log, Logger;
    private Logger logger;
    static this () {
        logger = Log.getLogger ("mde.gui.content.Content");
    }
}

/** IContent − interface for all Content classes.
 *
 * Very little code uses IContent (except for passing opaquely). */
interface IContent
{
    /** Generically return strings.
    *
    * This serves two purposes: generically returning a string of/related to the content (i == 0),
    * and returning associated descriptors. Functions should adhere to (or add to) this table.
    *
    *  $(TABLE
    *  $(TR $(TH i) $(TH returns))
    *  $(TR $(TD 0) $(TD value))
    *  $(TR $(TD 1) $(TD Translated name or null))
    *  $(TR $(TD 2) $(TD Translated description or null))
    *  $(TR $(TD other) $(TD null))
    *  ) */
    char[] toString (uint i);
}

/** Content lists. Impemented by EnumContent as well as ContentList. */
interface IContentList : IContent
{
    /** Return all sub-contents. */
    Content[] list ();
}


/** The base for most or all content classes.
 *
 * Includes generic callback support, toString implementation and symbol access.
 * 
 * Derived classes should impement:
 * ---
 *  this (char[] symbol, T val = /+ default value +/);
 *  void opAssign (T val);	// assign val, calling callbacks
 *  T opCall ();		// return value
 *  alias opCall opCast;
 * --- */
class Content : IContent
{
    this (char[] symbol) {
	this.symbol = symbol;
	name_ = symbol;		// provide a temporary name
    }
    
    void name (char[] name, char[] desc = null) {
	name_ = name;
	desc_ = desc;
    }
    
    /** Add a callback. Callbacks are called in the order added. */
    Content addCallback (void delegate (Content) cb) {
	this.cb ~= cb;
	return this;
    }
    /// ditto
    Content addCallback (void function (Content) cb) {
	this.cb ~= util.toDg (cb);
	return this;
    }
    
    override char[] toString (uint i) {
	return i == 0 ? "No value"
	: i == 1 ? name_
	: i == 2 ? desc_
	: null;
    }
    
    /// End of an event, e.g. a button release or end of an edit (calls callbacks).
    void endEvent () {
	foreach (dg; cb)
	    dg (this);
    }
    
    final char[] symbol;	// Symbol name for this content
protected:
    char[] name_, desc_;	// name and description
    void delegate (Content) cb[];
}