view mde/gui/widget/TextWidget.d @ 111:1655693702fc

Resolved ticket #4, allowing widgets to reload strings and recalculate sizes mid-run. Removed prefinalize and finalize and added setup as the new second initialization phase, which can be re-run.
author Diggory Hardy <diggory.hardy@gmail.com>
date Sat, 06 Dec 2008 17:41:42 +0000
parents 6acd96f8685f
children fe061009029d
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/>. */

/** Basic text widget and supporting code for widgets containing text.
 *
 * All content widgets have one (at least for basic content widgets) Content, from
 * mde.gui.content.Items . */
module mde.gui.widget.TextWidget;

import mde.gui.widget.Widget;
import mde.gui.exception;
import mde.gui.renderer.IRenderer;
import mde.content.Content;

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

/** Base text widget.
 *
 * Little use currently except to ease future additions. */
class ATextWidget : AWidget
{
    /** Set the adapter first:
     * adapter = mgr.renderer.getAdapter ("string", 0xRRGGBB); */
    this (IWidgetManager mgr, widgetID id, WidgetData data) {
        super (mgr, id, data);
    }
    
    /** Recalculates dims if the renderer changed. */
    bool setup (uint,uint flags) {
	if (flags & 1) {
	    adapter.getDimensions (mw, mh);
	    if (mw != w || mh != h) {
		w = mw;
		h = mh;
		return true;
	    }
	}
	return false;
    }
    
    void draw () {
        super.draw();
        adapter.draw (x,y);
    }
    
protected:
    IRenderer.TextAdapter adapter;
}


/// Basic text widget
class TextLabelWidget : ATextWidget
{
    /** Constructor for a widget containing [fixed] content.
     *
     * Widget uses the initialisation data:
     * [widgetID, contentID, colour]
     * where contentID is an ID for the string ID of the contained content
     * and colour is an 8-bit-per-channel RGB colour of the form 0xRRGGBB. */
    this (IWidgetManager mgr, widgetID id, WidgetData data) {
        WDCheck (data, 2, 1);
        adapter = mgr.renderer.getAdapter (data.ints[1]);
	adapter.text = data.strings[0];
        super (mgr, id, data);
    }
}

/// Basic widget displaying a label from a content.
class ContentLabelWidget : ATextWidget
{
    this (IWidgetManager mgr, widgetID id, WidgetData data, IContent c) {
        WDCheck (data, 3, 0);
        content = c;
        if (!content) throw new ContentException ();
        index = data.ints[1];
        adapter = mgr.renderer.getAdapter (data.ints[2]);
        super (mgr, id,data);
    }
    
    bool setup (uint n, uint flags) {
	if (!(flags & 3)) return false;	// string or renderer (and possibly font) changed
	adapter.text = content.toString(index);
	return super.setup (n, 3);	// force redimensioning
    }
    
protected:
    IContent content;
    int index;
}