diff 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 diff
--- a/mde/gui/renderer/SimpleRenderer.d	Thu May 08 16:05:51 2008 +0100
+++ b/mde/gui/renderer/SimpleRenderer.d	Tue May 13 12:02:36 2008 +0100
@@ -29,17 +29,50 @@
 * The renderer is intended to be per-GUI. */
 class SimpleRenderer : IRenderer
 {
-    BorderDimensions getBorder (BORDER_TYPES type) {
-        BorderDimensions dims;
-        with (BORDER_TYPES) with (dims) {
-            if (type == WINDOW_TOTAL) {
-                l = t = r = b = 20;
-            } else if (type == WINDOW_RESIZE) {
-                r = t = 5;
-                l = b = 20;
+    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 dims;
+        return resizeType;
     }
     
     int layoutSpacing () {
@@ -52,10 +85,10 @@
         gl.drawBox (x,y, w,h);
         
         gl.setColor (0f, 0f, 1f);
-        gl.drawBox (x+20,y+5, w-25,h-25);
+        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+20, y+20, w-40, h-40);
+        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) {}
@@ -67,4 +100,9 @@
             gl.setColor (.6f, 0f, .6f);
         gl.drawBox (x,y, w,h);
     }
+    
+protected:
+    bool wSizable, hSizable;
+    BorderDimensions border;
+    BorderDimensions resize;
 }