test_adw_widgets.mod 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. MODULE test_adw_widgets ;
  2. (*
  3. m2-GTK4 test - the newly bound libadwaita (GNOME) widgets: view
  4. stack/switchers, navigation view, adaptive containers, rows, avatar
  5. and friends. Requires a display.
  6. *)
  7. FROM GtkApplication IMPORT gtk_application_new;
  8. FROM Gio IMPORT g_application_run, g_application_quit;
  9. FROM GtkWindow IMPORT gtk_window_set_title, gtk_window_set_default_size,
  10. gtk_window_present;
  11. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  12. FROM GtkEnums IMPORT GtkVertical;
  13. FROM GtkLabel IMPORT gtk_label_new;
  14. FROM GtkUtils IMPORT Connect;
  15. FROM AdwWindow IMPORT adw_window_new, adw_window_set_content;
  16. FROM AdwViewStack IMPORT adw_view_stack_new, adw_view_stack_add_titled,
  17. adw_view_stack_add_titled_with_icon, adw_view_stack_set_visible_child_name,
  18. adw_view_stack_get_visible_child_name;
  19. FROM AdwViewSwitcher IMPORT adw_view_switcher_new,
  20. adw_view_switcher_set_stack, adw_view_switcher_get_policy;
  21. FROM AdwViewSwitcherBar IMPORT adw_view_switcher_bar_new,
  22. adw_view_switcher_bar_set_stack, adw_view_switcher_bar_set_reveal;
  23. FROM AdwViewSwitcherTitle IMPORT adw_view_switcher_title_new,
  24. adw_view_switcher_title_set_title, adw_view_switcher_title_set_subtitle,
  25. adw_view_switcher_title_set_stack;
  26. FROM AdwInlineViewSwitcher IMPORT adw_inline_view_switcher_new,
  27. adw_inline_view_switcher_set_stack,
  28. adw_inline_view_switcher_set_display_mode;
  29. FROM AdwEnums IMPORT AdwInlineViewSwitcherLabels;
  30. FROM AdwNavigationView IMPORT adw_navigation_view_new,
  31. adw_navigation_view_push, adw_navigation_view_get_visible_page,
  32. adw_navigation_view_pop;
  33. FROM AdwNavigationPage IMPORT adw_navigation_page_new;
  34. FROM AdwWindowTitle IMPORT adw_window_title_new;
  35. FROM AdwBin IMPORT adw_bin_new, adw_bin_set_child;
  36. FROM AdwSpinner IMPORT adw_spinner_new;
  37. FROM AdwSpinnerPaintable IMPORT adw_spinner_paintable_new;
  38. FROM AdwAvatar IMPORT adw_avatar_new;
  39. FROM AdwButtonContent IMPORT adw_button_content_new,
  40. adw_button_content_set_label, adw_button_content_set_icon_name;
  41. FROM AdwSplitButton IMPORT adw_split_button_new, adw_split_button_set_label;
  42. FROM AdwButtonRow IMPORT adw_button_row_new,
  43. adw_button_row_set_start_icon_name, adw_button_row_set_end_icon_name;
  44. FROM AdwSpinRow IMPORT adw_spin_row_new_with_range;
  45. FROM AdwPasswordEntryRow IMPORT adw_password_entry_row_new;
  46. FROM AdwClampScrollable IMPORT adw_clamp_scrollable_new,
  47. adw_clamp_scrollable_set_maximum_size;
  48. FROM AdwClampLayout IMPORT adw_clamp_layout_new;
  49. FROM AdwSqueezer IMPORT adw_squeezer_new, adw_squeezer_add;
  50. FROM AdwWrapBox IMPORT adw_wrap_box_new, adw_wrap_box_append;
  51. FROM AdwWrapLayout IMPORT adw_wrap_layout_new;
  52. FROM SYSTEM IMPORT ADDRESS, ADR;
  53. FROM libc IMPORT printf;
  54. CONST
  55. AppId = "org.example.m2gtk4.TestAdwWidgets";
  56. VAR
  57. app: ADDRESS;
  58. passed: BOOLEAN;
  59. failures: INTEGER;
  60. PROCEDURE Check (cond: BOOLEAN; what: ARRAY OF CHAR);
  61. BEGIN
  62. IF cond THEN
  63. printf(" ok - %s\n", what)
  64. ELSE
  65. printf(" NOT OK - %s\n", what);
  66. INC(failures)
  67. END
  68. END Check;
  69. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  70. VAR
  71. window, box, stack, p1, p2, switcher, bar, title, inl, nav, np1, np2: ADDRESS;
  72. clamp, cliplayout, wrap, wraplayout, squeeze, avatar: ADDRESS;
  73. content, split, brow, spin, pw, bin, spinner, sp, wt: ADDRESS;
  74. visible: ADDRESS;
  75. BEGIN
  76. failures := 0;
  77. (* AdwViewStack + pages + switchers *)
  78. stack := adw_view_stack_new();
  79. p1 := adw_view_stack_add_titled (stack, gtk_label_new("One"),
  80. "one", "Page One");
  81. p2 := adw_view_stack_add_titled_with_icon (stack, gtk_label_new("Two"),
  82. "two", "Page Two",
  83. "go-home-symbolic");
  84. Check((stack # NIL) AND (p1 # NIL) AND (p2 # NIL), "AdwViewStack pages");
  85. adw_view_stack_set_visible_child_name (stack, "two");
  86. visible := adw_view_stack_get_visible_child_name (stack);
  87. Check(visible # NIL, "AdwViewStack visible page name");
  88. switcher := adw_view_switcher_new();
  89. adw_view_switcher_set_stack (switcher, stack);
  90. Check(adw_view_switcher_get_policy (switcher) = 0, "AdwViewSwitcher policy");
  91. bar := adw_view_switcher_bar_new();
  92. adw_view_switcher_bar_set_stack (bar, stack);
  93. adw_view_switcher_bar_set_reveal (bar, 1);
  94. Check(bar # NIL, "AdwViewSwitcherBar");
  95. title := adw_view_switcher_title_new();
  96. adw_view_switcher_title_set_title (title, "Demo");
  97. adw_view_switcher_title_set_subtitle (title, "GNOME widgets");
  98. adw_view_switcher_title_set_stack (title, stack);
  99. Check(title # NIL, "AdwViewSwitcherTitle");
  100. inl := adw_inline_view_switcher_new();
  101. adw_inline_view_switcher_set_stack (inl, stack);
  102. adw_inline_view_switcher_set_display_mode (inl, AdwInlineViewSwitcherLabels);
  103. Check(inl # NIL, "AdwInlineViewSwitcher");
  104. (* AdwNavigationView *)
  105. nav := adw_navigation_view_new();
  106. np1 := adw_navigation_page_new (gtk_label_new("Root"), "Root");
  107. adw_navigation_view_push (nav, np1);
  108. np2 := adw_navigation_page_new (gtk_label_new("Child"), "Child");
  109. adw_navigation_view_push (nav, np2);
  110. Check(adw_navigation_view_get_visible_page (nav) = np2,
  111. "AdwNavigationView push");
  112. Check(adw_navigation_view_pop (nav) # 0, "AdwNavigationView pop");
  113. Check(adw_navigation_view_get_visible_page (nav) = np1,
  114. "AdwNavigationView visible after pop");
  115. (* adaptive containers *)
  116. clamp := adw_clamp_scrollable_new();
  117. adw_clamp_scrollable_set_maximum_size (clamp, 400);
  118. Check(clamp # NIL, "AdwClampScrollable");
  119. cliplayout := adw_clamp_layout_new();
  120. Check(cliplayout # NIL, "AdwClampLayout");
  121. wrap := adw_wrap_box_new();
  122. adw_wrap_box_append (wrap, gtk_label_new("a"));
  123. adw_wrap_box_append (wrap, gtk_label_new("b"));
  124. Check(wrap # NIL, "AdwWrapBox");
  125. wraplayout := adw_wrap_layout_new();
  126. Check(wraplayout # NIL, "AdwWrapLayout");
  127. squeeze := adw_squeezer_new();
  128. visible := adw_squeezer_add (squeeze, gtk_label_new("wide"));
  129. visible := adw_squeezer_add (squeeze, gtk_label_new("narrow"));
  130. Check(squeeze # NIL, "AdwSqueezer");
  131. (* rows and misc *)
  132. avatar := adw_avatar_new (32, "Eric", 1);
  133. Check(avatar # NIL, "AdwAvatar");
  134. content := adw_button_content_new();
  135. adw_button_content_set_icon_name (content, "go-home-symbolic");
  136. adw_button_content_set_label (content, "Home");
  137. Check(content # NIL, "AdwButtonContent");
  138. split := adw_split_button_new();
  139. adw_split_button_set_label (split, "Split");
  140. Check(split # NIL, "AdwSplitButton");
  141. brow := adw_button_row_new();
  142. adw_button_row_set_start_icon_name (brow, "go-home-symbolic");
  143. adw_button_row_set_end_icon_name (brow, "go-next-symbolic");
  144. Check(brow # NIL, "AdwButtonRow");
  145. spin := adw_spin_row_new_with_range (0.0, 10.0, 1.0);
  146. Check(spin # NIL, "AdwSpinRow");
  147. pw := adw_password_entry_row_new();
  148. Check(pw # NIL, "AdwPasswordEntryRow");
  149. bin := adw_bin_new();
  150. adw_bin_set_child (bin, gtk_label_new("bin"));
  151. Check(bin # NIL, "AdwBin");
  152. spinner := adw_spinner_new();
  153. sp := adw_spinner_paintable_new (spinner);
  154. Check((spinner # NIL) AND (sp # NIL), "AdwSpinner / AdwSpinnerPaintable");
  155. wt := adw_window_title_new ("Title", "Subtitle");
  156. Check(wt # NIL, "AdwWindowTitle");
  157. (* put a few of them in the window *)
  158. box := gtk_box_new (GtkVertical, 12);
  159. gtk_box_append (box, gtk_label_new("libadwaita widgets"));
  160. gtk_box_append (box, avatar);
  161. gtk_box_append (box, split);
  162. gtk_box_append (box, spinner);
  163. window := adw_window_new();
  164. gtk_window_set_title (window, "Adw widgets");
  165. gtk_window_set_default_size (window, 360, 300);
  166. adw_window_set_content (window, box);
  167. gtk_window_present (window);
  168. passed := (failures = 0);
  169. g_application_quit (application)
  170. END OnActivate;
  171. VAR
  172. rc: INTEGER;
  173. BEGIN
  174. passed := FALSE;
  175. failures := 0;
  176. app := gtk_application_new(AppId, 0);
  177. IF app = NIL THEN
  178. printf("test_adw_widgets: FAIL (no app)\n");
  179. HALT(1)
  180. END;
  181. Connect(app, "activate", ADR(OnActivate), NIL);
  182. rc := g_application_run(app, 0, NIL);
  183. IF passed THEN
  184. printf("test_adw_widgets: PASS\n");
  185. HALT(0)
  186. ELSE
  187. printf("test_adw_widgets: FAIL\n");
  188. HALT(1)
  189. END
  190. END test_adw_widgets.