demo.mod 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. MODULE demo;
  2. (* Demo of the terminal TVision-style toolkit (view tree, widgets, mouse).
  3. Build (from this directory):
  4. gm2 -fiso -I. tv.o demo.mod -o demo
  5. Run from a normal terminal. Tab cycles widgets, arrow keys navigate,
  6. Enter/Space activate, the mouse drags windows and clicks controls,
  7. Esc exits. *)
  8. FROM InOut IMPORT WriteString, WriteLn;
  9. FROM SYSTEM IMPORT ADR, CAST;
  10. IMPORT tv;
  11. VAR
  12. desk, w1, w2, status : tv.ViewPtr;
  13. input, check, r1, r2, listv, okb, closeb : tv.ViewPtr;
  14. t : tv.ViewPtr;
  15. listData : tv.ListData;
  16. e : tv.Event;
  17. quit : BOOLEAN;
  18. cmd : INTEGER;
  19. sender : tv.ViewPtr;
  20. BEGIN
  21. IF NOT tv.Init() THEN
  22. WriteString("cannot initialise the terminal (not a tty?)"); WriteLn;
  23. HALT
  24. END;
  25. desk := tv.Desk();
  26. (* status bar (bottom line) *)
  27. status := tv.NewView(tv.VText, 0, tv.Rows() - 1, tv.Cols(), 1);
  28. tv.SetText(status, " Tab: next arrows: move Enter: press mouse: click/drag Esc: quit");
  29. tv.AddView(desk, status);
  30. (* ---- Editor window ---- *)
  31. w1 := tv.NewView(tv.VWindow, 3, 2, 56, 16);
  32. tv.SetText(w1, "Editor");
  33. t := tv.NewView(tv.VText, 5, 4, 24, 1);
  34. tv.SetText(t, "Name:"); tv.AddView(w1, t);
  35. input := tv.NewView(tv.VInput, 12, 4, 32, 1);
  36. tv.SetText(input, "Modula-2"); tv.AddView(w1, input);
  37. check := tv.NewView(tv.VCheck, 12, 6, 24, 1);
  38. tv.SetText(check, "Enabled"); check^.flags := tv.vfSelected; tv.AddView(w1, check);
  39. t := tv.NewView(tv.VText, 5, 8, 6, 1);
  40. tv.SetText(t, "Mode:"); tv.AddView(w1, t);
  41. r1 := tv.NewView(tv.VRadio, 12, 8, 12, 1);
  42. tv.SetText(r1, "Fast"); r1^.flags := tv.vfSelected; tv.AddView(w1, r1);
  43. r2 := tv.NewView(tv.VRadio, 26, 8, 12, 1);
  44. tv.SetText(r2, "Safe"); tv.AddView(w1, r2);
  45. listData.items[0] := "Alpha"; listData.items[1] := "Bravo";
  46. listData.items[2] := "Charlie"; listData.items[3] := "Delta";
  47. listData.items[4] := "Echo"; listData.items[5] := "Foxtrot";
  48. listData.count := 6;
  49. listv := tv.NewView(tv.VList, 5, 10, 22, 6);
  50. listv^.list := CAST(tv.ListDataPtr, ADR(listData));
  51. tv.AddView(w1, listv);
  52. okb := tv.NewView(tv.VButton, 30, 15, 8, 1);
  53. tv.SetText(okb, "OK"); tv.SetTag(okb, tv.cmOK); tv.AddView(w1, okb);
  54. closeb := tv.NewView(tv.VButton, 41, 15, 10, 1);
  55. tv.SetText(closeb, "Close"); tv.SetTag(closeb, tv.cmCancel); tv.AddView(w1, closeb);
  56. tv.AddView(desk, w1);
  57. (* ---- About window ---- *)
  58. w2 := tv.NewView(tv.VWindow, 38, 7, 38, 8);
  59. tv.SetText(w2, "About");
  60. t := tv.NewView(tv.VText, 40, 9, 34, 1);
  61. tv.SetText(t, "tvision-m2"); tv.AddView(w2, t);
  62. t := tv.NewView(tv.VText, 40, 10, 34, 1);
  63. tv.SetText(t, "A TVision-style toolkit in GNU M2."); tv.AddView(w2, t);
  64. t := tv.NewView(tv.VText, 40, 11, 34, 1);
  65. tv.SetText(t, "Drag window titles with the mouse."); tv.AddView(w2, t);
  66. tv.AddView(desk, w2);
  67. tv.BringToFront(w1);
  68. tv.FocusView(input);
  69. tv.Finish;
  70. quit := FALSE;
  71. WHILE NOT quit DO
  72. IF tv.Resized() THEN tv.Finish END;
  73. IF tv.ReadEvent(e) THEN
  74. IF (e.kind = tv.evKey) AND (e.key = tv.kEsc) THEN
  75. quit := TRUE
  76. ELSE
  77. cmd := tv.HandleEvent(e);
  78. sender := tv.Sender();
  79. IF cmd = tv.cmClose THEN
  80. IF sender # NIL THEN tv.DelView(sender) END
  81. ELSIF cmd = tv.cmOK THEN
  82. tv.Message("Info", "You pressed OK.")
  83. ELSIF cmd = tv.cmCancel THEN
  84. tv.DelView(w1)
  85. ELSIF (sender = r1) OR (sender = r2) THEN
  86. r1^.flags := 0; r2^.flags := 0;
  87. IF sender # NIL THEN sender^.flags := tv.vfSelected END
  88. END
  89. END;
  90. IF NOT quit THEN tv.Finish END
  91. END
  92. END;
  93. tv.Done
  94. END demo.