views.mod 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. MODULE views ;
  2. (*
  3. m2-GTK4 example - model-backed views.
  4. One GListStore of strings feeds three views in a GtkNotebook:
  5. List - GtkListView with a GtkSingleSelection; the selected item
  6. is reported in a status label ("notify::selected")
  7. Grid - GtkGridView (display only)
  8. Columns - GtkColumnView with "Name" and "#" columns
  9. Build: make examples
  10. Run: ./build/examples/views
  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;
  19. FROM GtkNotebook IMPORT gtk_notebook_new, gtk_notebook_append_page;
  20. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  21. FROM GtkScrolledWindow IMPORT gtk_scrolled_window_new,
  22. gtk_scrolled_window_set_child;
  23. FROM GListStore IMPORT g_list_store_new, g_list_store_append;
  24. FROM GListModel IMPORT g_list_model_get_item;
  25. FROM GtkStringObject IMPORT gtk_string_object_new,
  26. gtk_string_object_get_string, gtk_string_object_get_type;
  27. FROM GtkSignalListItemFactory IMPORT gtk_signal_list_item_factory_new;
  28. FROM GtkListItem IMPORT gtk_list_item_get_item, gtk_list_item_get_child,
  29. gtk_list_item_set_child;
  30. FROM GtkColumnViewCell IMPORT gtk_column_view_cell_get_item,
  31. gtk_column_view_cell_get_child, gtk_column_view_cell_set_child,
  32. gtk_column_view_cell_get_position;
  33. FROM GtkSingleSelection IMPORT gtk_single_selection_new,
  34. gtk_single_selection_get_selected;
  35. FROM GtkNoSelection IMPORT gtk_no_selection_new;
  36. FROM GtkListView IMPORT gtk_list_view_new;
  37. FROM GtkGridView IMPORT gtk_grid_view_new, gtk_grid_view_set_max_columns;
  38. FROM GtkColumnView IMPORT gtk_column_view_new, gtk_column_view_append_column;
  39. FROM GtkColumnViewColumn IMPORT gtk_column_view_column_new;
  40. FROM GObject IMPORT g_object_unref;
  41. FROM GtkClosures IMPORT Connect2, Connect3;
  42. FROM GtkUtils IMPORT CStrToM2, StrAppend, IntToStr;
  43. FROM SYSTEM IMPORT ADDRESS, ADR;
  44. FROM libc IMPORT printf;
  45. CONST
  46. AppId = "org.example.m2gtk4.Views";
  47. InvalidListPosition = 0FFFFFFFFH;
  48. VAR
  49. store, selection, status: ADDRESS;
  50. (* --- list / grid label factory --- *)
  51. PROCEDURE RowSetup (factory: ADDRESS; item: ADDRESS; user: ADDRESS);
  52. BEGIN
  53. gtk_list_item_set_child(item, gtk_label_new(""))
  54. END RowSetup;
  55. PROCEDURE RowBind (factory: ADDRESS; item: ADDRESS; user: ADDRESS);
  56. VAR
  57. obj, child: ADDRESS;
  58. buf: ARRAY [0..63] OF CHAR;
  59. BEGIN
  60. obj := gtk_list_item_get_item(item);
  61. CStrToM2(gtk_string_object_get_string(obj), buf);
  62. child := gtk_list_item_get_child(item);
  63. gtk_label_set_text(child, buf)
  64. END RowBind;
  65. (* --- column factories (cells) --- *)
  66. PROCEDURE CellSetup (factory: ADDRESS; cell: ADDRESS; user: ADDRESS);
  67. BEGIN
  68. gtk_column_view_cell_set_child(cell, gtk_label_new(""))
  69. END CellSetup;
  70. PROCEDURE NameBind (factory: ADDRESS; cell: ADDRESS; user: ADDRESS);
  71. VAR
  72. obj, child: ADDRESS;
  73. buf: ARRAY [0..63] OF CHAR;
  74. BEGIN
  75. obj := gtk_column_view_cell_get_item(cell);
  76. CStrToM2(gtk_string_object_get_string(obj), buf);
  77. child := gtk_column_view_cell_get_child(cell);
  78. gtk_label_set_text(child, buf)
  79. END NameBind;
  80. PROCEDURE PositionBind (factory: ADDRESS; cell: ADDRESS; user: ADDRESS);
  81. VAR
  82. child: ADDRESS;
  83. buf: ARRAY [0..15] OF CHAR;
  84. BEGIN
  85. child := gtk_column_view_cell_get_child(cell);
  86. IntToStr(gtk_column_view_cell_get_position(cell), buf);
  87. gtk_label_set_text(child, buf)
  88. END PositionBind;
  89. (* --- selection --- *)
  90. PROCEDURE OnSelected (model: ADDRESS; pspec: ADDRESS; user: ADDRESS);
  91. VAR
  92. index: CARDINAL;
  93. item: ADDRESS;
  94. buf: ARRAY [0..63] OF CHAR;
  95. line: ARRAY [0..127] OF CHAR;
  96. BEGIN
  97. line[0] := 0C;
  98. index := gtk_single_selection_get_selected(selection);
  99. IF index = InvalidListPosition THEN
  100. StrAppend(line, "Selected: (none)")
  101. ELSE
  102. StrAppend(line, "Selected: ");
  103. item := g_list_model_get_item(store, index);
  104. CStrToM2(gtk_string_object_get_string(item), buf);
  105. g_object_unref(item);
  106. StrAppend(line, buf)
  107. END;
  108. gtk_label_set_text(status, line)
  109. END OnSelected;
  110. PROCEDURE Scrolled (child: ADDRESS) : ADDRESS;
  111. VAR
  112. sw: ADDRESS;
  113. BEGIN
  114. sw := gtk_scrolled_window_new();
  115. gtk_scrolled_window_set_child(sw, child);
  116. RETURN sw
  117. END Scrolled;
  118. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  119. VAR
  120. window, box, notebook, factory, colFactory, listView, gridView,
  121. columnView, nameColumn, posColumn: ADDRESS;
  122. BEGIN
  123. store := g_list_store_new(gtk_string_object_get_type());
  124. g_list_store_append(store, gtk_string_object_new("Apple"));
  125. g_list_store_append(store, gtk_string_object_new("Banana"));
  126. g_list_store_append(store, gtk_string_object_new("Cherry"));
  127. g_list_store_append(store, gtk_string_object_new("Damson"));
  128. g_list_store_append(store, gtk_string_object_new("Elderberry"));
  129. factory := gtk_signal_list_item_factory_new();
  130. Connect3(factory, "setup", RowSetup, NIL);
  131. Connect3(factory, "bind", RowBind, NIL);
  132. colFactory := gtk_signal_list_item_factory_new();
  133. Connect3(colFactory, "setup", CellSetup, NIL);
  134. Connect3(colFactory, "bind", NameBind, NIL);
  135. (* list page *)
  136. selection := gtk_single_selection_new(store);
  137. Connect3(selection, "notify::selected", OnSelected, NIL);
  138. listView := gtk_list_view_new(selection, factory);
  139. (* grid page *)
  140. gridView := gtk_grid_view_new(gtk_no_selection_new(store), factory);
  141. gtk_grid_view_set_max_columns(gridView, 3);
  142. (* columns page *)
  143. columnView := gtk_column_view_new(gtk_no_selection_new(store));
  144. nameColumn := gtk_column_view_column_new("Name", colFactory);
  145. posColumn := gtk_column_view_column_new("#", factory);
  146. gtk_column_view_append_column(columnView, nameColumn);
  147. gtk_column_view_append_column(columnView, posColumn);
  148. notebook := gtk_notebook_new();
  149. gtk_notebook_append_page(notebook, Scrolled(listView),
  150. gtk_label_new("List"));
  151. gtk_notebook_append_page(notebook, Scrolled(gridView),
  152. gtk_label_new("Grid"));
  153. gtk_notebook_append_page(notebook, Scrolled(columnView),
  154. gtk_label_new("Columns"));
  155. status := gtk_label_new("Selected: (none)");
  156. box := gtk_box_new(GtkVertical, 8);
  157. gtk_box_append(box, notebook);
  158. gtk_box_append(box, status);
  159. window := gtk_application_window_new(application);
  160. gtk_window_set_title(window, "m2-GTK4 Views");
  161. gtk_window_set_default_size(window, 460, 360);
  162. gtk_window_set_child(window, box);
  163. gtk_window_present(window)
  164. END OnActivate;
  165. VAR
  166. app: ADDRESS;
  167. BEGIN
  168. app := gtk_application_new(AppId, 0);
  169. IF app = NIL THEN
  170. printf("gtk_application_new failed\n");
  171. HALT(1)
  172. END;
  173. Connect2(app, "activate", OnActivate, NIL);
  174. g_application_run(app, 0, NIL)
  175. END views.