Browse Source

Example of SimpleGui: Move button

Arthur Yefimov 1 year ago
parent
commit
40fa5bfb5c
2 changed files with 57 additions and 8 deletions
  1. 28 1
      Programs/Examples/MapEditor.Mod
  2. 29 7
      Programs/Examples/SimpleGui.Mod

+ 28 - 1
Programs/Examples/MapEditor.Mod

@@ -8,6 +8,10 @@ VAR
   btnExit: S.Button;
   pnlMap: S.Panel;
   btn2: S.Button;
+  btnMove: S.Button;
+
+  XX, YY: INTEGER;
+  moving: BOOLEAN;
 
 PROCEDURE Btn2OnClick(c: S.Widget);
 BEGIN
@@ -21,6 +25,24 @@ BEGIN
   c(S.Button).caption[7] := 0X
 END BtnExitOnMouseMove;
 
+PROCEDURE BtnMoveOnMouseDown(c: S.Widget; x, y: INTEGER);
+BEGIN moving := TRUE; XX := x; YY := y
+END BtnMoveOnMouseDown;
+
+PROCEDURE BtnMoveOnMouseUp(c: S.Widget; x, y: INTEGER);
+BEGIN moving := FALSE
+END BtnMoveOnMouseUp;
+
+PROCEDURE BtnMoveOnMouseMove(c: S.Widget; x, y: INTEGER);
+BEGIN
+  IF moving THEN
+    c.x := c.x + x - XX;
+    c.y := c.y + y - YY;
+    XX := x; YY := y;
+    IF c.x < 0 THEN c.x := 0 END
+  END;
+END BtnMoveOnMouseMove;
+
 PROCEDURE InitInterface(): BOOLEAN;
 VAR W, H: INTEGER;
   color: G.Color;
@@ -39,8 +61,13 @@ BEGIN
   G.MakeCol(color, 150, 90, 40);
   S.SetBgColor(pnlMap, color);
   btn2 := S.NewButton(pnlMap, 64, 64, 96, 96, 'ОГО!');
-  S.SetOnClick(btn2, Btn2OnClick)
+  S.SetOnClick(btn2, Btn2OnClick);
+  btnMove := S.NewButton(pnlMap, 168, 64, 96, 96, 'ДВИГАЙ');
+  S.SetOnMouseDown(btnMove, BtnMoveOnMouseDown);
+  S.SetOnMouseUp(btnMove, BtnMoveOnMouseUp);
+  S.SetOnMouseMove(btnMove, BtnMoveOnMouseMove);
 
+  moving := FALSE
 RETURN TRUE END InitInterface;
 
 PROCEDURE Init(): BOOLEAN;

+ 29 - 7
Programs/Examples/SimpleGui.Mod

@@ -123,7 +123,8 @@ VAR msg: MouseDownMsg;
 BEGIN
   pressedWidget := c;
   msg.x := x; msg.y := y;
-  c.handle(c, msg)
+  c.handle(c, msg);
+  IF c.onMouseDown # NIL THEN c.onMouseDown(c, x, y) END
 END WidgetOnMouseDown;
 
 PROCEDURE WidgetHandleMouseDown*(c: Widget; x, y: INTEGER);
@@ -142,7 +143,8 @@ VAR msg: MouseUpMsg;
 BEGIN
   pressedWidget := NIL;
   msg.x := x; msg.y := y;
-  c.handle(c, msg)
+  c.handle(c, msg);
+  IF c.onMouseUp # NIL THEN c.onMouseUp(c, x, y) END
 END WidgetOnMouseUp;
 
 PROCEDURE WidgetOnClick*(c: Widget);
@@ -172,15 +174,20 @@ END DrawWidget;
 PROCEDURE DrawBody*(c: Widget; x, y, w, h: INTEGER);
 VAR p: Widget;
   x2, y2, w2, h2: INTEGER;
-  Z: G.Color;
+  cx, cy, cw, ch: INTEGER;
 BEGIN
   p := c.body;
   WHILE p # NIL DO
     x2 := x + p.x; y2 := y + p.y;
     w2 := w - p.x; h2 := h - p.y;
     (* !FIXME clip x2,y2,w2,h2 to not more than x,y,w,h*)
-    (*G.UnsetClip; G.MakeCol(Z, 255, 0, 0); G.Rect(x2-1, y2-1, x2 + w2, y2 + h2,Z);*)
-    G.SetClip(x2, y2, p.w, p.h);
+    cx := x2; cy := y2; cw := p.w; ch := p.h;
+    IF cx + cw > x + w THEN cw := x + w - cx END;
+    IF cy + ch > y + h THEN ch := y + h - cy END;
+    IF cx < x THEN DEC(cw, x - cx); cx := x END;
+    IF cy < y THEN DEC(ch, y - cy); cy := y END;
+    G.SetClip(cx, cy, cw, ch);
+
     DrawWidget(p, x2, y2, p.w, p.h);
     p := p.next
   END;
@@ -199,6 +206,14 @@ PROCEDURE SetOnMouseMove*(c: Widget; proc: PROCEDURE (c: Widget; x, y: INTEGER))
 BEGIN c.onMouseMove := proc
 END SetOnMouseMove;
 
+PROCEDURE SetOnMouseDown*(c: Widget; proc: PROCEDURE (c: Widget; x, y: INTEGER));
+BEGIN c.onMouseDown := proc
+END SetOnMouseDown;
+
+PROCEDURE SetOnMouseUp*(c: Widget; proc: PROCEDURE (c: Widget; x, y: INTEGER));
+BEGIN c.onMouseUp := proc
+END SetOnMouseUp;
+
 PROCEDURE SetOnClick*(c: Widget; proc: PROCEDURE (c: Widget));
 BEGIN c.onClick := proc
 END SetOnClick;
@@ -212,12 +227,19 @@ BEGIN c.x := 0; c.y := 0; c.w := w; c.h := h;
 END InitWidget;
 
 PROCEDURE Put*(c, where: Widget; x, y: INTEGER);
+VAR p: Widget;
 BEGIN
   IF c # NIL THEN
     c.x := x; c.y := y;
     IF where # NIL THEN
-      c.next := where.body;
-      where.body := c
+      c.next := NIL;
+      p := where.body;
+      IF p = NIL THEN
+        where.body := c
+      ELSE
+        WHILE p.next # NIL DO p := p.next END;
+        p.next := c
+      END
     END
   END
 END Put;