Prechádzať zdrojové kódy

SimpleGui: Label widget; MapEditor split to itself and TestSimpleGui

Arthur Yefimov 1 rok pred
rodič
commit
1c187fa355

+ 39 - 113
Programs/Examples/MapEditor.Mod

@@ -4,99 +4,39 @@ IMPORT G := Graph, S := SimpleGui, Out, Int, Strings;
 CONST window = FALSE;
 VAR
   frmMain: S.Form;
-  pnlSide: S.Panel;
+
+  pnlTop: S.Panel;
+  lblMapName: S.Label;
+  edtMapName: S.Edit;
+  btnOpen: S.Button;
   btnSave: S.Button;
   btnExit: S.Button;
-  pnlMap: S.Panel;
-  btn2: S.Button;
-  btnMove: S.Button;
-  edtText: S.Edit;
-  scbHoriz, scbHoriz2: S.ScrollBar;
-  scbVert: S.ScrollBar;
-  sbxMap: S.ScrollBox;
-  btnFile: S.Button;
-  btnEdit: S.Button;
-  edtMsg: S.Edit;
-  custom: S.Widget;
-  cnvSign: S.Canvas;
 
-  XX, YY: INTEGER;
-  moving: BOOLEAN;
+  pnlSide: S.Panel;
+
+  sbxMap: S.ScrollBox;
+  map: S.Widget;
 
 PROCEDURE BtnExitOnClick(c: S.Widget);
 BEGIN
   S.Quit
 END BtnExitOnClick;
 
-PROCEDURE Btn2OnClick(c: S.Widget);
-BEGIN
-  c(S.Button).caption[1] := CHR((ORD(c(S.Button).caption[1]) + 1) MOD 1256)
-END Btn2OnClick;
-
-PROCEDURE BtnExitOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
-BEGIN
-  c(S.Button).caption[5] := CHR((ORD(c(S.Button).caption[5]) + 1) MOD 256);
-  c(S.Button).caption[6] := CHR(ORD(c(S.Button).caption[5]) + 1);
-  c(S.Button).caption[7] := 0X
-END BtnExitOnMouseMove;
-
-PROCEDURE BtnMoveOnMouseDown(c: S.Widget; x, y, btn: INTEGER);
-BEGIN
-  IF btn = 1 THEN moving := TRUE; XX := x; YY := y END
-END BtnMoveOnMouseDown;
-
-PROCEDURE BtnMoveOnMouseUp(c: S.Widget; x, y, btn: INTEGER);
-BEGIN moving := FALSE
-END BtnMoveOnMouseUp;
-
-PROCEDURE BtnMoveOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
-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 OnScroll(c: S.ScrollBar; value: INTEGER);
-VAR s: ARRAY 32 OF CHAR;
-BEGIN
-  S.ScrollBarSetValue(scbHoriz2, value);
-
-  Int.Str(scbHoriz.value, s);
-  Strings.Append(':', s);
-  Int.Append(scbVert.value, s);
-  S.EditSetText(edtText, s)
-END OnScroll;
-
-PROCEDURE ScbHoriz2OnScroll(c: S.ScrollBar; value: INTEGER);
-BEGIN
-  S.ScrollBarSetValue(scbVert, value)
-END ScbHoriz2OnScroll;
-
-PROCEDURE CustomOnPaint(c: S.Widget; x, y, w, h: INTEGER);
+PROCEDURE MapOnPaint(c: S.Widget; x, y, w, h: INTEGER);
 VAR color: G.Color;
 BEGIN
   G.MakeCol(color, 255, 255, 0);
   G.Line(x, y, x + w - 1, y + h - 1, color);
   G.Line(x + w - 1, y, x, y + h - 1, color);
-END CustomOnPaint;
+END MapOnPaint;
 
-PROCEDURE CustomOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
-VAR color: G.Color;
-BEGIN
-  G.MakeCol(color, 0, x * 7 MOD 256, y * 7 MOD 256);
-  btnFile.bgColor := color
-END CustomOnMouseMove;
-
-PROCEDURE CnvSignOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
+PROCEDURE SbxMapOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
 VAR color: G.Color;
   draw: BOOLEAN;
 BEGIN
   draw := TRUE;
   IF btns = {1} THEN
-    color := btnFile.bgColor
+    G.MakeCol(color, 0, 0, 0)
   ELSIF btns = {2} THEN
     G.MakeCol(color, 0, 255, 255)
   ELSE
@@ -106,7 +46,7 @@ BEGIN
     G.Target(c(S.Canvas).bmp);
     G.PutPixel(x, y, color)
   END
-END CnvSignOnMouseMove;
+END SbxMapOnMouseMove;
 
 PROCEDURE InitInterface(): BOOLEAN;
 VAR W, H: INTEGER;
@@ -115,49 +55,35 @@ BEGIN
   G.GetScreenSize(W, H);
   frmMain := S.NewForm(0, 0, W, H);
 
-  pnlSide := S.NewPanel(frmMain, 4, 4, 104, H - 8);
-  G.MakeCol(color, 40, 150, 40);
-  S.SetBgColor(pnlSide, color);
-  btnSave := S.NewButton(pnlSide, 4, 4, 96, 24, 'Сохранить');
-  btnExit := S.NewButton(pnlSide, 4, 32, 96, 24, 'Выйти');
+  pnlTop := S.NewPanel(frmMain, 0, 0, W, 40);
+
+  lblMapName := S.NewLabel(pnlTop, 8, 9, 120, 22, 'Имя файла:');
+  S.LabelSetAlign(lblMapName, S.alRight);
+
+  edtMapName := S.NewEdit(pnlTop, lblMapName.x + lblMapName.w + 8,
+      9, 120, 22);
+
+  btnOpen := S.NewButton(pnlTop, edtMapName.x + edtMapName.w + 8,
+      8, 96, 24, 'Открыть');
+
+  btnSave := S.NewButton(pnlTop, btnOpen.x + btnOpen.w + 8,
+      8, 96, 24, 'Сохранить');
+
+  btnExit := S.NewButton(pnlTop, W - 68, 8, 60, 24, 'Выход');
   S.SetOnClick(btnExit, BtnExitOnClick);
-  S.SetOnMouseMove(btnExit, BtnExitOnMouseMove);
-  edtText := S.NewEdit(pnlSide, 4, 60, 96, 20);
-  scbHoriz := S.NewScrollBar(pnlSide, 4, 84, 96, 16);
-  S.ScrollBarSetOnScroll(scbHoriz, OnScroll);
-  scbHoriz2 := S.NewScrollBar(pnlSide, 24, 104, 76, 50);
-  S.ScrollBarSetOnScroll(scbHoriz2, ScbHoriz2OnScroll);
-  scbVert := S.NewScrollBar(pnlSide, 4, 104, 16, 140);
-  S.ScrollBarSetVertical(scbVert, TRUE);
-  S.ScrollBarSetOnScroll(scbVert, OnScroll);
-
-  pnlMap := S.NewPanel(frmMain, 112, 4, W - 116, H - 8);
-  G.MakeCol(color, 150, 90, 40);
-  S.SetBgColor(pnlMap, color);
-  btn2 := S.NewButton(pnlMap, 64, 4, 96, 96, 'ОГО!');
-  S.SetOnClick(btn2, Btn2OnClick);
-  btnMove := S.NewButton(pnlMap, 168, 4, 96, 96, 'ДВИГАЙ');
-  S.SetOnMouseDown(btnMove, BtnMoveOnMouseDown);
-  S.SetOnMouseUp(btnMove, BtnMoveOnMouseUp);
-  S.SetOnMouseMove(btnMove, BtnMoveOnMouseMove);
-
-  sbxMap := S.NewScrollBox(pnlMap, 4, 104, 300, 200);
-  S.ScrollBoxSetNoBg(sbxMap, ~TRUE);
-  S.ScrollBoxSetInnerSize(sbxMap, 700, 800);
-  G.MakeCol(color, 0, 90, 255);
-  S.SetBgColor(sbxMap, color);
-  btnFile := S.NewButton(sbxMap, 20, 40, 80, 24, 'Файл');
-  btnEdit := S.NewButton(sbxMap, 260, 40, 80, 24, 'Правка');
-  edtMsg := S.NewEdit(sbxMap, 60, 170, 120, 35);
 
-  custom := S.NewWidget(sbxMap, 50, 70, 100, 70);
-  S.SetOnPaint(custom, CustomOnPaint);
-  S.SetOnMouseMove(custom, CustomOnMouseMove);
+  pnlSide := S.NewPanel(frmMain, 0, pnlTop.h, 180, H - pnlTop.h);
+  G.MakeCol(color, 40, 150, 40);
+  S.SetBgColor(pnlSide, color);
 
-  cnvSign := S.NewCanvas(sbxMap, 210, 80, 150, 250);
-  S.SetOnMouseMove(cnvSign, CnvSignOnMouseMove);
+  sbxMap := S.NewScrollBox(frmMain, pnlSide.w, pnlTop.h,
+      W - pnlSide.w, H - pnlTop.h);
+  S.ScrollBoxSetInnerSize(sbxMap, 1024, 1024);
+  G.MakeCol(color, 0, 0, 0);
+  S.SetBgColor(sbxMap, color);
+  (*S.ScrollBoxSetNoBg(sbxMap, TRUE);*)
+  (*S.SetOnMouseMove(sbxMap, SbxMapOnMouseMove);*)
 
-  moving := FALSE
 RETURN TRUE END InitInterface;
 
 PROCEDURE Init(): BOOLEAN;

+ 65 - 1
Programs/Examples/SimpleGui.Mod

@@ -1,6 +1,12 @@
 MODULE SimpleGui;
 IMPORT G := Graph, Strings, Out;
 
+CONST
+  (** Align **)
+  alLeft*   = 0;
+  alCenter* = 1;
+  alRight*  = 2;
+
 TYPE
   Widget* = POINTER TO WidgetDesc;
 
@@ -66,6 +72,12 @@ TYPE
     caption*: ARRAY 64 OF CHAR
   END;
 
+  Label* = POINTER TO LabelDesc;
+  LabelDesc* = RECORD(WidgetDesc)
+    caption*: ARRAY 256 OF CHAR;
+    align*: INTEGER; (** One of {alLeft, alCenter, alRight} *)
+  END;
+
   Edit* = POINTER TO EditDesc;
   EditDesc* = RECORD(WidgetDesc)
     text*: ARRAY 256 OF CHAR;
@@ -568,6 +580,58 @@ VAR c: Button;
 BEGIN NEW(c); InitButton(c, where, x, y, w, h, caption)
 RETURN c END NewButton;
 
+(** Label **)
+
+PROCEDURE DrawLabel*(c: Label; x, y, w, h: INTEGER);
+VAR fw, fh, tw, tx, ty: INTEGER;
+BEGIN
+  G.GetMonoFontSize(font, fw, fh);
+  tx := 0;
+  IF c.align # alLeft THEN
+    tw := Strings.Length(c.caption) * fw;
+    IF c.align = alCenter THEN
+      tx := (c.w - tw) DIV 2
+    ELSIF c.align = alRight THEN
+      tx := c.w - tw
+    END
+  END;
+  ty := y + (c.h - fh) DIV 2;
+  G.DrawString(c.caption, tx, ty, font, c.fgColor)
+END DrawLabel;
+
+PROCEDURE LabelHandler*(c: Widget; VAR msg: Message);
+VAR e: Label;
+BEGIN e := c(Label);
+  IF msg IS DrawMsg THEN
+    DrawLabel(e, msg(DrawMsg).x, msg(DrawMsg).y,
+        msg(DrawMsg).w, msg(DrawMsg).h)
+  ELSE WidgetHandler(c, msg)
+  END
+END LabelHandler;
+
+PROCEDURE InitLabel*(c: Label; where: Widget; x, y, w, h: INTEGER;
+    caption: ARRAY OF CHAR);
+BEGIN InitWidget(c, w, h);
+  Strings.Copy(caption, c.caption);
+  c.handle := LabelHandler;
+  c.align := alLeft;
+  Put(c, where, x, y)
+END InitLabel;
+
+PROCEDURE NewLabel*(where: Widget; x, y, w, h: INTEGER;
+    caption: ARRAY OF CHAR): Label;
+VAR c: Label;
+BEGIN NEW(c); InitLabel(c, where, x, y, w, h, caption)
+RETURN c END NewLabel;
+
+PROCEDURE LabelSetCaption*(c: Label; caption: ARRAY OF CHAR);
+BEGIN Strings.Copy(caption, c.caption)
+END LabelSetCaption;
+
+PROCEDURE LabelSetAlign*(c: Label; align: INTEGER);
+BEGIN c.align := align
+END LabelSetAlign;
+
 (** Edit **)
 
 PROCEDURE DrawEdit*(c: Edit; x, y, w, h: INTEGER);
@@ -668,7 +732,7 @@ PROCEDURE InitEdit*(c: Edit; where: Widget; x, y, w, h: INTEGER);
 BEGIN InitWidget(c, w, h);
   c.focusable := TRUE;
   G.MakeCol(c.bgColor, 255, 255, 255);
-  c.text := 'Привет'; c.len := 6; c.pos := 2; c.off := 0;
+  c.text[0] := 0X; c.len := 0; c.pos := 0; c.off := 0;
   c.handle := EditHandler;
   Put(c, where, x, y)
 END InitEdit;

+ 184 - 0
Programs/Examples/TestSimpleGui.Mod

@@ -0,0 +1,184 @@
+MODULE TestSimpleGui;
+IMPORT G := Graph, S := SimpleGui, Out, Int, Strings;
+
+CONST window = FALSE;
+VAR
+  frmMain: S.Form;
+  pnlSide: S.Panel;
+  btnSave: S.Button;
+  btnExit: S.Button;
+  pnlMap: S.Panel;
+  btn2: S.Button;
+  btnMove: S.Button;
+  edtText: S.Edit;
+  scbHoriz, scbHoriz2: S.ScrollBar;
+  scbVert: S.ScrollBar;
+  sbxMap: S.ScrollBox;
+  btnFile: S.Button;
+  btnEdit: S.Button;
+  edtMsg: S.Edit;
+  custom: S.Widget;
+  cnvSign: S.Canvas;
+
+  XX, YY: INTEGER;
+  moving: BOOLEAN;
+
+PROCEDURE BtnExitOnClick(c: S.Widget);
+BEGIN
+  S.Quit
+END BtnExitOnClick;
+
+PROCEDURE Btn2OnClick(c: S.Widget);
+BEGIN
+  c(S.Button).caption[1] := CHR((ORD(c(S.Button).caption[1]) + 1) MOD 1256)
+END Btn2OnClick;
+
+PROCEDURE BtnExitOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
+BEGIN
+  c(S.Button).caption[5] := CHR((ORD(c(S.Button).caption[5]) + 1) MOD 256);
+  c(S.Button).caption[6] := CHR(ORD(c(S.Button).caption[5]) + 1);
+  c(S.Button).caption[7] := 0X
+END BtnExitOnMouseMove;
+
+PROCEDURE BtnMoveOnMouseDown(c: S.Widget; x, y, btn: INTEGER);
+BEGIN
+  IF btn = 1 THEN moving := TRUE; XX := x; YY := y END
+END BtnMoveOnMouseDown;
+
+PROCEDURE BtnMoveOnMouseUp(c: S.Widget; x, y, btn: INTEGER);
+BEGIN moving := FALSE
+END BtnMoveOnMouseUp;
+
+PROCEDURE BtnMoveOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
+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 OnScroll(c: S.ScrollBar; value: INTEGER);
+VAR s: ARRAY 32 OF CHAR;
+BEGIN
+  S.ScrollBarSetValue(scbHoriz2, value);
+
+  Int.Str(scbHoriz.value, s);
+  Strings.Append(':', s);
+  Int.Append(scbVert.value, s);
+  S.EditSetText(edtText, s)
+END OnScroll;
+
+PROCEDURE ScbHoriz2OnScroll(c: S.ScrollBar; value: INTEGER);
+BEGIN
+  S.ScrollBarSetValue(scbVert, value)
+END ScbHoriz2OnScroll;
+
+PROCEDURE CustomOnPaint(c: S.Widget; x, y, w, h: INTEGER);
+VAR color: G.Color;
+BEGIN
+  G.MakeCol(color, 255, 255, 0);
+  G.Line(x, y, x + w - 1, y + h - 1, color);
+  G.Line(x + w - 1, y, x, y + h - 1, color);
+END CustomOnPaint;
+
+PROCEDURE CustomOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
+VAR color: G.Color;
+BEGIN
+  G.MakeCol(color, 0, x * 7 MOD 256, y * 7 MOD 256);
+  btnFile.bgColor := color
+END CustomOnMouseMove;
+
+PROCEDURE CnvSignOnMouseMove(c: S.Widget; x, y: INTEGER; btns: SET);
+VAR color: G.Color;
+  draw: BOOLEAN;
+BEGIN
+  draw := TRUE;
+  IF btns = {1} THEN
+    color := btnFile.bgColor
+  ELSIF btns = {2} THEN
+    G.MakeCol(color, 0, 255, 255)
+  ELSE
+    draw := FALSE
+  END;
+  IF draw THEN
+    G.Target(c(S.Canvas).bmp);
+    G.PutPixel(x, y, color)
+  END
+END CnvSignOnMouseMove;
+
+PROCEDURE InitInterface(): BOOLEAN;
+VAR W, H: INTEGER;
+  color: G.Color;
+BEGIN
+  G.GetScreenSize(W, H);
+  frmMain := S.NewForm(0, 0, W, H);
+
+  pnlSide := S.NewPanel(frmMain, 4, 4, 104, H - 8);
+  G.MakeCol(color, 40, 150, 40);
+  S.SetBgColor(pnlSide, color);
+  btnSave := S.NewButton(pnlSide, 4, 4, 96, 24, 'Сохранить');
+  btnExit := S.NewButton(pnlSide, 4, 32, 96, 24, 'Выйти');
+  S.SetOnClick(btnExit, BtnExitOnClick);
+  S.SetOnMouseMove(btnExit, BtnExitOnMouseMove);
+  edtText := S.NewEdit(pnlSide, 4, 60, 96, 20);
+  scbHoriz := S.NewScrollBar(pnlSide, 4, 84, 96, 16);
+  S.ScrollBarSetOnScroll(scbHoriz, OnScroll);
+  scbHoriz2 := S.NewScrollBar(pnlSide, 24, 104, 76, 50);
+  S.ScrollBarSetOnScroll(scbHoriz2, ScbHoriz2OnScroll);
+  scbVert := S.NewScrollBar(pnlSide, 4, 104, 16, 140);
+  S.ScrollBarSetVertical(scbVert, TRUE);
+  S.ScrollBarSetOnScroll(scbVert, OnScroll);
+
+  pnlMap := S.NewPanel(frmMain, 112, 4, W - 116, H - 8);
+  G.MakeCol(color, 150, 90, 40);
+  S.SetBgColor(pnlMap, color);
+  btn2 := S.NewButton(pnlMap, 64, 4, 96, 96, 'ОГО!');
+  S.SetOnClick(btn2, Btn2OnClick);
+  btnMove := S.NewButton(pnlMap, 168, 4, 96, 96, 'ДВИГАЙ');
+  S.SetOnMouseDown(btnMove, BtnMoveOnMouseDown);
+  S.SetOnMouseUp(btnMove, BtnMoveOnMouseUp);
+  S.SetOnMouseMove(btnMove, BtnMoveOnMouseMove);
+
+  sbxMap := S.NewScrollBox(pnlMap, 4, 104, 300, 200);
+  S.ScrollBoxSetNoBg(sbxMap, ~TRUE);
+  S.ScrollBoxSetInnerSize(sbxMap, 700, 800);
+  G.MakeCol(color, 0, 90, 255);
+  S.SetBgColor(sbxMap, color);
+  btnFile := S.NewButton(sbxMap, 20, 40, 80, 24, 'Файл');
+  btnEdit := S.NewButton(sbxMap, 260, 40, 80, 24, 'Правка');
+  edtMsg := S.NewEdit(sbxMap, 60, 170, 120, 35);
+
+  custom := S.NewWidget(sbxMap, 50, 70, 100, 70);
+  S.SetOnPaint(custom, CustomOnPaint);
+  S.SetOnMouseMove(custom, CustomOnMouseMove);
+
+  cnvSign := S.NewCanvas(sbxMap, 210, 80, 150, 250);
+  S.SetOnMouseMove(cnvSign, CnvSignOnMouseMove);
+
+  moving := FALSE
+RETURN TRUE END InitInterface;
+
+PROCEDURE Init(): BOOLEAN;
+VAR ok: BOOLEAN;
+BEGIN ok := TRUE;
+  IF window THEN G.Settings(640, 480, {G.window}) END;
+  G.Init;
+  IF ~G.Done THEN ok := FALSE END;
+  IF ok THEN
+    S.Init;
+    IF ~S.Done THEN ok := FALSE END
+  END;
+  IF ok & ~InitInterface() THEN ok := FALSE END
+RETURN ok END Init;
+
+PROCEDURE Close;
+BEGIN
+  G.Close
+END Close;
+
+BEGIN
+  IF Init() THEN S.Run ELSE Out.String('Error loading.'); Out.Ln END;
+  Close
+END TestSimpleGui.