Selaa lähdekoodia

SimpleGui: Forced redraw

Arthur Yefimov 1 vuosi sitten
vanhempi
commit
1e4bd7b993
1 muutettua tiedostoa jossa 24 lisäystä ja 10 poistoa
  1. 24 10
      Programs/Examples/Game/SimpleGui.Mod

+ 24 - 10
Programs/Examples/Game/SimpleGui.Mod

@@ -358,7 +358,7 @@ BEGIN
   c.handle(c, M)
   c.handle(c, M)
 END DrawWidget;
 END DrawWidget;
 
 
-PROCEDURE DrawBody*(c: Widget; x, y, w, h: INTEGER);
+PROCEDURE DrawBody*(c: Widget; x, y, w, h: INTEGER; forced: BOOLEAN);
 VAR p: Widget;
 VAR p: Widget;
   x2, y2, w2, h2: INTEGER;
   x2, y2, w2, h2: INTEGER;
   cx, cy, cw, ch: INTEGER;
   cx, cy, cw, ch: INTEGER;
@@ -372,6 +372,7 @@ BEGIN
     IF CX < x THEN DEC(CW, x - CX); CX := x END;
     IF CX < x THEN DEC(CW, x - CX); CX := x END;
     IF CY < y THEN DEC(CH, y - CY); CY := y END;
     IF CY < y THEN DEC(CH, y - CY); CY := y END;
     REPEAT
     REPEAT
+      IF forced THEN p.redraw := TRUE; p.redrawSelf := TRUE END;
       IF p.redraw THEN
       IF p.redraw THEN
         x2 := x + p.x; y2 := y + p.y;
         x2 := x + p.x; y2 := y + p.y;
         w2 := w - p.x; h2 := h - p.y;
         w2 := w - p.x; h2 := h - p.y;
@@ -451,7 +452,7 @@ BEGIN
       IF c.redrawSelf & ~c(Panel).noBg THEN
       IF c.redrawSelf & ~c(Panel).noBg THEN
         G.FillRect(x, y, x + c.w - 1, y + c.h - 1, c.bgColor)
         G.FillRect(x, y, x + c.w - 1, y + c.h - 1, c.bgColor)
       END;
       END;
-      DrawBody(c, x, y, c.w, c.h);
+      DrawBody(c, x, y, c.w, c.h, c.redrawSelf);
       Drawn(c)
       Drawn(c)
     END
     END
   ELSE WidgetHandler(c, msg)
   ELSE WidgetHandler(c, msg)
@@ -492,7 +493,7 @@ BEGIN
     IF c.redrawSelf THEN
     IF c.redrawSelf THEN
       G.FillRect(c.x, c.y, c.x + c.w - 1, c.y + c.h - 1, c.bgColor)
       G.FillRect(c.x, c.y, c.x + c.w - 1, c.y + c.h - 1, c.bgColor)
     END;
     END;
-    DrawBody(c, c.x, c.y, c.w, c.h);
+    DrawBody(c, c.x, c.y, c.w, c.h, c.redrawSelf);
     Drawn(c)
     Drawn(c)
   END
   END
 END DrawForm;
 END DrawForm;
@@ -937,9 +938,11 @@ BEGIN
   IF x < c.btnSize THEN
   IF x < c.btnSize THEN
     c.btnPressed := 1(*Less btn*);
     c.btnPressed := 1(*Less btn*);
     ScrollBarSetValue(c, c.value - d);
     ScrollBarSetValue(c, c.value - d);
+    Redraw(c)
   ELSIF x >= size - c.btnSize THEN
   ELSIF x >= size - c.btnSize THEN
     c.btnPressed := 2(*More btn*);
     c.btnPressed := 2(*More btn*);
-    ScrollBarSetValue(c, c.value + d)
+    ScrollBarSetValue(c, c.value + d);
+    Redraw(c)
   ELSIF msg.btn = 1 THEN
   ELSIF msg.btn = 1 THEN
     IF (c.handlePos <= x) & (x < c.handlePos + c.handleSize) THEN
     IF (c.handlePos <= x) & (x < c.handlePos + c.handleSize) THEN
       c.btnPressed := 3(*Handle*);
       c.btnPressed := 3(*Handle*);
@@ -949,12 +952,20 @@ BEGIN
       ScrollBarSetValue(c, c.value - c.bigInc)
       ScrollBarSetValue(c, c.value - c.bigInc)
     ELSE
     ELSE
       ScrollBarSetValue(c, c.value + c.bigInc)
       ScrollBarSetValue(c, c.value + c.bigInc)
-    END
+    END;
+    Redraw(c)
   ELSE c.btnPressed := 0(*Nothing*);
   ELSE c.btnPressed := 0(*Nothing*);
   END;
   END;
   WidgetHandler(c, msg)
   WidgetHandler(c, msg)
 END HandleScrollBarMouseDown;
 END HandleScrollBarMouseDown;
 
 
+PROCEDURE HandleScrollBarMouseUp(c: ScrollBar; VAR msg: MouseUpMsg);
+BEGIN
+  c.handlePressed := FALSE;
+  c.btnPressed := 0(*Nothing*);
+  Redraw(c)
+END HandleScrollBarMouseUp;
+
 PROCEDURE ScrollBarHandler*(c: Widget; VAR msg: Message);
 PROCEDURE ScrollBarHandler*(c: Widget; VAR msg: Message);
 VAR s: ScrollBar;
 VAR s: ScrollBar;
 BEGIN s := c(ScrollBar);
 BEGIN s := c(ScrollBar);
@@ -963,7 +974,7 @@ BEGIN s := c(ScrollBar);
         msg(DrawMsg).w, msg(DrawMsg).h)
         msg(DrawMsg).w, msg(DrawMsg).h)
   ELSIF msg IS MouseMoveMsg THEN HandleScrollBarMouseMove(s, msg(MouseMoveMsg))
   ELSIF msg IS MouseMoveMsg THEN HandleScrollBarMouseMove(s, msg(MouseMoveMsg))
   ELSIF msg IS MouseDownMsg THEN HandleScrollBarMouseDown(s, msg(MouseDownMsg))
   ELSIF msg IS MouseDownMsg THEN HandleScrollBarMouseDown(s, msg(MouseDownMsg))
-  ELSIF msg IS MouseUpMsg THEN s.handlePressed := FALSE; s.btnPressed := 0(*Nothing*)
+  ELSIF msg IS MouseUpMsg THEN HandleScrollBarMouseUp(s, msg(MouseUpMsg))
   ELSE WidgetHandler(c, msg)
   ELSE WidgetHandler(c, msg)
   END
   END
 END ScrollBarHandler;
 END ScrollBarHandler;
@@ -996,7 +1007,10 @@ END ScrollBoxSetNoBg;
 PROCEDURE ScrollBoxHandler*(c: Widget; VAR msg: Message);
 PROCEDURE ScrollBoxHandler*(c: Widget; VAR msg: Message);
 BEGIN
 BEGIN
   IF msg IS DrawMsg THEN
   IF msg IS DrawMsg THEN
-    DrawBody(c, msg(DrawMsg).x, msg(DrawMsg).y, c.w, c.h)
+    IF c.redraw THEN
+      DrawBody(c, msg(DrawMsg).x, msg(DrawMsg).y, c.w, c.h, c.redrawSelf);
+      Drawn(c)
+    END
   ELSIF msg IS PutMsg THEN
   ELSIF msg IS PutMsg THEN
     DirectPut(msg(PutMsg).what, c(ScrollBox).inner,
     DirectPut(msg(PutMsg).what, c(ScrollBox).inner,
         msg(PutMsg).x, msg(PutMsg).y)
         msg(PutMsg).x, msg(PutMsg).y)
@@ -1017,7 +1031,7 @@ VAR sbx: ScrollBox;
 BEGIN
 BEGIN
   sbx := c.parent(ScrollBox);
   sbx := c.parent(ScrollBox);
   sbx.inner.x := -value;
   sbx.inner.x := -value;
-  Redraw(c)
+  Redraw(sbx)
 END ScrollBoxOnHorizScroll;
 END ScrollBoxOnHorizScroll;
 
 
 PROCEDURE ScrollBoxOnVertScroll*(c: ScrollBar; value: INTEGER);
 PROCEDURE ScrollBoxOnVertScroll*(c: ScrollBar; value: INTEGER);
@@ -1025,7 +1039,7 @@ VAR sbx: ScrollBox;
 BEGIN
 BEGIN
   sbx := c.parent(ScrollBox);
   sbx := c.parent(ScrollBox);
   sbx.inner.y := -value;
   sbx.inner.y := -value;
-  Redraw(c)
+  Redraw(sbx)
 END ScrollBoxOnVertScroll;
 END ScrollBoxOnVertScroll;
 
 
 PROCEDURE InitScrollBox*(c: ScrollBox; where: Widget; x, y, w, h: INTEGER);
 PROCEDURE InitScrollBox*(c: ScrollBox; where: Widget; x, y, w, h: INTEGER);
@@ -1065,7 +1079,7 @@ BEGIN
     IF c.redraw THEN
     IF c.redraw THEN
       x := msg(DrawMsg).x; y := msg(DrawMsg).y;
       x := msg(DrawMsg).x; y := msg(DrawMsg).y;
       IF c.redrawSelf THEN G.Draw(c(Canvas).bmp, x, y) END;
       IF c.redrawSelf THEN G.Draw(c(Canvas).bmp, x, y) END;
-      DrawBody(c, x, y, c.w, c.h);
+      DrawBody(c, x, y, c.w, c.h, c.redrawSelf);
       Drawn(c)
       Drawn(c)
     END
     END
   ELSE WidgetHandler(c, msg)
   ELSE WidgetHandler(c, msg)