DemosBasic.mod 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. IMPLEMENTATION MODULE DemosBasic ;
  2. (*
  3. See the GTK C originals: spinner.c, panes.c, overlay.c.
  4. *)
  5. FROM SYSTEM IMPORT ADDRESS, ADR;
  6. FROM GtkWindow IMPORT gtk_window_new, gtk_window_set_title,
  7. gtk_window_set_default_size, gtk_window_set_resizable,
  8. gtk_window_set_child, gtk_window_destroy;
  9. FROM GtkWidget IMPORT gtk_widget_set_visible, gtk_widget_get_visible,
  10. gtk_widget_set_margin_start, gtk_widget_set_margin_end,
  11. gtk_widget_set_margin_top, gtk_widget_set_margin_bottom,
  12. gtk_widget_set_sensitive, gtk_widget_set_hexpand, gtk_widget_set_vexpand,
  13. gtk_widget_set_halign, gtk_widget_set_valign, gtk_widget_set_can_target;
  14. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal, GtkAlignCenter,
  15. GtkAlignStart;
  16. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  17. FROM GtkSpinner IMPORT gtk_spinner_new, gtk_spinner_start, gtk_spinner_stop;
  18. FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text;
  19. FROM GtkButton IMPORT gtk_button_new_with_label, gtk_button_get_label;
  20. FROM GtkEditable IMPORT gtk_editable_set_text;
  21. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_use_markup;
  22. FROM GtkPaned IMPORT gtk_paned_new, gtk_paned_set_start_child,
  23. gtk_paned_set_end_child, gtk_paned_set_shrink_start_child,
  24. gtk_paned_set_shrink_end_child;
  25. FROM GtkFrame IMPORT gtk_frame_new, gtk_frame_set_child;
  26. FROM GtkOverlay IMPORT gtk_overlay_new, gtk_overlay_add_overlay,
  27. gtk_overlay_set_child;
  28. FROM GtkGrid IMPORT gtk_grid_new, gtk_grid_attach;
  29. FROM GtkUtils IMPORT Connect, IntToStr, CStrToM2;
  30. FROM GtkClosures IMPORT Connect2;
  31. FROM libc IMPORT printf;
  32. (* ------------------------------------------------------------------ *)
  33. (* Spinner *)
  34. (* ------------------------------------------------------------------ *)
  35. VAR
  36. spinnerWindow, spinnerSensitive, spinnerUnsafe: ADDRESS;
  37. PROCEDURE OnPlay (button: ADDRESS; data: ADDRESS);
  38. BEGIN
  39. gtk_spinner_start(spinnerSensitive);
  40. gtk_spinner_start(spinnerUnsafe)
  41. END OnPlay;
  42. PROCEDURE OnStop (button: ADDRESS; data: ADDRESS);
  43. BEGIN
  44. gtk_spinner_stop(spinnerSensitive);
  45. gtk_spinner_stop(spinnerUnsafe)
  46. END OnStop;
  47. PROCEDURE DoSpinner (doWidget: ADDRESS) : ADDRESS;
  48. VAR
  49. vbox, hbox, button, spinner: ADDRESS;
  50. BEGIN
  51. IF spinnerWindow = NIL THEN
  52. spinnerWindow := gtk_window_new();
  53. gtk_window_set_title(spinnerWindow, "Spinner");
  54. gtk_window_set_resizable(spinnerWindow, 0);
  55. vbox := gtk_box_new(GtkVertical, 10);
  56. gtk_widget_set_margin_top(vbox, 5);
  57. gtk_widget_set_margin_bottom(vbox, 5);
  58. gtk_widget_set_margin_start(vbox, 5);
  59. gtk_widget_set_margin_end(vbox, 5);
  60. gtk_window_set_child(spinnerWindow, vbox);
  61. (* sensitive *)
  62. hbox := gtk_box_new(GtkHorizontal, 5);
  63. spinner := gtk_spinner_new();
  64. gtk_box_append(hbox, spinner);
  65. gtk_box_append(hbox, gtk_entry_new());
  66. gtk_box_append(vbox, hbox);
  67. spinnerSensitive := spinner;
  68. (* disabled *)
  69. hbox := gtk_box_new(GtkHorizontal, 5);
  70. spinner := gtk_spinner_new();
  71. gtk_box_append(hbox, spinner);
  72. gtk_box_append(hbox, gtk_entry_new());
  73. gtk_box_append(vbox, hbox);
  74. spinnerUnsafe := spinner;
  75. gtk_widget_set_sensitive(hbox, 0);
  76. button := gtk_button_new_with_label("Play");
  77. Connect2(button, "clicked", OnPlay, NIL);
  78. gtk_box_append(vbox, button);
  79. button := gtk_button_new_with_label("Stop");
  80. Connect2(button, "clicked", OnStop, NIL);
  81. gtk_box_append(vbox, button);
  82. OnPlay(NIL, NIL)
  83. END;
  84. IF gtk_widget_get_visible(spinnerWindow) = 0 THEN
  85. gtk_widget_set_visible(spinnerWindow, 1)
  86. ELSE
  87. gtk_window_destroy(spinnerWindow);
  88. spinnerWindow := NIL
  89. END;
  90. RETURN spinnerWindow
  91. END DoSpinner;
  92. (* ------------------------------------------------------------------ *)
  93. (* Paned widgets *)
  94. (* ------------------------------------------------------------------ *)
  95. VAR
  96. panesWindow: ADDRESS;
  97. PROCEDURE PaneLabel (text: ARRAY OF CHAR) : ADDRESS;
  98. VAR
  99. label: ADDRESS;
  100. BEGIN
  101. label := gtk_label_new(text);
  102. gtk_widget_set_margin_start(label, 4);
  103. gtk_widget_set_margin_end(label, 4);
  104. gtk_widget_set_margin_top(label, 4);
  105. gtk_widget_set_margin_bottom(label, 4);
  106. gtk_widget_set_hexpand(label, 1);
  107. gtk_widget_set_vexpand(label, 1);
  108. RETURN label
  109. END PaneLabel;
  110. PROCEDURE DoPanes (doWidget: ADDRESS) : ADDRESS;
  111. VAR
  112. frame, hpaned, vpaned, vbox: ADDRESS;
  113. BEGIN
  114. IF panesWindow = NIL THEN
  115. panesWindow := gtk_window_new();
  116. gtk_window_set_title(panesWindow, "Paned Widgets");
  117. gtk_window_set_default_size(panesWindow, 330, 250);
  118. gtk_window_set_resizable(panesWindow, 0);
  119. vbox := gtk_box_new(GtkVertical, 8);
  120. gtk_widget_set_margin_start(vbox, 8);
  121. gtk_widget_set_margin_end(vbox, 8);
  122. gtk_widget_set_margin_top(vbox, 8);
  123. gtk_widget_set_margin_bottom(vbox, 8);
  124. gtk_window_set_child(panesWindow, vbox);
  125. frame := gtk_frame_new("");
  126. gtk_box_append(vbox, frame);
  127. vpaned := gtk_paned_new(GtkVertical);
  128. gtk_frame_set_child(frame, vpaned);
  129. hpaned := gtk_paned_new(GtkHorizontal);
  130. gtk_paned_set_start_child(vpaned, hpaned);
  131. gtk_paned_set_shrink_start_child(vpaned, 0);
  132. gtk_paned_set_start_child(hpaned, PaneLabel("Hi there"));
  133. gtk_paned_set_shrink_start_child(hpaned, 0);
  134. gtk_paned_set_end_child(hpaned, PaneLabel("Hello"));
  135. gtk_paned_set_shrink_end_child(hpaned, 0);
  136. gtk_paned_set_end_child(vpaned, PaneLabel("Goodbye"));
  137. gtk_paned_set_shrink_end_child(vpaned, 0)
  138. END;
  139. IF gtk_widget_get_visible(panesWindow) = 0 THEN
  140. gtk_widget_set_visible(panesWindow, 1)
  141. ELSE
  142. gtk_window_destroy(panesWindow);
  143. panesWindow := NIL
  144. END;
  145. RETURN panesWindow
  146. END DoPanes;
  147. (* ------------------------------------------------------------------ *)
  148. (* Interactive Overlay *)
  149. (* ------------------------------------------------------------------ *)
  150. VAR
  151. overlayWindow: ADDRESS;
  152. (* void do_number(GtkButton *button, GtkEntry *entry) *)
  153. PROCEDURE OnNumber (button: ADDRESS; entry: ADDRESS);
  154. VAR
  155. buf: ARRAY [0..63] OF CHAR;
  156. BEGIN
  157. CStrToM2(gtk_button_get_label(button), buf);
  158. gtk_editable_set_text(entry, buf)
  159. END OnNumber;
  160. PROCEDURE GridButton (entry: ADDRESS; n: INTEGER) : ADDRESS;
  161. VAR
  162. button: ADDRESS;
  163. text: ARRAY [0..15] OF CHAR;
  164. BEGIN
  165. IntToStr(n, text);
  166. button := gtk_button_new_with_label(text);
  167. gtk_widget_set_hexpand(button, 1);
  168. gtk_widget_set_vexpand(button, 1);
  169. Connect2(button, "clicked", OnNumber, entry);
  170. RETURN button
  171. END GridButton;
  172. PROCEDURE DoOverlay (doWidget: ADDRESS) : ADDRESS;
  173. VAR
  174. overlay, grid, button, vbox, label, entry: ADDRESS;
  175. i, j: INTEGER;
  176. BEGIN
  177. IF overlayWindow = NIL THEN
  178. overlayWindow := gtk_window_new();
  179. gtk_window_set_default_size(overlayWindow, 500, 510);
  180. gtk_window_set_title(overlayWindow, "Interactive Overlay");
  181. overlay := gtk_overlay_new();
  182. grid := gtk_grid_new();
  183. gtk_overlay_set_child(overlay, grid);
  184. entry := gtk_entry_new();
  185. FOR j := 0 TO 4 DO
  186. FOR i := 0 TO 4 DO
  187. button := GridButton(entry, 5 * j + i);
  188. gtk_grid_attach(grid, button, i, j, 1, 1)
  189. END
  190. END;
  191. vbox := gtk_box_new(GtkVertical, 10);
  192. gtk_widget_set_can_target(vbox, 0);
  193. gtk_overlay_add_overlay(overlay, vbox);
  194. gtk_widget_set_halign(vbox, GtkAlignCenter);
  195. gtk_widget_set_valign(vbox, GtkAlignStart);
  196. label := gtk_label_new
  197. ("<span foreground='blue' weight='ultrabold' font='40'>Numbers</span>");
  198. gtk_label_set_use_markup(label, 1);
  199. gtk_widget_set_can_target(label, 0);
  200. gtk_widget_set_margin_top(label, 8);
  201. gtk_widget_set_margin_bottom(label, 8);
  202. gtk_box_append(vbox, label);
  203. vbox := gtk_box_new(GtkVertical, 10);
  204. gtk_overlay_add_overlay(overlay, vbox);
  205. gtk_widget_set_halign(vbox, GtkAlignCenter);
  206. gtk_widget_set_valign(vbox, GtkAlignCenter);
  207. gtk_entry_set_placeholder_text(entry, "Your Lucky Number");
  208. gtk_widget_set_margin_top(entry, 8);
  209. gtk_widget_set_margin_bottom(entry, 8);
  210. gtk_box_append(vbox, entry);
  211. gtk_window_set_child(overlayWindow, overlay)
  212. END;
  213. IF gtk_widget_get_visible(overlayWindow) = 0 THEN
  214. gtk_widget_set_visible(overlayWindow, 1)
  215. ELSE
  216. gtk_window_destroy(overlayWindow);
  217. overlayWindow := NIL
  218. END;
  219. RETURN overlayWindow
  220. END DoOverlay;
  221. END DemosBasic.