|
@@ -0,0 +1,222 @@
|
|
|
|
|
+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.
|