view mde/gui/widget/miscWidgets.d @ 49:bca7e2342d77

Enabled getting the size of a text block (before or after rendering). committer: Diggory Hardy <diggory.hardy@gmail.com>
author Diggory Hardy <diggory.hardy@gmail.com>
date Sat, 31 May 2008 13:10:06 +0100
parents a98ffb64f066
children 9e1f05fbbcef
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/>. */

/** Some GUI Miscelaneas widgets. */
module mde.gui.widget.miscWidgets;

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

import mde.resource.font;

import tango.io.Stdout;


/// A fixed-size blank widget.
class FixedBlankWidget : FixedWidget
{
    this (IWindow wind, int[] data) {
        if (data.length != 3) throw new WidgetDataException;
        super (wind, data);
    }
    
    void draw () {
        super.draw;
        
        window.renderer.drawBlank (x,y, w,h);
    }
}

/// A completely resizable blank widget (initial size zero).
class SizableBlankWidget : SizableWidget
{
    this (IWindow wind, int[] data) {
        if (data.length != 1) throw new WidgetDataException;
        super (wind, data);
    }
    
    void draw () {
        super.draw;
        
        window.renderer.drawBlank (x,y, w,h);
    }
}

/// First interactible widget
class ButtonWidget : FixedWidget
{
    bool pushed = false;    // true if button is pushed in (visually)
    // pushed is not the same as the button being clicked but not yet released.
    // it is whether the mouse is over the button after being clicked.
    
    this (IWindow wind, int[] data) {
        if (data.length != 3) throw new WidgetDataException;
        super (wind, data);
    }
    
    void draw () {
        window.renderer.drawButton (x,y, w,h, pushed);
    }
    
    void clickEvent (ushort, ushort, ubyte b, bool state) {
        if (b == 1 && state == true) {
            pushed = true;
            window.requestRedraw;
            window.gui.addClickCallback (&clickWhileHeld);
            window.gui.addMotionCallback (&motionWhileHeld);
        }
    }
    // Called when a mouse motion/click event occurs while (held == true)
    bool clickWhileHeld (ushort cx, ushort cy, ubyte b, bool state) {
        if (b == 1 && state == false) {
            if (cx >= x && cx < x+w && cy >= y && cy < y+h) // button event
                Stdout ("Button clicked!").newline;
            
            pushed = false;
            window.requestRedraw;
            window.gui.removeCallbacks (cast(void*) this);
            
            return true;
        }
        return false;
    }
    void motionWhileHeld (ushort cx, ushort cy) {
        bool oldPushed = pushed;
        if (cx >= x && cx < x+w && cy >= y && cy < y+h) pushed = true;
        else pushed = false;
        if (oldPushed != pushed)
            window.requestRedraw;
    }
}

/// Basic text widget
class TextWidget : Widget
{
    this (IWindow wind, int[] data) {
        if (data.length != 1) throw new WidgetDataException;
        if (font is null) font = FontStyle.get("default");
        font.updateBlock (str, textCache);
        mw = textCache.w;
        mh = textCache.h;
        super (wind,data);
    }
    
    void draw () {
        super.draw();
        font.textBlock (x,y, str, textCache);	// test new-lines and unicode characters
    }
    
protected:
    const str = "Text Widget\nαβγ − ΑΒΓ";
    TextBlock textCache;
    static FontStyle font;
}