MODULE test_adw_widgets ; (* m2-GTK4 test - the newly bound libadwaita (GNOME) widgets: view stack/switchers, navigation view, adaptive containers, rows, avatar and friends. Requires a display. *) FROM GtkApplication IMPORT gtk_application_new; FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkWindow IMPORT gtk_window_set_title, gtk_window_set_default_size, gtk_window_present; FROM GtkBox IMPORT gtk_box_new, gtk_box_append; FROM GtkEnums IMPORT GtkVertical; FROM GtkLabel IMPORT gtk_label_new; FROM GtkUtils IMPORT Connect; FROM AdwWindow IMPORT adw_window_new, adw_window_set_content; FROM AdwViewStack IMPORT adw_view_stack_new, adw_view_stack_add_titled, adw_view_stack_add_titled_with_icon, adw_view_stack_set_visible_child_name, adw_view_stack_get_visible_child_name; FROM AdwViewSwitcher IMPORT adw_view_switcher_new, adw_view_switcher_set_stack, adw_view_switcher_get_policy; FROM AdwViewSwitcherBar IMPORT adw_view_switcher_bar_new, adw_view_switcher_bar_set_stack, adw_view_switcher_bar_set_reveal; FROM AdwViewSwitcherTitle IMPORT adw_view_switcher_title_new, adw_view_switcher_title_set_title, adw_view_switcher_title_set_subtitle, adw_view_switcher_title_set_stack; FROM AdwInlineViewSwitcher IMPORT adw_inline_view_switcher_new, adw_inline_view_switcher_set_stack, adw_inline_view_switcher_set_display_mode; FROM AdwEnums IMPORT AdwInlineViewSwitcherLabels; FROM AdwNavigationView IMPORT adw_navigation_view_new, adw_navigation_view_push, adw_navigation_view_get_visible_page, adw_navigation_view_pop; FROM AdwNavigationPage IMPORT adw_navigation_page_new; FROM AdwWindowTitle IMPORT adw_window_title_new; FROM AdwBin IMPORT adw_bin_new, adw_bin_set_child; FROM AdwSpinner IMPORT adw_spinner_new; FROM AdwSpinnerPaintable IMPORT adw_spinner_paintable_new; FROM AdwAvatar IMPORT adw_avatar_new; FROM AdwButtonContent IMPORT adw_button_content_new, adw_button_content_set_label, adw_button_content_set_icon_name; FROM AdwSplitButton IMPORT adw_split_button_new, adw_split_button_set_label; FROM AdwButtonRow IMPORT adw_button_row_new, adw_button_row_set_start_icon_name, adw_button_row_set_end_icon_name; FROM AdwSpinRow IMPORT adw_spin_row_new_with_range; FROM AdwPasswordEntryRow IMPORT adw_password_entry_row_new; FROM AdwClampScrollable IMPORT adw_clamp_scrollable_new, adw_clamp_scrollable_set_maximum_size; FROM AdwClampLayout IMPORT adw_clamp_layout_new; FROM AdwSqueezer IMPORT adw_squeezer_new, adw_squeezer_add; FROM AdwWrapBox IMPORT adw_wrap_box_new, adw_wrap_box_append; FROM AdwWrapLayout IMPORT adw_wrap_layout_new; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestAdwWidgets"; 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; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, stack, p1, p2, switcher, bar, title, inl, nav, np1, np2: ADDRESS; clamp, cliplayout, wrap, wraplayout, squeeze, avatar: ADDRESS; content, split, brow, spin, pw, bin, spinner, sp, wt: ADDRESS; visible: ADDRESS; BEGIN failures := 0; (* AdwViewStack + pages + switchers *) stack := adw_view_stack_new(); p1 := adw_view_stack_add_titled (stack, gtk_label_new("One"), "one", "Page One"); p2 := adw_view_stack_add_titled_with_icon (stack, gtk_label_new("Two"), "two", "Page Two", "go-home-symbolic"); Check((stack # NIL) AND (p1 # NIL) AND (p2 # NIL), "AdwViewStack pages"); adw_view_stack_set_visible_child_name (stack, "two"); visible := adw_view_stack_get_visible_child_name (stack); Check(visible # NIL, "AdwViewStack visible page name"); switcher := adw_view_switcher_new(); adw_view_switcher_set_stack (switcher, stack); Check(adw_view_switcher_get_policy (switcher) = 0, "AdwViewSwitcher policy"); bar := adw_view_switcher_bar_new(); adw_view_switcher_bar_set_stack (bar, stack); adw_view_switcher_bar_set_reveal (bar, 1); Check(bar # NIL, "AdwViewSwitcherBar"); title := adw_view_switcher_title_new(); adw_view_switcher_title_set_title (title, "Demo"); adw_view_switcher_title_set_subtitle (title, "GNOME widgets"); adw_view_switcher_title_set_stack (title, stack); Check(title # NIL, "AdwViewSwitcherTitle"); inl := adw_inline_view_switcher_new(); adw_inline_view_switcher_set_stack (inl, stack); adw_inline_view_switcher_set_display_mode (inl, AdwInlineViewSwitcherLabels); Check(inl # NIL, "AdwInlineViewSwitcher"); (* AdwNavigationView *) nav := adw_navigation_view_new(); np1 := adw_navigation_page_new (gtk_label_new("Root"), "Root"); adw_navigation_view_push (nav, np1); np2 := adw_navigation_page_new (gtk_label_new("Child"), "Child"); adw_navigation_view_push (nav, np2); Check(adw_navigation_view_get_visible_page (nav) = np2, "AdwNavigationView push"); Check(adw_navigation_view_pop (nav) # 0, "AdwNavigationView pop"); Check(adw_navigation_view_get_visible_page (nav) = np1, "AdwNavigationView visible after pop"); (* adaptive containers *) clamp := adw_clamp_scrollable_new(); adw_clamp_scrollable_set_maximum_size (clamp, 400); Check(clamp # NIL, "AdwClampScrollable"); cliplayout := adw_clamp_layout_new(); Check(cliplayout # NIL, "AdwClampLayout"); wrap := adw_wrap_box_new(); adw_wrap_box_append (wrap, gtk_label_new("a")); adw_wrap_box_append (wrap, gtk_label_new("b")); Check(wrap # NIL, "AdwWrapBox"); wraplayout := adw_wrap_layout_new(); Check(wraplayout # NIL, "AdwWrapLayout"); squeeze := adw_squeezer_new(); visible := adw_squeezer_add (squeeze, gtk_label_new("wide")); visible := adw_squeezer_add (squeeze, gtk_label_new("narrow")); Check(squeeze # NIL, "AdwSqueezer"); (* rows and misc *) avatar := adw_avatar_new (32, "Eric", 1); Check(avatar # NIL, "AdwAvatar"); content := adw_button_content_new(); adw_button_content_set_icon_name (content, "go-home-symbolic"); adw_button_content_set_label (content, "Home"); Check(content # NIL, "AdwButtonContent"); split := adw_split_button_new(); adw_split_button_set_label (split, "Split"); Check(split # NIL, "AdwSplitButton"); brow := adw_button_row_new(); adw_button_row_set_start_icon_name (brow, "go-home-symbolic"); adw_button_row_set_end_icon_name (brow, "go-next-symbolic"); Check(brow # NIL, "AdwButtonRow"); spin := adw_spin_row_new_with_range (0.0, 10.0, 1.0); Check(spin # NIL, "AdwSpinRow"); pw := adw_password_entry_row_new(); Check(pw # NIL, "AdwPasswordEntryRow"); bin := adw_bin_new(); adw_bin_set_child (bin, gtk_label_new("bin")); Check(bin # NIL, "AdwBin"); spinner := adw_spinner_new(); sp := adw_spinner_paintable_new (spinner); Check((spinner # NIL) AND (sp # NIL), "AdwSpinner / AdwSpinnerPaintable"); wt := adw_window_title_new ("Title", "Subtitle"); Check(wt # NIL, "AdwWindowTitle"); (* put a few of them in the window *) box := gtk_box_new (GtkVertical, 12); gtk_box_append (box, gtk_label_new("libadwaita widgets")); gtk_box_append (box, avatar); gtk_box_append (box, split); gtk_box_append (box, spinner); window := adw_window_new(); gtk_window_set_title (window, "Adw widgets"); gtk_window_set_default_size (window, 360, 300); adw_window_set_content (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_widgets: 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_widgets: PASS\n"); HALT(0) ELSE printf("test_adw_widgets: FAIL\n"); HALT(1) END END test_adw_widgets.