Browse Source

SimpleGui: ScrollBox works

Arthur Yefimov 1 year ago
parent
commit
baf034624c
2 changed files with 29 additions and 14 deletions
  1. 4 3
      Programs/Examples/MapEditor.Mod
  2. 25 11
      Programs/Examples/SimpleGui.Mod

+ 4 - 3
Programs/Examples/MapEditor.Mod

@@ -89,12 +89,12 @@ BEGIN
   S.SetOnMouseMove(btnExit, BtnExitOnMouseMove);
   edtText := S.NewEdit(pnlSide, 4, 60, 96, 20);
   scbHoriz := S.NewScrollBar(pnlSide, 4, 84, 96, 16);
-  S.SetOnScroll(scbHoriz, OnScroll);
+  S.ScrollBarSetOnScroll(scbHoriz, OnScroll);
   scbHoriz2 := S.NewScrollBar(pnlSide, 24, 104, 76, 50);
-  S.SetOnScroll(scbHoriz2, ScbHoriz2OnScroll);
+  S.ScrollBarSetOnScroll(scbHoriz2, ScbHoriz2OnScroll);
   scbVert := S.NewScrollBar(pnlSide, 4, 104, 16, 140);
   S.ScrollBarSetVertical(scbVert, TRUE);
-  S.SetOnScroll(scbVert, OnScroll);
+  S.ScrollBarSetOnScroll(scbVert, OnScroll);
 
   pnlMap := S.NewPanel(frmMain, 112, 4, W - 116, H - 8);
   G.MakeCol(color, 150, 90, 40);
@@ -107,6 +107,7 @@ BEGIN
   S.SetOnMouseMove(btnMove, BtnMoveOnMouseMove);
 
   sbxMap := S.NewScrollBox(pnlMap, 4, 104, 300, 200);
+  S.ScrollBoxSetInnerSize(sbxMap, 4096, 4096);
   G.MakeCol(color, 0, 90, 255);
   S.SetBgColor(sbxMap, color);
   btnFile := S.NewButton(sbxMap, 20, 40, 80, 24, 'Файл');

+ 25 - 11
Programs/Examples/SimpleGui.Mod

@@ -316,18 +316,24 @@ PROCEDURE DrawBody*(c: Widget; x, y, w, h: INTEGER);
 VAR p: Widget;
   x2, y2, w2, h2: INTEGER;
   cx, cy, cw, ch: INTEGER;
+  CX, CY, CW, CH: INTEGER;
 BEGIN
   p := c.body;
   IF p # NIL THEN
+    G.GetClip(CX, CY, CW, CH);
+    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;
     REPEAT
       x2 := x + p.x; y2 := y + p.y;
       w2 := w - p.x; h2 := h - p.y;
 
       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;
+      IF cx + cw > CX + CW THEN cw := CX + CW - cx END;
+      IF cy + ch > CY + CH THEN ch := CY + CH - cy END;
+      IF cx < CX THEN DEC(cw, CX - cx); cx := CX END;
+      IF cy < CY THEN DEC(ch, CY - cy); cy := CY END;
       G.SetClip(cx, cy, cw, ch);
 
       DrawWidget(p, x2, y2, p.w, p.h);
@@ -839,9 +845,9 @@ VAR c: ScrollBar;
 BEGIN NEW(c); InitScrollBar(c, where, x, y, w, h)
 RETURN c END NewScrollBar;
 
-PROCEDURE SetOnScroll*(c: ScrollBar; proc: PROCEDURE (c: ScrollBar; value: INTEGER));
+PROCEDURE ScrollBarSetOnScroll*(c: ScrollBar; proc: PROCEDURE (c: ScrollBar; value: INTEGER));
 BEGIN c.onScroll := proc
-END SetOnScroll;
+END ScrollBarSetOnScroll;
 
 (** ScrollBox **)
 
@@ -850,7 +856,6 @@ VAR x, y: INTEGER;
 BEGIN
   IF msg IS DrawMsg THEN
     x := msg(DrawMsg).x; y := msg(DrawMsg).y;
-    G.FillRect(x, y, x + c.w - 1, y + c.h - 1, c.bgColor);
     DrawBody(c, x, y, c.w, c.h)
   ELSIF msg IS PutMsg THEN
     DirectPut(msg(PutMsg).what, c(ScrollBox).inner,
@@ -867,23 +872,32 @@ BEGIN
 END ScrollBoxSetInnerSize;
 
 PROCEDURE ScrollBoxOnHorizScroll*(c: ScrollBar; value: INTEGER);
+VAR sbx: ScrollBox;
 BEGIN
-  
+  sbx := c.parent(ScrollBox);
+  sbx.inner.x := -value
 END ScrollBoxOnHorizScroll;
 
+PROCEDURE ScrollBoxOnVertScroll*(c: ScrollBar; value: INTEGER);
+VAR sbx: ScrollBox;
+BEGIN
+  sbx := c.parent(ScrollBox);
+  sbx.inner.y := -value
+END ScrollBoxOnVertScroll;
+
 PROCEDURE InitScrollBox*(c: ScrollBox; where: Widget; x, y, w, h: INTEGER);
 BEGIN InitWidget(c, w, h);
   c.handle := ScrollBoxHandler;
 
   c.scbHoriz := NewScrollBar(NIL, 0, 0, w - 16, 16);
   DirectPut(c.scbHoriz, c, 0, h - 16);
-  SetOnScroll(c.scbHoriz, ScrollBoxOnHorizScroll);
+  ScrollBarSetOnScroll(c.scbHoriz, ScrollBoxOnHorizScroll);
 
   c.scbVert := NewScrollBar(NIL, 0, 0, 16, h - 16);
+  ScrollBarSetVertical(c.scbVert, TRUE);
   DirectPut(c.scbVert, c, w - 16, 0);
-  (*SetOnScroll(c.scbHoriz, ScrollBoxOnVertScroll);*)
+  ScrollBarSetOnScroll(c.scbVert, ScrollBoxOnVertScroll);
 
-  ScrollBarSetVertical(c.scbVert, TRUE);
   c.outer := NewPanel(NIL, 0, 0, w - 16, h - 16);
   DirectPut(c.outer, c, 0, 0);
   PanelSetNoBg(c.outer, TRUE);