|
|
@@ -0,0 +1,278 @@
|
|
|
+MODULE test_adw_widgets2 ;
|
|
|
+
|
|
|
+(*
|
|
|
+ m2-GTK4 test - the second batch of libadwaita (GNOME) widgets:
|
|
|
+ dialogs, tabs, carousel, toggles, adaptive views, breakpoints, style
|
|
|
+ manager, swipe tracker and animations. Requires a display.
|
|
|
+*)
|
|
|
+
|
|
|
+FROM GtkApplication IMPORT gtk_application_new;
|
|
|
+FROM Gio IMPORT g_application_run, g_application_quit;
|
|
|
+FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child,
|
|
|
+ gtk_window_present;
|
|
|
+FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
|
|
|
+FROM GtkLabel IMPORT gtk_label_new;
|
|
|
+FROM GtkEnums IMPORT GtkVertical;
|
|
|
+FROM GtkUtils IMPORT Connect;
|
|
|
+FROM AdwDialog IMPORT adw_dialog_new, adw_dialog_set_child,
|
|
|
+ adw_dialog_set_title, adw_dialog_get_title;
|
|
|
+FROM AdwAlertDialog IMPORT adw_alert_dialog_new,
|
|
|
+ adw_alert_dialog_add_response, adw_alert_dialog_has_response;
|
|
|
+FROM AdwAboutDialog IMPORT adw_about_dialog_new,
|
|
|
+ adw_about_dialog_set_application_name;
|
|
|
+FROM AdwPreferencesDialog IMPORT adw_preferences_dialog_new,
|
|
|
+ adw_preferences_dialog_add;
|
|
|
+FROM AdwPreferencesWindow IMPORT adw_preferences_window_new,
|
|
|
+ adw_preferences_window_add;
|
|
|
+FROM AdwPreferencesPage IMPORT adw_preferences_page_new;
|
|
|
+FROM AdwTabView IMPORT adw_tab_view_new, adw_tab_view_append,
|
|
|
+ adw_tab_view_get_n_pages, adw_tab_view_get_nth_page,
|
|
|
+ adw_tab_view_set_shortcuts, adw_tab_view_get_shortcuts;
|
|
|
+FROM AdwTabBar IMPORT adw_tab_bar_new, adw_tab_bar_set_view;
|
|
|
+FROM AdwTabButton IMPORT adw_tab_button_new, adw_tab_button_set_view;
|
|
|
+FROM AdwTabOverview IMPORT adw_tab_overview_new, adw_tab_overview_set_view;
|
|
|
+FROM AdwCarousel IMPORT adw_carousel_new, adw_carousel_append,
|
|
|
+ adw_carousel_get_n_pages;
|
|
|
+FROM AdwCarouselIndicatorDots IMPORT adw_carousel_indicator_dots_new,
|
|
|
+ adw_carousel_indicator_dots_set_carousel;
|
|
|
+FROM AdwCarouselIndicatorLines IMPORT adw_carousel_indicator_lines_new,
|
|
|
+ adw_carousel_indicator_lines_set_carousel;
|
|
|
+FROM AdwToggle IMPORT adw_toggle_new, adw_toggle_set_label;
|
|
|
+FROM AdwToggleGroup IMPORT adw_toggle_group_new, adw_toggle_group_add,
|
|
|
+ adw_toggle_group_get_n_toggles;
|
|
|
+FROM AdwFlap IMPORT adw_flap_new, adw_flap_set_content, adw_flap_set_flap;
|
|
|
+FROM AdwLeaflet IMPORT adw_leaflet_new, adw_leaflet_append;
|
|
|
+FROM AdwOverlaySplitView IMPORT adw_overlay_split_view_new,
|
|
|
+ adw_overlay_split_view_set_content, adw_overlay_split_view_set_sidebar;
|
|
|
+FROM AdwNavigationSplitView IMPORT adw_navigation_split_view_new,
|
|
|
+ adw_navigation_split_view_set_content,
|
|
|
+ adw_navigation_split_view_set_sidebar;
|
|
|
+FROM AdwNavigationPage IMPORT adw_navigation_page_new;
|
|
|
+FROM AdwBottomSheet IMPORT adw_bottom_sheet_new,
|
|
|
+ adw_bottom_sheet_set_content, adw_bottom_sheet_set_sheet;
|
|
|
+FROM AdwBreakpoint IMPORT adw_breakpoint_new, adw_breakpoint_get_condition;
|
|
|
+FROM AdwBreakpointCondition IMPORT adw_breakpoint_condition_parse;
|
|
|
+FROM AdwMultiLayoutView IMPORT adw_multi_layout_view_new,
|
|
|
+ adw_multi_layout_view_add_layout, adw_multi_layout_view_set_child;
|
|
|
+FROM AdwLayout IMPORT adw_layout_new, adw_layout_set_name;
|
|
|
+FROM AdwLayoutSlot IMPORT adw_layout_slot_new;
|
|
|
+FROM AdwStyleManager IMPORT adw_style_manager_get_default,
|
|
|
+ adw_style_manager_set_color_scheme, adw_style_manager_get_color_scheme;
|
|
|
+FROM AdwEnums IMPORT AdwColorSchemePreferDark, AdwColorSchemePreferLight,
|
|
|
+ AdwTabViewShortcutAll, AdwEasingEaseInOut;
|
|
|
+FROM AdwSwipeTracker IMPORT adw_swipe_tracker_new;
|
|
|
+FROM AdwSpringParams IMPORT adw_spring_params_new;
|
|
|
+FROM AdwTimedAnimation IMPORT adw_timed_animation_new,
|
|
|
+ adw_timed_animation_set_easing;
|
|
|
+FROM AdwSpringAnimation IMPORT adw_spring_animation_new;
|
|
|
+FROM AdwPropertyAnimationTarget IMPORT adw_property_animation_target_new;
|
|
|
+FROM AdwCallbackAnimationTarget IMPORT adw_callback_animation_target_new;
|
|
|
+FROM AdwAnimation IMPORT adw_animation_get_widget;
|
|
|
+FROM SYSTEM IMPORT ADDRESS, ADR;
|
|
|
+FROM libc IMPORT printf;
|
|
|
+
|
|
|
+CONST
|
|
|
+ AppId = "org.example.m2gtk4.TestAdwWidgets2";
|
|
|
+
|
|
|
+VAR
|
|
|
+ app: ADDRESS;
|
|
|
+ passed: BOOLEAN;
|
|
|
+ failures: INTEGER;
|
|
|
+
|
|
|
+PROCEDURE Check (cond: BOOLEAN; what: ARRAY OF CHAR);
|
|
|
+BEGIN
|
|
|
+ IF cond THEN
|
|
|
+ printf(" ok - %s\n", what)
|
|
|
+ ELSE
|
|
|
+ printf(" NOT OK - %s\n", what);
|
|
|
+ INC(failures)
|
|
|
+ END
|
|
|
+END Check;
|
|
|
+
|
|
|
+(* void on_anim_value(double value, gpointer user_data) *)
|
|
|
+PROCEDURE OnAnimValue (value: REAL; user: ADDRESS);
|
|
|
+BEGIN
|
|
|
+END OnAnimValue;
|
|
|
+
|
|
|
+PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
|
|
|
+VAR
|
|
|
+ window, box: ADDRESS;
|
|
|
+ dialog, alert, about, prefdlg, prefwin, page: ADDRESS;
|
|
|
+ tabview, tabbar, tabbtn, tabover, tabpage, label: ADDRESS;
|
|
|
+ carousel, dots, lines: ADDRESS;
|
|
|
+ tg, toggle: ADDRESS;
|
|
|
+ flap, leaflet, osplit, nsplit, sheet: ADDRESS;
|
|
|
+ cond, bp, mlv, layout, slot: ADDRESS;
|
|
|
+ sm, tracker, spring: ADDRESS;
|
|
|
+ target, anim: ADDRESS;
|
|
|
+BEGIN
|
|
|
+ failures := 0;
|
|
|
+
|
|
|
+ window := gtk_application_window_new(application);
|
|
|
+
|
|
|
+ (* dialogs *)
|
|
|
+ dialog := adw_dialog_new();
|
|
|
+ adw_dialog_set_title (dialog, "A dialog");
|
|
|
+ adw_dialog_set_child (dialog, gtk_label_new("content"));
|
|
|
+ Check(adw_dialog_get_title (dialog) # NIL, "AdwDialog");
|
|
|
+
|
|
|
+ alert := adw_alert_dialog_new ("Heading", "Body");
|
|
|
+ adw_alert_dialog_add_response (alert, "ok", "OK");
|
|
|
+ Check(adw_alert_dialog_has_response (alert, "ok") # 0,
|
|
|
+ "AdwAlertDialog response");
|
|
|
+
|
|
|
+ about := adw_about_dialog_new();
|
|
|
+ adw_about_dialog_set_application_name (about, "m2-GTK4");
|
|
|
+ Check(about # NIL, "AdwAboutDialog");
|
|
|
+
|
|
|
+ page := adw_preferences_page_new();
|
|
|
+ prefdlg := adw_preferences_dialog_new();
|
|
|
+ adw_preferences_dialog_add (prefdlg, page);
|
|
|
+ Check(prefdlg # NIL, "AdwPreferencesDialog");
|
|
|
+
|
|
|
+ prefwin := adw_preferences_window_new();
|
|
|
+ adw_preferences_window_add (prefwin, adw_preferences_page_new());
|
|
|
+ Check(prefwin # NIL, "AdwPreferencesWindow");
|
|
|
+
|
|
|
+ (* tabs *)
|
|
|
+ tabview := adw_tab_view_new();
|
|
|
+ label := gtk_label_new("Page 1");
|
|
|
+ tabpage := adw_tab_view_append (tabview, label);
|
|
|
+ label := gtk_label_new("Page 2");
|
|
|
+ tabpage := adw_tab_view_append (tabview, label);
|
|
|
+ Check(adw_tab_view_get_n_pages (tabview) = 2, "AdwTabView pages");
|
|
|
+ Check(adw_tab_view_get_nth_page (tabview, 1) # NIL, "AdwTabView nth page");
|
|
|
+ adw_tab_view_set_shortcuts (tabview, AdwTabViewShortcutAll);
|
|
|
+ Check(adw_tab_view_get_shortcuts (tabview) # 0, "AdwTabView shortcuts");
|
|
|
+
|
|
|
+ tabbar := adw_tab_bar_new();
|
|
|
+ adw_tab_bar_set_view (tabbar, tabview);
|
|
|
+ Check(tabbar # NIL, "AdwTabBar");
|
|
|
+
|
|
|
+ tabbtn := adw_tab_button_new();
|
|
|
+ adw_tab_button_set_view (tabbtn, tabview);
|
|
|
+ Check(tabbtn # NIL, "AdwTabButton");
|
|
|
+
|
|
|
+ tabover := adw_tab_overview_new();
|
|
|
+ adw_tab_overview_set_view (tabover, tabview);
|
|
|
+ Check(tabover # NIL, "AdwTabOverview");
|
|
|
+
|
|
|
+ (* carousel *)
|
|
|
+ carousel := adw_carousel_new();
|
|
|
+ adw_carousel_append (carousel, gtk_label_new("One"));
|
|
|
+ adw_carousel_append (carousel, gtk_label_new("Two"));
|
|
|
+ Check(adw_carousel_get_n_pages (carousel) = 2, "AdwCarousel pages");
|
|
|
+
|
|
|
+ dots := adw_carousel_indicator_dots_new();
|
|
|
+ adw_carousel_indicator_dots_set_carousel (dots, carousel);
|
|
|
+ lines := adw_carousel_indicator_lines_new();
|
|
|
+ adw_carousel_indicator_lines_set_carousel (lines, carousel);
|
|
|
+ Check((dots # NIL) AND (lines # NIL), "AdwCarousel indicators");
|
|
|
+
|
|
|
+ (* toggles *)
|
|
|
+ tg := adw_toggle_group_new();
|
|
|
+ toggle := adw_toggle_new();
|
|
|
+ adw_toggle_set_label (toggle, "One");
|
|
|
+ adw_toggle_group_add (tg, toggle);
|
|
|
+ toggle := adw_toggle_new();
|
|
|
+ adw_toggle_set_label (toggle, "Two");
|
|
|
+ adw_toggle_group_add (tg, toggle);
|
|
|
+ Check(adw_toggle_group_get_n_toggles (tg) = 2, "AdwToggleGroup toggles");
|
|
|
+
|
|
|
+ (* adaptive views *)
|
|
|
+ flap := adw_flap_new();
|
|
|
+ adw_flap_set_content (flap, gtk_label_new("content"));
|
|
|
+ adw_flap_set_flap (flap, gtk_label_new("flap"));
|
|
|
+ Check(flap # NIL, "AdwFlap");
|
|
|
+
|
|
|
+ leaflet := adw_leaflet_new();
|
|
|
+ page := adw_leaflet_append (leaflet, gtk_label_new("page"));
|
|
|
+ page := adw_leaflet_append (leaflet, gtk_label_new("page2"));
|
|
|
+ Check(leaflet # NIL, "AdwLeaflet");
|
|
|
+
|
|
|
+ osplit := adw_overlay_split_view_new();
|
|
|
+ adw_overlay_split_view_set_sidebar (osplit, gtk_label_new("sidebar"));
|
|
|
+ adw_overlay_split_view_set_content (osplit, gtk_label_new("content"));
|
|
|
+ Check(osplit # NIL, "AdwOverlaySplitView");
|
|
|
+
|
|
|
+ nsplit := adw_navigation_split_view_new();
|
|
|
+ adw_navigation_split_view_set_sidebar
|
|
|
+ (nsplit, adw_navigation_page_new (gtk_label_new("sidebar"), "Side"));
|
|
|
+ adw_navigation_split_view_set_content
|
|
|
+ (nsplit, adw_navigation_page_new (gtk_label_new("content"), "Main"));
|
|
|
+ Check(nsplit # NIL, "AdwNavigationSplitView");
|
|
|
+
|
|
|
+ sheet := adw_bottom_sheet_new();
|
|
|
+ adw_bottom_sheet_set_content (sheet, gtk_label_new("content"));
|
|
|
+ adw_bottom_sheet_set_sheet (sheet, gtk_label_new("sheet"));
|
|
|
+ Check(sheet # NIL, "AdwBottomSheet");
|
|
|
+
|
|
|
+ (* breakpoints *)
|
|
|
+ cond := adw_breakpoint_condition_parse ("max-width: 600px");
|
|
|
+ bp := adw_breakpoint_new (cond);
|
|
|
+ Check(adw_breakpoint_get_condition (bp) # NIL, "AdwBreakpoint condition");
|
|
|
+
|
|
|
+ (* multi layout view *)
|
|
|
+ mlv := adw_multi_layout_view_new();
|
|
|
+ layout := adw_layout_new (gtk_label_new("layout"));
|
|
|
+ adw_layout_set_name (layout, "main");
|
|
|
+ adw_multi_layout_view_add_layout (mlv, layout);
|
|
|
+ slot := adw_layout_slot_new ("slot1");
|
|
|
+ adw_multi_layout_view_set_child (mlv, "slot1", gtk_label_new("child"));
|
|
|
+ Check((mlv # NIL) AND (slot # NIL), "AdwMultiLayoutView");
|
|
|
+
|
|
|
+ (* style manager *)
|
|
|
+ sm := adw_style_manager_get_default();
|
|
|
+ adw_style_manager_set_color_scheme (sm, AdwColorSchemePreferDark);
|
|
|
+ Check(adw_style_manager_get_color_scheme (sm) = AdwColorSchemePreferDark,
|
|
|
+ "AdwStyleManager colour scheme");
|
|
|
+ adw_style_manager_set_color_scheme (sm, AdwColorSchemePreferLight);
|
|
|
+
|
|
|
+ (* swipe tracker (carousel implements AdwSwipeable) *)
|
|
|
+ tracker := adw_swipe_tracker_new (carousel);
|
|
|
+ Check(tracker # NIL, "AdwSwipeTracker");
|
|
|
+
|
|
|
+ (* animations *)
|
|
|
+ spring := adw_spring_params_new (0.9, 1.0, 100.0);
|
|
|
+ target := adw_property_animation_target_new (label, "opacity");
|
|
|
+ anim := adw_timed_animation_new (label, 0.0, 1.0, 200, target);
|
|
|
+ adw_timed_animation_set_easing (anim, AdwEasingEaseInOut);
|
|
|
+ Check(adw_animation_get_widget (anim) = label, "AdwTimedAnimation");
|
|
|
+ anim := adw_spring_animation_new (label, 0.0, 1.0, spring, target);
|
|
|
+ Check(anim # NIL, "AdwSpringAnimation");
|
|
|
+ target := adw_callback_animation_target_new (ADR(OnAnimValue), NIL, NIL);
|
|
|
+ Check(target # NIL, "AdwCallbackAnimationTarget");
|
|
|
+
|
|
|
+ (* build a small window *)
|
|
|
+ box := gtk_box_new (GtkVertical, 12);
|
|
|
+ gtk_box_append (box, gtk_label_new("libadwaita widgets, batch 2"));
|
|
|
+ gtk_box_append (box, carousel);
|
|
|
+ gtk_box_append (box, tg);
|
|
|
+ gtk_window_set_child (window, box);
|
|
|
+ gtk_window_present (window);
|
|
|
+
|
|
|
+ passed := (failures = 0);
|
|
|
+ g_application_quit (application)
|
|
|
+END OnActivate;
|
|
|
+
|
|
|
+VAR
|
|
|
+ rc: INTEGER;
|
|
|
+BEGIN
|
|
|
+ passed := FALSE;
|
|
|
+ failures := 0;
|
|
|
+ app := gtk_application_new(AppId, 0);
|
|
|
+ IF app = NIL THEN
|
|
|
+ printf("test_adw_widgets2: FAIL (no app)\n");
|
|
|
+ HALT(1)
|
|
|
+ END;
|
|
|
+ Connect(app, "activate", ADR(OnActivate), NIL);
|
|
|
+ rc := g_application_run(app, 0, NIL);
|
|
|
+
|
|
|
+ IF passed THEN
|
|
|
+ printf("test_adw_widgets2: PASS\n");
|
|
|
+ HALT(0)
|
|
|
+ ELSE
|
|
|
+ printf("test_adw_widgets2: FAIL\n");
|
|
|
+ HALT(1)
|
|
|
+ END
|
|
|
+END test_adw_widgets2.
|