actions.mod 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. MODULE actions ;
  2. (*
  3. m2-GTK4 example - application actions, a menu bar and accelerators.
  4. A GtkApplicationWindow with an in-window GtkPopoverMenuBar built
  5. from a GMenu:
  6. File > New (app.new, Ctrl+N)
  7. File > Quit (app.quit, Ctrl+Q)
  8. View > Bold (win.bold, Ctrl+B, a stateful toggle)
  9. "app." actions live on the GtkApplication; "win." actions live on the
  10. GtkApplicationWindow (which implements GActionMap). Each handler
  11. updates a status label.
  12. Build: make examples
  13. Run: ./build/examples/actions
  14. *)
  15. FROM Gio IMPORT g_application_run, g_application_quit;
  16. FROM GtkApplication IMPORT gtk_application_new;
  17. FROM GtkApplicationWindow IMPORT gtk_application_window_new;
  18. FROM GtkWindow IMPORT gtk_window_set_title, gtk_window_set_default_size,
  19. gtk_window_set_child, gtk_window_present;
  20. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  21. FROM GtkEnums IMPORT GtkVertical;
  22. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  23. FROM GtkPopoverMenuBar IMPORT gtk_popover_menu_bar_new_from_model;
  24. FROM GSimpleAction IMPORT g_simple_action_new, g_simple_action_new_stateful;
  25. FROM GActionMap IMPORT g_action_map_add_action;
  26. FROM GMenu IMPORT g_menu_new, g_menu_append, g_menu_append_submenu;
  27. FROM GVariant IMPORT g_variant_new_boolean, g_variant_get_boolean;
  28. FROM GtkUtils IMPORT Connect, SetAccel;
  29. FROM SYSTEM IMPORT ADDRESS, ADR;
  30. FROM libc IMPORT printf;
  31. CONST
  32. AppId = "org.example.m2gtk4.Actions";
  33. VAR
  34. app, status: ADDRESS;
  35. PROCEDURE OnQuit (action: ADDRESS; param: ADDRESS; data: ADDRESS);
  36. BEGIN
  37. g_application_quit(app)
  38. END OnQuit;
  39. PROCEDURE OnNew (action: ADDRESS; param: ADDRESS; data: ADDRESS);
  40. BEGIN
  41. gtk_label_set_text(status, "New selected")
  42. END OnNew;
  43. (* void change_state(GSimpleAction *action, GVariant *value, gpointer data) *)
  44. PROCEDURE OnBold (action: ADDRESS; param: ADDRESS; data: ADDRESS);
  45. BEGIN
  46. IF g_variant_get_boolean(param) # 0 THEN
  47. gtk_label_set_text(status, "Bold on")
  48. ELSE
  49. gtk_label_set_text(status, "Bold off")
  50. END
  51. END OnBold;
  52. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  53. VAR
  54. window, box, bar, fileMenu, viewMenu, menubar, action: ADDRESS;
  55. BEGIN
  56. (* app-scoped actions: new, quit *)
  57. action := g_simple_action_new("new", NIL);
  58. Connect(action, "activate", ADR(OnNew), NIL);
  59. g_action_map_add_action(application, action);
  60. action := g_simple_action_new("quit", NIL);
  61. Connect(action, "activate", ADR(OnQuit), NIL);
  62. g_action_map_add_action(application, action);
  63. window := gtk_application_window_new(application);
  64. (* window-scoped stateful action: bold *)
  65. action := g_simple_action_new_stateful("bold", NIL,
  66. g_variant_new_boolean(0));
  67. Connect(action, "change-state", ADR(OnBold), NIL);
  68. g_action_map_add_action(window, action);
  69. (* menu model *)
  70. fileMenu := g_menu_new();
  71. g_menu_append(fileMenu, "New", "app.new");
  72. g_menu_append(fileMenu, "Quit", "app.quit");
  73. viewMenu := g_menu_new();
  74. g_menu_append(viewMenu, "Bold", "win.bold");
  75. menubar := g_menu_new();
  76. g_menu_append_submenu(menubar, "File", fileMenu);
  77. g_menu_append_submenu(menubar, "View", viewMenu);
  78. bar := gtk_popover_menu_bar_new_from_model(menubar);
  79. status := gtk_label_new("Ready");
  80. box := gtk_box_new(GtkVertical, 8);
  81. gtk_box_append(box, bar);
  82. gtk_box_append(box, status);
  83. (* accelerators *)
  84. SetAccel(application, "app.new", "<primary>n");
  85. SetAccel(application, "app.quit", "<primary>q");
  86. SetAccel(application, "win.bold", "<primary>b");
  87. gtk_window_set_title(window, "m2-GTK4 Actions");
  88. gtk_window_set_default_size(window, 420, 220);
  89. gtk_window_set_child(window, box);
  90. gtk_window_present(window)
  91. END OnActivate;
  92. VAR
  93. rc: INTEGER;
  94. BEGIN
  95. app := gtk_application_new(AppId, 0);
  96. IF app = NIL THEN
  97. printf("gtk_application_new failed\n");
  98. HALT(1)
  99. END;
  100. Connect(app, "activate", ADR(OnActivate), NIL);
  101. rc := g_application_run(app, 0, NIL)
  102. END actions.