Mercurial > projects > mde
view mde/gui/renderer/SimpleRenderer.d @ 41:b3a6ca4516b4
The renderer now controls which parts of the window border allow resizing.
committer: Diggory Hardy <diggory.hardy@gmail.com>
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Tue, 13 May 2008 12:02:36 +0100 |
parents | 5132301e9ed7 |
children | 1530d9c04d4d |
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 gl = mde.gl.basic; /** 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 { BorderDimensions setSizable (bool wS, bool hS) { wSizable = wS; hSizable = hS; // Set the border size based on the above with (border) { l = r = t = b = 14; } with (resize) { if (wSizable) l = r = 6; else l = r = 0; if (hSizable) { t = 2; b = 6; } else t = b = 0; } border += resize; return border; } RESIZE_TYPE getResizeType (int cx, int cy, int w, int h) { RESIZE_TYPE resizeType = RESIZE_TYPE.NONE; if (cx < resize.l || cx >= w - resize.r || cy < resize.t || cy >= h - resize.b) { // window is being resized /* check for resizes (different to above; use whole border giving larger area for * diagonal resizes). */ if (wSizable) { if (cx < border.l) resizeType = RESIZE_TYPE.L; else if (cx >= w - border.r) resizeType = RESIZE_TYPE.R; } if (hSizable) { if (cy < border.t) resizeType |= RESIZE_TYPE.T; else if (cy >= h - border.b) resizeType |= RESIZE_TYPE.B; } } return resizeType; } int layoutSpacing () { return 4; } void drawWindow (int x, int y, int w, int h) { gl.setColor (0f, 0f, .7f); gl.drawBox (x,y, w,h); gl.setColor (0f, 0f, 1f); gl.drawBox (x+resize.l, y+resize.t, w-resize.l-resize.r, h-resize.t-resize.b); gl.setColor (.3f, .3f, .3f); gl.drawBox (x+border.l, y+border.t, w-border.l-border.r, h-border.t-border.b); } void drawWidgetBack (int x, int y, int w, int h) {} void drawButton (int x, int y, int w, int h, bool pushed) { if (pushed) gl.setColor (1f, 0f, 1f); else gl.setColor (.6f, 0f, .6f); gl.drawBox (x,y, w,h); } protected: bool wSizable, hSizable; BorderDimensions border; BorderDimensions resize; }