layouts.mod 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. MODULE layouts ;
  2. (*
  3. m2-GTK4 example - the second container batch.
  4. A GtkPaned splits the window:
  5. start - a GtkFrame containing a GtkExpander
  6. end - a GtkOverlay whose main child is a GtkListBox, with a
  7. corner label on top
  8. Activating a list row updates the status label underneath.
  9. Build: make examples
  10. Run: ./build/examples/layouts
  11. *)
  12. FROM Gio IMPORT g_application_run;
  13. FROM GtkApplication IMPORT gtk_application_new;
  14. FROM GtkApplicationWindow IMPORT gtk_application_window_new;
  15. FROM GtkWindow IMPORT gtk_window_set_title, gtk_window_set_default_size,
  16. gtk_window_set_child, gtk_window_present;
  17. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  18. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal, GtkAlignEnd, GtkAlignStart,
  19. GtkSelectionSingle;
  20. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  21. FROM GtkWidget IMPORT gtk_widget_set_vexpand, gtk_widget_set_halign,
  22. gtk_widget_set_valign, gtk_widget_set_margin_top,
  23. gtk_widget_set_margin_end;
  24. FROM GtkFrame IMPORT gtk_frame_new, gtk_frame_set_child;
  25. FROM GtkExpander IMPORT gtk_expander_new, gtk_expander_set_child,
  26. gtk_expander_set_expanded;
  27. FROM GtkPaned IMPORT gtk_paned_new, gtk_paned_set_start_child,
  28. gtk_paned_set_end_child, gtk_paned_set_position;
  29. FROM GtkOverlay IMPORT gtk_overlay_new, gtk_overlay_set_child,
  30. gtk_overlay_add_overlay;
  31. FROM GtkListBox IMPORT gtk_list_box_new, gtk_list_box_append,
  32. gtk_list_box_row_new, gtk_list_box_row_set_child,
  33. gtk_list_box_row_get_index, gtk_list_box_set_selection_mode;
  34. FROM GtkClosures IMPORT Connect2, Connect3;
  35. FROM GtkUtils IMPORT IntToStr, StrAppend;
  36. FROM SYSTEM IMPORT ADDRESS;
  37. FROM libc IMPORT printf;
  38. CONST
  39. AppId = "org.example.m2gtk4.Layouts";
  40. VAR
  41. status: ADDRESS;
  42. (* 3-argument: "row-activated" carries the GtkListBoxRow *)
  43. PROCEDURE OnRowActivated (listbox: ADDRESS; row: ADDRESS; user: ADDRESS);
  44. VAR
  45. buf: ARRAY [0..15] OF CHAR;
  46. line: ARRAY [0..63] OF CHAR;
  47. BEGIN
  48. line[0] := 0C;
  49. StrAppend(line, "activated row ");
  50. IntToStr(gtk_list_box_row_get_index(row), buf);
  51. StrAppend(line, buf);
  52. gtk_label_set_text(status, line)
  53. END OnRowActivated;
  54. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  55. VAR
  56. window, box, paned, frame, expander, overlay, overlayLabel,
  57. listbox, row: ADDRESS;
  58. i: INTEGER;
  59. text: ARRAY [0..15] OF CHAR;
  60. BEGIN
  61. status := gtk_label_new("Select a row");
  62. (* start pane: frame > expander > label *)
  63. expander := gtk_expander_new("Details");
  64. gtk_expander_set_child(expander, gtk_label_new("Collapsible content"));
  65. gtk_expander_set_expanded(expander, 1);
  66. frame := gtk_frame_new("Left pane");
  67. gtk_frame_set_child(frame, expander);
  68. (* end pane: overlay > list box, plus a top-right corner label *)
  69. listbox := gtk_list_box_new();
  70. gtk_list_box_set_selection_mode(listbox, GtkSelectionSingle);
  71. FOR i := 0 TO 4 DO
  72. IntToStr(i, text);
  73. row := gtk_list_box_row_new();
  74. gtk_list_box_row_set_child(row, gtk_label_new(text));
  75. gtk_list_box_append(listbox, row)
  76. END;
  77. overlayLabel := gtk_label_new("overlay");
  78. overlay := gtk_overlay_new();
  79. gtk_overlay_set_child(overlay, listbox);
  80. gtk_overlay_add_overlay(overlay, overlayLabel);
  81. gtk_widget_set_halign(overlayLabel, GtkAlignEnd);
  82. gtk_widget_set_valign(overlayLabel, GtkAlignStart);
  83. gtk_widget_set_margin_top(overlayLabel, 8);
  84. gtk_widget_set_margin_end(overlayLabel, 8);
  85. paned := gtk_paned_new(GtkHorizontal);
  86. gtk_paned_set_start_child(paned, frame);
  87. gtk_paned_set_end_child(paned, overlay);
  88. gtk_paned_set_position(paned, 180);
  89. gtk_widget_set_vexpand(paned, 1);
  90. Connect3(listbox, "row-activated", OnRowActivated, NIL);
  91. box := gtk_box_new(GtkVertical, 8);
  92. gtk_box_append(box, paned);
  93. gtk_box_append(box, status);
  94. window := gtk_application_window_new(application);
  95. gtk_window_set_title(window, "m2-GTK4 Layouts");
  96. gtk_window_set_default_size(window, 520, 340);
  97. gtk_window_set_child(window, box);
  98. gtk_window_present(window)
  99. END OnActivate;
  100. VAR
  101. app: ADDRESS;
  102. BEGIN
  103. app := gtk_application_new(AppId, 0);
  104. IF app = NIL THEN
  105. printf("gtk_application_new failed\n");
  106. HALT(1)
  107. END;
  108. Connect2(app, "activate", OnActivate, NIL);
  109. g_application_run(app, 0, NIL)
  110. END layouts.