view mde/gui/renderer/SimpleRenderer.d @ 166:55667d048c31

Made content displayable while being dragged.
author Diggory Hardy <diggory.hardy@gmail.com>
date Sun, 21 Jun 2009 12:19:18 +0200
parents 075705ad664a
children
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/>. */

/** A simple renderer. */
module mde.gui.renderer.SimpleRenderer;

import mde.gui.renderer.IRenderer;

import derelict.opengl.gl;
import mde.font.font;

/** Interface for renderers.
*
* Renderers provide unified drawing methods for widget, e.g. to draw a window background, a frame,
* or a button. The renderer will effectively be synonymous with the theme, except that a scripted
* renderer may also be available.
*
* The renderer is intended to be per-GUI. */
class SimpleRenderer : IRenderer
{
    this () {
        defaultFont = FontStyle.getDefault;
    }
    
    alias Border.BTYPE BTYPE;
    override Border getBorder (BTYPE type, bool wS, bool hS) {
        Border border;
        with (border) {
            if (type & BTYPE.RESIZE) {
                if (wS) capability  = RESIZE.X1 | RESIZE.X2;
                if (hS) capability |= RESIZE.Y1 | RESIZE.Y2;
            }
            if (type & BTYPE.LARGE) {
                y1 = 12;
                y2 = 6;
            }
            else if (type & BTYPE.SMALL)
                y1 = y2 = 4;
            x1 = x2 = y2;
        }
        return border;
    }
    
    override wdim layoutSpacing () {
        return 5;
    }
    
    
    //FIXME - make these do something
    // They should restrict the drawing of floating widgets to the floating area, for instance,
    // although this isn't strictly necessary.
    override void restrict (wdim x, wdim y, wdim w, wdim h) {}
    override void relax () {}
    
    override void drawBorder (Border* border, wdim x, wdim y, wdim w, wdim h) {
        glColor3f (0f, 0f, .8f);
        glRecti(x, y+h, x+w, y);
        
        if (border.capability != 0) {
            glColor3f (0f, 0f, .6f);
            glBegin (GL_TRIANGLES);
            wdim t = border.x1 + border.y1;
            glVertex2i (x, y);
            glVertex2i (x+t, y);
            glVertex2i (x, y+t);
            
            t = border.x2 + border.y1;
            glVertex2i (x+w, y);
            glVertex2i (x+w, y+t);
            glVertex2i (x+w-t, y);
            
            t = border.x2 + border.y2;
            glVertex2i (x+w, y+h);
            glVertex2i (x+w-t, y+h);
            glVertex2i (x+w, y+h-t);
            
            t = border.x1 + border.y2;
            glVertex2i (x, y+h);
            glVertex2i (x, y+h-t);
            glVertex2i (x+t, y+h);
            glEnd ();
        }
        
        //glColor3f (0f, 0f, 0f);
        //glRecti(x+border.x1, y+h-border.y2, x+w-border.x2, y+border.y1);
    }

    override void drawSpacers (wdabs x, wdabs y, wdsize w, wdsize h, wdims cols, wdims rows) {
        glColor3f (.2f, .2f, .2f);
        glBegin (GL_LINES);
        wdabs t = x - cast(wdim) 3;
        foreach (col; cols) {
            glVertex2i (t + col, y);
            glVertex2i (t + col, y + h);
        }
        t = y - cast(wdim) 3;
        foreach (row; rows) {
            glVertex2i (x, t + row);
            glVertex2i (x + w, t + row);
        }
        glEnd ();
    }
    
    override void drawWidgetBack (wdim x, wdim y, wdim w, wdim h) {}
    
    override void drawBlank (wdim x, wdim y, wdim w, wdim h) {
        glColor3f (.4f, .4f, .4f);
        glRecti(x, y+h, x+w, y);
    }
    
    override void drawButton (wdim x, wdim y, wdim w, wdim h, bool pushed) {
        if (pushed)
            glColor3f (1f, 0f, 1f);
        else
            glColor3f (.6f, 0f, .6f);
        glRecti(x, y+h, x+w, y);
    }
    
    override wdimPair getToggleSize () {
        wdimPair r;
        r.x = 16;
        r.y = 16;
        return r;
    }
    override void drawToggle (wdim x, wdim y, bool state, bool pushed) {
        float c = pushed ? .7f : .5f;
        if (state)
            glColor3f (0f, c, 0f);
        else
            glColor3f (c, 0f, 0f);
        glRecti (x,y+16, x+16,y);
    }
    
    override wdimPair getSliderSize () {
        wdimPair r;
        r.x = 20;
        r.y = 16;
        return r;
    }
    override void drawSlider (wdim x, wdim y, wdim w, double proportion) {
        glColor3f (0f, 0f, .5f);
        glRecti (x,y+16, x+cast(wdim) (proportion*w),y);
    }
    
    override TextAdapter getAdapter (int col) {
        TextAdapter a;
        a.font = defaultFont;
	a.colour_ = Colour (col);
	a.index_ = size_t.max;
	return a;
    }
    
protected:
    FontStyle defaultFont;
}