popover.mod 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. MODULE popover ;
  2. (*
  3. m2-GTK4 example - popovers.
  4. A button pops up a GtkPopover with some content, and a GtkMenuButton
  5. opens a GtkPopoverMenu built from a GMenu (with a working Quit item).
  6. Build: make examples
  7. Run: ./build/examples/popover
  8. *)
  9. FROM Gio IMPORT g_application_run, g_application_quit;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  12. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  14. FROM GtkEnums IMPORT GtkVertical;
  15. FROM GtkLabel IMPORT gtk_label_new;
  16. FROM GtkButton IMPORT gtk_button_new_with_label;
  17. FROM GtkPopover IMPORT gtk_popover_new, gtk_popover_set_child,
  18. gtk_popover_popup;
  19. FROM GtkPopoverMenu IMPORT gtk_popover_menu_new_from_model;
  20. FROM GtkMenuButton IMPORT gtk_menu_button_new,
  21. gtk_menu_button_set_icon_name, gtk_menu_button_set_popover;
  22. FROM GtkWidget IMPORT gtk_widget_set_parent, gtk_widget_set_margin_top,
  23. gtk_widget_set_margin_bottom, gtk_widget_set_margin_start,
  24. gtk_widget_set_margin_end;
  25. FROM GMenu IMPORT g_menu_new, g_menu_append;
  26. FROM GSimpleAction IMPORT g_simple_action_new;
  27. FROM GActionMap IMPORT g_action_map_add_action;
  28. FROM GtkClosures IMPORT Connect2;
  29. FROM GtkUtils IMPORT Connect;
  30. FROM SYSTEM IMPORT ADDRESS, ADR;
  31. FROM libc IMPORT printf;
  32. CONST
  33. AppId = "org.example.m2gtk4.Popover";
  34. VAR
  35. app, popover: ADDRESS;
  36. PROCEDURE OnQuit (action: ADDRESS; param: ADDRESS; data: ADDRESS);
  37. BEGIN
  38. g_application_quit(app)
  39. END OnQuit;
  40. PROCEDURE OnShow (button: ADDRESS; user: ADDRESS);
  41. BEGIN
  42. gtk_popover_popup(popover)
  43. END OnShow;
  44. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  45. VAR
  46. window, box, button, content, menu, menuButton, action: ADDRESS;
  47. BEGIN
  48. action := g_simple_action_new("quit", NIL);
  49. Connect(action, "activate", ADR(OnQuit), NIL);
  50. g_action_map_add_action(application, action);
  51. button := gtk_button_new_with_label("Show popover");
  52. content := gtk_label_new("Popover content");
  53. popover := gtk_popover_new();
  54. gtk_popover_set_child(popover, content);
  55. gtk_widget_set_parent(popover, button);
  56. Connect2(button, "clicked", OnShow, NIL);
  57. menu := g_menu_new();
  58. g_menu_append(menu, "Quit", "app.quit");
  59. menuButton := gtk_menu_button_new();
  60. gtk_menu_button_set_icon_name(menuButton, "open-menu-symbolic");
  61. gtk_menu_button_set_popover(menuButton,
  62. gtk_popover_menu_new_from_model(menu));
  63. box := gtk_box_new(GtkVertical, 12);
  64. gtk_box_set_spacing(box, 12);
  65. gtk_widget_set_margin_top(box, 14);
  66. gtk_widget_set_margin_bottom(box, 14);
  67. gtk_widget_set_margin_start(box, 14);
  68. gtk_widget_set_margin_end(box, 14);
  69. gtk_box_append(box, button);
  70. gtk_box_append(box, menuButton);
  71. window := gtk_application_window_new(application);
  72. gtk_window_set_title(window, "m2-GTK4 Popover");
  73. gtk_window_set_default_size(window, 360, 160);
  74. gtk_window_set_child(window, box);
  75. gtk_window_present(window)
  76. END OnActivate;
  77. BEGIN
  78. app := gtk_application_new(AppId, 0);
  79. IF app = NIL THEN
  80. printf("gtk_application_new failed\n");
  81. HALT(1)
  82. END;
  83. Connect2(app, "activate", OnActivate, NIL);
  84. g_application_run(app, 0, NIL)
  85. END popover.