view mde/gui/widget/TextWidget.d @ 75:25cb7420dc91

A massive overhaul/rewrite for the gui's data management and setup code. Currently much that was working is broken. imde's classes are created in a static this instead of mde's main. gl setup code moved from gl/basic.d to gl/draw.d mergetag.DefaultData: now HIGH_LOW priority instead of LOW_HIGH. Reduced type list to only used types; small fix for indent function. setup.paths: new NoFileException thrown instead of MTFileIOException
author Diggory Hardy <diggory.hardy@gmail.com>
date Mon, 28 Jul 2008 18:17:48 +0100
parents 159775502bb4
children 3dfd934100f7
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.gui.content.Content;

import mde.font.font;

import tango.io.Stdout;

/// Adapter to ease use of ContentText
struct ContentAdapter(ContentT : IContent) {
    void set (char[] cID, int col) {
        if (font is null) font = FontStyle.get("default");
        
        static if (is(ContentT == ContentText)) {
            content = getContentText (cID);
        } else static if (is(ContentT == ContentInt)) {
            content = getContentInt (cID);
        } else static assert (false, "Unsupported content type");
        colour = Colour (cast(ubyte) (col >> 16u),
                         cast(ubyte) (col >> 8u),
                         cast(ubyte) col );
    }
    
    void getDimensions (out wdsize w, out wdsize h) {
        font.updateBlock (content.toString, textCache);
        w = cast(wdim) textCache.w;
        h = cast(wdim) textCache.h;
    }
    
    void draw (wdabs x, wdabs y) {
        font.textBlock (x,y, content.toString, textCache, colour);
    }
    
    ContentT content;
    TextBlock textCache;
    Colour colour;
    static FontStyle font;
}

/// Basic text widget
class ContentWidget(ContentT : IContent) : Widget
{
    /** 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, WidgetData data) {
        if (data.length != 2) throw new WidgetDataException;
        text.set (data.str, data[1]);
        text.getDimensions (mw, mh);
        super (mgr,data);
    }
    
    void draw () {
        super.draw();
        text.draw (x,y);
    }
    
protected:
    ContentAdapter!(ContentT) text;
}

alias ContentWidget!(ContentText) TextWidget;
alias ContentWidget!(ContentInt) IntWidget;


/// Adapter to ease use of ContentOptionWidget
struct ContentOptionAdapter {
    void set (IContent c, int col) {
        if (font is null) font = FontStyle.get("default");
        
        content = c;
        colour = Colour (cast(ubyte) (col >> 16u),
                         cast(ubyte) (col >> 8u),
                         cast(ubyte) col );
    }
    
    void getDimensions (out wdsize w, out wdsize h) {
        font.updateBlock (content.toString, textCache);
        w = cast(wdim) textCache.w;
        h = cast(wdim) textCache.h;
    }
    
    void draw (wdabs x, wdabs y) {
        font.textBlock (x,y, content.toString, textCache, colour);
    }
    
    IContent content;
    TextBlock textCache;
    Colour colour;
    static FontStyle font;
}

/// Basic text widget
class ContentOptionWidget : Widget
{
    this (IWindow wind, int[] data, IContent c) {
        if (data.length != 2) throw new WidgetDataException;
        content.set (c, data[1]);
        content.getDimensions (mw, mh);
        super (wind,data);
    }
    
    void draw () {
        super.draw();
        content.draw (x,y);
    }
    
protected:
    ContentOptionAdapter content;
}