test_popover.mod 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. MODULE test_popover ;
  2. (*
  3. m2-GTK4 test - GtkPopover, GtkPopoverMenu and GtkMenuButton popovers.
  4. Presents a window, then (from a timeout, once widgets are mapped)
  5. opens and closes a popover. Requires a display.
  6. *)
  7. FROM Gio IMPORT g_application_run, g_application_quit;
  8. FROM GtkApplication IMPORT gtk_application_new;
  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 GtkEnums IMPORT GtkVertical;
  13. FROM GtkButton IMPORT gtk_button_new_with_label;
  14. FROM GtkLabel IMPORT gtk_label_new;
  15. FROM GtkPopover IMPORT gtk_popover_new, gtk_popover_set_child,
  16. gtk_popover_get_child, gtk_popover_popup, gtk_popover_popdown,
  17. gtk_popover_set_autohide, gtk_popover_get_autohide,
  18. gtk_popover_set_has_arrow, gtk_popover_set_offset,
  19. gtk_popover_get_offset;
  20. FROM GtkPopoverMenu IMPORT gtk_popover_menu_new_from_model,
  21. gtk_popover_menu_get_menu_model, gtk_popover_menu_set_flags,
  22. gtk_popover_menu_get_flags, GtkPopoverMenuNested;
  23. FROM GtkMenuButton IMPORT gtk_menu_button_new,
  24. gtk_menu_button_set_popover, gtk_menu_button_get_popover;
  25. FROM GtkWidget IMPORT gtk_widget_set_parent, gtk_widget_get_parent;
  26. FROM GMenu IMPORT g_menu_new, g_menu_append;
  27. FROM GtkUtils IMPORT Connect;
  28. FROM GLib IMPORT g_timeout_add, GSourceRemove;
  29. FROM SYSTEM IMPORT ADDRESS, ADR;
  30. FROM libc IMPORT printf;
  31. CONST
  32. AppId = "org.example.m2gtk4.TestPopover";
  33. VAR
  34. app, popover: ADDRESS;
  35. passed: BOOLEAN;
  36. PROCEDURE AfterMap (data: ADDRESS) : INTEGER;
  37. BEGIN
  38. gtk_popover_popup(popover);
  39. gtk_popover_popdown(popover);
  40. g_application_quit(app);
  41. RETURN GSourceRemove
  42. END AfterMap;
  43. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  44. VAR
  45. window, box, button, child, menu, pm, mb: ADDRESS;
  46. x, y: INTEGER;
  47. ok: BOOLEAN;
  48. BEGIN
  49. ok := TRUE;
  50. child := gtk_label_new("popover content");
  51. popover := gtk_popover_new();
  52. gtk_popover_set_child(popover, child);
  53. IF gtk_popover_get_child(popover) # child THEN ok := FALSE END;
  54. gtk_popover_set_autohide(popover, 0);
  55. IF gtk_popover_get_autohide(popover) # 0 THEN ok := FALSE END;
  56. gtk_popover_set_has_arrow(popover, 0);
  57. gtk_popover_set_offset(popover, 4, 8);
  58. gtk_popover_get_offset(popover, x, y);
  59. IF (x # 4) OR (y # 8) THEN
  60. printf("popover offset wrong\n");
  61. ok := FALSE
  62. END;
  63. button := gtk_button_new_with_label("Open");
  64. gtk_widget_set_parent(popover, button);
  65. IF gtk_widget_get_parent(popover) # button THEN
  66. printf("popover parent wrong\n");
  67. ok := FALSE
  68. END;
  69. menu := g_menu_new();
  70. g_menu_append(menu, "Item", "app.quit");
  71. pm := gtk_popover_menu_new_from_model(menu);
  72. IF gtk_popover_menu_get_menu_model(pm) # menu THEN ok := FALSE END;
  73. gtk_popover_menu_set_flags(pm, GtkPopoverMenuNested);
  74. IF gtk_popover_menu_get_flags(pm) # GtkPopoverMenuNested THEN ok := FALSE END;
  75. mb := gtk_menu_button_new();
  76. gtk_menu_button_set_popover(mb, pm);
  77. IF gtk_menu_button_get_popover(mb) # pm THEN
  78. printf("menu button popover wrong\n");
  79. ok := FALSE
  80. END;
  81. box := gtk_box_new(GtkVertical, 6);
  82. gtk_box_append(box, button);
  83. gtk_box_append(box, mb);
  84. window := gtk_application_window_new(application);
  85. gtk_window_set_child(window, box);
  86. gtk_window_present(window);
  87. passed := ok;
  88. g_timeout_add(300, AfterMap, NIL)
  89. END OnActivate;
  90. VAR
  91. rc: INTEGER;
  92. BEGIN
  93. passed := FALSE;
  94. app := gtk_application_new(AppId, 0);
  95. IF app = NIL THEN
  96. printf("test_popover: FAIL (no app)\n");
  97. HALT(1)
  98. END;
  99. Connect(app, "activate", ADR(OnActivate), NIL);
  100. rc := g_application_run(app, 0, NIL);
  101. IF passed THEN
  102. printf("test_popover: PASS\n");
  103. HALT(0)
  104. ELSE
  105. printf("test_popover: FAIL\n");
  106. HALT(1)
  107. END
  108. END test_popover.