Buttons.Mod 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. MODULE Buttons;
  2. IMPORT Gui, G := Graph, Out;
  3. TYPE
  4. Button* = POINTER TO ButtonDesc;
  5. ButtonDesc* = RECORD(Gui.WidgetDesc)
  6. END;
  7. PROCEDURE DrawNormalButton*(W: Gui.Widget; x, y: INTEGER);
  8. VAR c: G.Color;
  9. active: BOOLEAN;
  10. w, h: INTEGER;
  11. BEGIN
  12. active := {Gui.focus, Gui.active} * W.state # {};
  13. w := W.w; h := W.h;
  14. IF Gui.hover IN W.state THEN
  15. G.MakeCol(c, 220, 215, 210);
  16. ELSE G.MakeCol(c, 212, 208, 200)
  17. END;
  18. G.FillRect(x + 1, y + 1, x + W.w - 3, y + W.h - 3, c);
  19. IF active THEN
  20. G.MakeCol(c, 0, 0, 0);
  21. G.Rect(x, y, x + w - 1, y + h - 1, c);
  22. INC(x); INC(y); DEC(w, 2); DEC(h, 2)
  23. END;
  24. G.MakeCol(c, 255, 255, 255);
  25. G.Rect(x, y, x + w - 1, y + h - 1, c);
  26. G.MakeCol(c, 64, 64, 64);
  27. G.HLine(x, y + h - 1, x + w - 1, c);
  28. G.VLine(x + w - 1, y, y + h - 1, c);
  29. G.MakeCol(c, 128, 128, 128);
  30. G.HLine(x + 1, y + h - 2, x + w - 2, c);
  31. G.VLine(x + w - 2, y + 1, y + h - 2, c)
  32. END DrawNormalButton;
  33. PROCEDURE DrawDownButton*(W: Gui.Widget; x, y: INTEGER);
  34. VAR c: G.Color;
  35. BEGIN
  36. G.MakeCol(c, 220, 215, 210);
  37. G.FillRect(x + 2, y + 2, x + W.w - 3, y + W.h - 3, c);
  38. G.MakeCol(c, 0, 0, 0);
  39. G.Rect(x, y, x + W.w - 1, y + W.h - 1, c);
  40. G.MakeCol(c, 128, 128, 128);
  41. G.Rect(x + 1, y + 1, x + W.w - 2, y + W.h - 2, c)
  42. END DrawDownButton;
  43. PROCEDURE DrawButton*(W: Gui.Widget; x, y: INTEGER);
  44. VAR c: G.Color;
  45. f: G.Font;
  46. fw, fh: INTEGER;
  47. BEGIN
  48. IF Gui.down IN W.state THEN DrawDownButton(W, x, y)
  49. ELSE DrawNormalButton(W, x, y)
  50. END;
  51. f := Gui.GetFont(W);
  52. G.GetMonoFontSize(f, fw, fh);
  53. G.MakeCol(c, 0, 0, 0);
  54. INC(x, 4); INC(y, (W.h - fh) DIV 2);
  55. IF Gui.down IN W.state THEN INC(x); INC(y) END;
  56. G.DrawString(W.text.s(*!FIXME*), x, y, f, c)
  57. END DrawButton;
  58. PROCEDURE InitButton*(b: Button; w, h: INTEGER; text: ARRAY OF CHAR);
  59. BEGIN
  60. Gui.InitWidget(b);
  61. b.w := w; b.h := h;
  62. Gui.SetText(b, text);
  63. b.draw := DrawButton
  64. END InitButton;
  65. PROCEDURE NewButton*(w, h: INTEGER; text: ARRAY OF CHAR): Button;
  66. VAR b: Button;
  67. BEGIN NEW(b); InitButton(b, w, h, text)
  68. RETURN b END NewButton;
  69. END Buttons.