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.