test_adw_widgets2.mod 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. MODULE test_adw_widgets2 ;
  2. (*
  3. m2-GTK4 test - the second batch of libadwaita (GNOME) widgets:
  4. dialogs, tabs, carousel, toggles, adaptive views, breakpoints, style
  5. manager, swipe tracker and animations. 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_application_window_new, gtk_window_set_child,
  10. gtk_window_present;
  11. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  12. FROM GtkLabel IMPORT gtk_label_new;
  13. FROM GtkEnums IMPORT GtkVertical;
  14. FROM GtkUtils IMPORT Connect;
  15. FROM AdwDialog IMPORT adw_dialog_new, adw_dialog_set_child,
  16. adw_dialog_set_title, adw_dialog_get_title;
  17. FROM AdwAlertDialog IMPORT adw_alert_dialog_new,
  18. adw_alert_dialog_add_response, adw_alert_dialog_has_response;
  19. FROM AdwAboutDialog IMPORT adw_about_dialog_new,
  20. adw_about_dialog_set_application_name;
  21. FROM AdwPreferencesDialog IMPORT adw_preferences_dialog_new,
  22. adw_preferences_dialog_add;
  23. FROM AdwPreferencesWindow IMPORT adw_preferences_window_new,
  24. adw_preferences_window_add;
  25. FROM AdwPreferencesPage IMPORT adw_preferences_page_new;
  26. FROM AdwTabView IMPORT adw_tab_view_new, adw_tab_view_append,
  27. adw_tab_view_get_n_pages, adw_tab_view_get_nth_page,
  28. adw_tab_view_set_shortcuts, adw_tab_view_get_shortcuts;
  29. FROM AdwTabBar IMPORT adw_tab_bar_new, adw_tab_bar_set_view;
  30. FROM AdwTabButton IMPORT adw_tab_button_new, adw_tab_button_set_view;
  31. FROM AdwTabOverview IMPORT adw_tab_overview_new, adw_tab_overview_set_view;
  32. FROM AdwCarousel IMPORT adw_carousel_new, adw_carousel_append,
  33. adw_carousel_get_n_pages;
  34. FROM AdwCarouselIndicatorDots IMPORT adw_carousel_indicator_dots_new,
  35. adw_carousel_indicator_dots_set_carousel;
  36. FROM AdwCarouselIndicatorLines IMPORT adw_carousel_indicator_lines_new,
  37. adw_carousel_indicator_lines_set_carousel;
  38. FROM AdwToggle IMPORT adw_toggle_new, adw_toggle_set_label;
  39. FROM AdwToggleGroup IMPORT adw_toggle_group_new, adw_toggle_group_add,
  40. adw_toggle_group_get_n_toggles;
  41. FROM AdwFlap IMPORT adw_flap_new, adw_flap_set_content, adw_flap_set_flap;
  42. FROM AdwLeaflet IMPORT adw_leaflet_new, adw_leaflet_append;
  43. FROM AdwOverlaySplitView IMPORT adw_overlay_split_view_new,
  44. adw_overlay_split_view_set_content, adw_overlay_split_view_set_sidebar;
  45. FROM AdwNavigationSplitView IMPORT adw_navigation_split_view_new,
  46. adw_navigation_split_view_set_content,
  47. adw_navigation_split_view_set_sidebar;
  48. FROM AdwNavigationPage IMPORT adw_navigation_page_new;
  49. FROM AdwBottomSheet IMPORT adw_bottom_sheet_new,
  50. adw_bottom_sheet_set_content, adw_bottom_sheet_set_sheet;
  51. FROM AdwBreakpoint IMPORT adw_breakpoint_new, adw_breakpoint_get_condition;
  52. FROM AdwBreakpointCondition IMPORT adw_breakpoint_condition_parse;
  53. FROM AdwMultiLayoutView IMPORT adw_multi_layout_view_new,
  54. adw_multi_layout_view_add_layout, adw_multi_layout_view_set_child;
  55. FROM AdwLayout IMPORT adw_layout_new, adw_layout_set_name;
  56. FROM AdwLayoutSlot IMPORT adw_layout_slot_new;
  57. FROM AdwStyleManager IMPORT adw_style_manager_get_default,
  58. adw_style_manager_set_color_scheme, adw_style_manager_get_color_scheme;
  59. FROM AdwEnums IMPORT AdwColorSchemePreferDark, AdwColorSchemePreferLight,
  60. AdwTabViewShortcutAll, AdwEasingEaseInOut;
  61. FROM AdwSwipeTracker IMPORT adw_swipe_tracker_new;
  62. FROM AdwSpringParams IMPORT adw_spring_params_new;
  63. FROM AdwTimedAnimation IMPORT adw_timed_animation_new,
  64. adw_timed_animation_set_easing;
  65. FROM AdwSpringAnimation IMPORT adw_spring_animation_new;
  66. FROM AdwPropertyAnimationTarget IMPORT adw_property_animation_target_new;
  67. FROM AdwCallbackAnimationTarget IMPORT adw_callback_animation_target_new;
  68. FROM AdwAnimation IMPORT adw_animation_get_widget;
  69. FROM SYSTEM IMPORT ADDRESS, ADR;
  70. FROM libc IMPORT printf;
  71. CONST
  72. AppId = "org.example.m2gtk4.TestAdwWidgets2";
  73. VAR
  74. app: ADDRESS;
  75. passed: BOOLEAN;
  76. failures: INTEGER;
  77. PROCEDURE Check (cond: BOOLEAN; what: ARRAY OF CHAR);
  78. BEGIN
  79. IF cond THEN
  80. printf(" ok - %s\n", what)
  81. ELSE
  82. printf(" NOT OK - %s\n", what);
  83. INC(failures)
  84. END
  85. END Check;
  86. (* void on_anim_value(double value, gpointer user_data) *)
  87. PROCEDURE OnAnimValue (value: REAL; user: ADDRESS);
  88. BEGIN
  89. END OnAnimValue;
  90. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  91. VAR
  92. window, box: ADDRESS;
  93. dialog, alert, about, prefdlg, prefwin, page: ADDRESS;
  94. tabview, tabbar, tabbtn, tabover, tabpage, label: ADDRESS;
  95. carousel, dots, lines: ADDRESS;
  96. tg, toggle: ADDRESS;
  97. flap, leaflet, osplit, nsplit, sheet: ADDRESS;
  98. cond, bp, mlv, layout, slot: ADDRESS;
  99. sm, tracker, spring: ADDRESS;
  100. target, anim: ADDRESS;
  101. BEGIN
  102. failures := 0;
  103. window := gtk_application_window_new(application);
  104. (* dialogs *)
  105. dialog := adw_dialog_new();
  106. adw_dialog_set_title (dialog, "A dialog");
  107. adw_dialog_set_child (dialog, gtk_label_new("content"));
  108. Check(adw_dialog_get_title (dialog) # NIL, "AdwDialog");
  109. alert := adw_alert_dialog_new ("Heading", "Body");
  110. adw_alert_dialog_add_response (alert, "ok", "OK");
  111. Check(adw_alert_dialog_has_response (alert, "ok") # 0,
  112. "AdwAlertDialog response");
  113. about := adw_about_dialog_new();
  114. adw_about_dialog_set_application_name (about, "m2-GTK4");
  115. Check(about # NIL, "AdwAboutDialog");
  116. page := adw_preferences_page_new();
  117. prefdlg := adw_preferences_dialog_new();
  118. adw_preferences_dialog_add (prefdlg, page);
  119. Check(prefdlg # NIL, "AdwPreferencesDialog");
  120. prefwin := adw_preferences_window_new();
  121. adw_preferences_window_add (prefwin, adw_preferences_page_new());
  122. Check(prefwin # NIL, "AdwPreferencesWindow");
  123. (* tabs *)
  124. tabview := adw_tab_view_new();
  125. label := gtk_label_new("Page 1");
  126. tabpage := adw_tab_view_append (tabview, label);
  127. label := gtk_label_new("Page 2");
  128. tabpage := adw_tab_view_append (tabview, label);
  129. Check(adw_tab_view_get_n_pages (tabview) = 2, "AdwTabView pages");
  130. Check(adw_tab_view_get_nth_page (tabview, 1) # NIL, "AdwTabView nth page");
  131. adw_tab_view_set_shortcuts (tabview, AdwTabViewShortcutAll);
  132. Check(adw_tab_view_get_shortcuts (tabview) # 0, "AdwTabView shortcuts");
  133. tabbar := adw_tab_bar_new();
  134. adw_tab_bar_set_view (tabbar, tabview);
  135. Check(tabbar # NIL, "AdwTabBar");
  136. tabbtn := adw_tab_button_new();
  137. adw_tab_button_set_view (tabbtn, tabview);
  138. Check(tabbtn # NIL, "AdwTabButton");
  139. tabover := adw_tab_overview_new();
  140. adw_tab_overview_set_view (tabover, tabview);
  141. Check(tabover # NIL, "AdwTabOverview");
  142. (* carousel *)
  143. carousel := adw_carousel_new();
  144. adw_carousel_append (carousel, gtk_label_new("One"));
  145. adw_carousel_append (carousel, gtk_label_new("Two"));
  146. Check(adw_carousel_get_n_pages (carousel) = 2, "AdwCarousel pages");
  147. dots := adw_carousel_indicator_dots_new();
  148. adw_carousel_indicator_dots_set_carousel (dots, carousel);
  149. lines := adw_carousel_indicator_lines_new();
  150. adw_carousel_indicator_lines_set_carousel (lines, carousel);
  151. Check((dots # NIL) AND (lines # NIL), "AdwCarousel indicators");
  152. (* toggles *)
  153. tg := adw_toggle_group_new();
  154. toggle := adw_toggle_new();
  155. adw_toggle_set_label (toggle, "One");
  156. adw_toggle_group_add (tg, toggle);
  157. toggle := adw_toggle_new();
  158. adw_toggle_set_label (toggle, "Two");
  159. adw_toggle_group_add (tg, toggle);
  160. Check(adw_toggle_group_get_n_toggles (tg) = 2, "AdwToggleGroup toggles");
  161. (* adaptive views *)
  162. flap := adw_flap_new();
  163. adw_flap_set_content (flap, gtk_label_new("content"));
  164. adw_flap_set_flap (flap, gtk_label_new("flap"));
  165. Check(flap # NIL, "AdwFlap");
  166. leaflet := adw_leaflet_new();
  167. page := adw_leaflet_append (leaflet, gtk_label_new("page"));
  168. page := adw_leaflet_append (leaflet, gtk_label_new("page2"));
  169. Check(leaflet # NIL, "AdwLeaflet");
  170. osplit := adw_overlay_split_view_new();
  171. adw_overlay_split_view_set_sidebar (osplit, gtk_label_new("sidebar"));
  172. adw_overlay_split_view_set_content (osplit, gtk_label_new("content"));
  173. Check(osplit # NIL, "AdwOverlaySplitView");
  174. nsplit := adw_navigation_split_view_new();
  175. adw_navigation_split_view_set_sidebar
  176. (nsplit, adw_navigation_page_new (gtk_label_new("sidebar"), "Side"));
  177. adw_navigation_split_view_set_content
  178. (nsplit, adw_navigation_page_new (gtk_label_new("content"), "Main"));
  179. Check(nsplit # NIL, "AdwNavigationSplitView");
  180. sheet := adw_bottom_sheet_new();
  181. adw_bottom_sheet_set_content (sheet, gtk_label_new("content"));
  182. adw_bottom_sheet_set_sheet (sheet, gtk_label_new("sheet"));
  183. Check(sheet # NIL, "AdwBottomSheet");
  184. (* breakpoints *)
  185. cond := adw_breakpoint_condition_parse ("max-width: 600px");
  186. bp := adw_breakpoint_new (cond);
  187. Check(adw_breakpoint_get_condition (bp) # NIL, "AdwBreakpoint condition");
  188. (* multi layout view *)
  189. mlv := adw_multi_layout_view_new();
  190. layout := adw_layout_new (gtk_label_new("layout"));
  191. adw_layout_set_name (layout, "main");
  192. adw_multi_layout_view_add_layout (mlv, layout);
  193. slot := adw_layout_slot_new ("slot1");
  194. adw_multi_layout_view_set_child (mlv, "slot1", gtk_label_new("child"));
  195. Check((mlv # NIL) AND (slot # NIL), "AdwMultiLayoutView");
  196. (* style manager *)
  197. sm := adw_style_manager_get_default();
  198. adw_style_manager_set_color_scheme (sm, AdwColorSchemePreferDark);
  199. Check(adw_style_manager_get_color_scheme (sm) = AdwColorSchemePreferDark,
  200. "AdwStyleManager colour scheme");
  201. adw_style_manager_set_color_scheme (sm, AdwColorSchemePreferLight);
  202. (* swipe tracker (carousel implements AdwSwipeable) *)
  203. tracker := adw_swipe_tracker_new (carousel);
  204. Check(tracker # NIL, "AdwSwipeTracker");
  205. (* animations *)
  206. spring := adw_spring_params_new (0.9, 1.0, 100.0);
  207. target := adw_property_animation_target_new (label, "opacity");
  208. anim := adw_timed_animation_new (label, 0.0, 1.0, 200, target);
  209. adw_timed_animation_set_easing (anim, AdwEasingEaseInOut);
  210. Check(adw_animation_get_widget (anim) = label, "AdwTimedAnimation");
  211. anim := adw_spring_animation_new (label, 0.0, 1.0, spring, target);
  212. Check(anim # NIL, "AdwSpringAnimation");
  213. target := adw_callback_animation_target_new (ADR(OnAnimValue), NIL, NIL);
  214. Check(target # NIL, "AdwCallbackAnimationTarget");
  215. (* build a small window *)
  216. box := gtk_box_new (GtkVertical, 12);
  217. gtk_box_append (box, gtk_label_new("libadwaita widgets, batch 2"));
  218. gtk_box_append (box, carousel);
  219. gtk_box_append (box, tg);
  220. gtk_window_set_child (window, box);
  221. gtk_window_present (window);
  222. passed := (failures = 0);
  223. g_application_quit (application)
  224. END OnActivate;
  225. VAR
  226. rc: INTEGER;
  227. BEGIN
  228. passed := FALSE;
  229. failures := 0;
  230. app := gtk_application_new(AppId, 0);
  231. IF app = NIL THEN
  232. printf("test_adw_widgets2: FAIL (no app)\n");
  233. HALT(1)
  234. END;
  235. Connect(app, "activate", ADR(OnActivate), NIL);
  236. rc := g_application_run(app, 0, NIL);
  237. IF passed THEN
  238. printf("test_adw_widgets2: PASS\n");
  239. HALT(0)
  240. ELSE
  241. printf("test_adw_widgets2: FAIL\n");
  242. HALT(1)
  243. END
  244. END test_adw_widgets2.