Mercurial > projects > mde
view mde/gui/renderer/SimpleRenderer.d @ 80:ea58f277f487
Gui reorganization and changes; partial implementation of floating widgets.
Moved contents of mde/gui/WidgetData.d elsewhere; new gui/WidgetDataSet.d and gui/types.d modules.
Changes to widget/createWidget.d
Partially implemented FloatingAreaWidget to provide an area for floating "window" widgets.
New DebugWidget and some uses of it (e.g. bad widget data).
Decoupled OptionChanges from Options.
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Thu, 07 Aug 2008 11:25:27 +0100 |
parents | d43523ed4b62 |
children | 4d5d53e4f881 |
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 = b = 6; } else t = b = 0; } border += resize; return border; } RESIZE_TYPE getResizeType (wdim cx, wdim cy, wdim w, wdim 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; } wdim layoutSpacing () { return 4; } //FIXME - make these do something void restrict (wdim x, wdim y, wdim w, wdim h) {} void relax () {} void drawWindow (wdim x, wdim y, wdim w, wdim 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 (wdim x, wdim y, wdim w, wdim h) {} void drawBlank (wdim x, wdim y, wdim w, wdim h) { gl.setColor (.4f, .4f, .4f); gl.drawBox (x,y, w,h); } void drawButton (wdim x, wdim y, wdim w, wdim 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; }