view mde/gui/widget/Ifaces.d @ 36:57d000574d75

Enabled drawing on demand, and made the polling interval configurable. Renamed mde.global to mde.imde. Enabled drawing on demand. Allowed options to take double values. Made the main loop's polling interval (sleep duration) settable from config files. committer: Diggory Hardy <diggory.hardy@gmail.com>
author Diggory Hardy <diggory.hardy@gmail.com>
date Fri, 02 May 2008 17:38:43 +0100
parents 6b4116e6355c
children 052df9b2fe07
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/>. */

/** Window and widget interfaces. */
module mde.gui.widget.Ifaces;

public import mde.gui.renderer.IRenderer;
import mde.gui.IGui;

/** Interface for Window, allowing widgets to call some of Window's methods.
*
* Contains the methods in Window available for widgets to call on their root. */
interface IWindow : IWidget
{
    /** Widget ID type. Each ID is unique under this window.
    *
    * Type is int since this is the widget data type. */
    alias int widgetID;
    
    /** Get a widget by ID.
    *
    * Returns the widget with the given ID from the Window's widget list. If the widget hasn't yet
    * been created, creates it using the Window's widget creation data.
    *
    * Widgets should never be used more than once (must have a unique parent and position!), and
    * this function is only intended for widgets to get child-widgets, hence a warning is logged
    * if a widget is asked for more than once. */
    //NOTE: possibly revise: parent isn't actually used any more
    IWidget makeWidget (widgetID i, IWidget parent);
    
    /** Get the managing Gui. */
    IGui gui ();
    
    /** Get the window's renderer.
    *
    * Normally specific to the GUI, but widgets have no direct contact with the GUI and this
    * provides the possibility of per-window renderers (if desired). */
    IRenderer renderer ();
}

/** Interface for widgets.
*
* Note that Window also implements this interface so that widgets can interact with their parent in
* a uniform way.
*
* A widget is a region of a GUI window which handles rendering and user-interaction for itself
* and is able to communicate with it's window and parent/child widgets as necessary.
*
* A widget's constructor should have this prototype:
* ----------------------------------
* this (IWindow window, IWidget parent, int[] data);
* ----------------------------------
* Where window is the root window (the window to which the widget belongs), parent is the parent
* widget, and data is an array of initialisation data. The method should throw a
* WidgetDataException (created without parameters) if the data has wrong length or is otherwise
* invalid. */
interface IWidget
{
    /** Calculate the minimum size the widget could be shrunk to, taking into account
     * child-widgets. */
    void getMinimumSize (out int w, out int h);
    
    /** Get the current size of the widget.
     *
     * On the first call (during loading), this may be a value saved as part of the config or
     * something else (e.g. revert to getMinimumSize). */
    void getCurrentSize (out int w, out int h);
    
    /** Set the current position (i.e. called on init and move). */
    void setPosition (int x, int y);
    
    /** Recursively scan the widget tree to find the widget under (x,y).
     *
     * If called on a widget, that widget should assume the location is over itself, and so should
     * either return itself or the result of calling getWidget on the appropriate child widget.
     *
     * In the case of Window this may not be the case; it should check and return null if not under
     * (x,y).
     *
     * Note: use global coordinates (x,y) not coordinates relative to the widget. */
    IWidget getWidget (int x, int y);
    
    /** Receive a mouse click event.
     *
     * See mde.input.input.Input.MouseClickCallback for parameters. However, cx and cy are adjusted
     * to the Widget's local coordinates.
     *
     * Widget may assume coordinates are on the widget (caller must check). */
    void clickEvent (ushort cx, ushort cy, ubyte b, bool state);
    
    /** Draw, using the stored values of x and y.
     *
     * Maybe later enforce clipping of all sub-widget drawing, particularly for cases where only
     * part of the widget is visible: scroll bars or a hidden window. */
    void draw ();
}