test_views.mod 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. MODULE test_views ;
  2. (*
  3. m2-GTK4 test - model-backed views.
  4. Builds a GListStore of strings, a signal factory, a single-selection
  5. model, and GtkListView / GtkGridView / GtkColumnView. The window is
  6. presented, and a timeout (run from the main loop) checks that the
  7. factory "setup"/"bind" callbacks actually fired. Requires a display.
  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_default_size,
  12. gtk_window_set_child, gtk_window_present;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  14. FROM GtkEnums IMPORT GtkVertical;
  15. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  16. FROM GListStore IMPORT g_list_store_new, g_list_store_append;
  17. FROM GtkStringObject IMPORT gtk_string_object_new,
  18. gtk_string_object_get_string, gtk_string_object_get_type;
  19. FROM GtkSignalListItemFactory IMPORT gtk_signal_list_item_factory_new;
  20. FROM GtkListItem IMPORT gtk_list_item_get_item, gtk_list_item_get_child,
  21. gtk_list_item_set_child;
  22. FROM GtkColumnViewCell IMPORT gtk_column_view_cell_get_item,
  23. gtk_column_view_cell_get_child, gtk_column_view_cell_set_child;
  24. FROM GtkSingleSelection IMPORT gtk_single_selection_new,
  25. gtk_single_selection_get_model, gtk_single_selection_set_selected,
  26. gtk_single_selection_get_selected;
  27. FROM GtkNoSelection IMPORT gtk_no_selection_new;
  28. FROM GtkListView IMPORT gtk_list_view_new, gtk_list_view_get_model,
  29. gtk_list_view_get_factory;
  30. FROM GtkGridView IMPORT gtk_grid_view_new, gtk_grid_view_set_max_columns,
  31. gtk_grid_view_get_max_columns;
  32. FROM GtkColumnView IMPORT gtk_column_view_new, gtk_column_view_append_column;
  33. FROM GtkColumnViewColumn IMPORT gtk_column_view_column_new,
  34. gtk_column_view_column_get_title;
  35. FROM GtkClosures IMPORT Connect3;
  36. FROM GtkUtils IMPORT Connect, CStrToM2;
  37. FROM GLib IMPORT g_timeout_add, GSourceRemove;
  38. FROM SYSTEM IMPORT ADDRESS, ADR;
  39. FROM libc IMPORT printf;
  40. CONST
  41. AppId = "org.example.m2gtk4.TestViews";
  42. VAR
  43. app: ADDRESS;
  44. passed: BOOLEAN;
  45. bound: BOOLEAN;
  46. boundCount: INTEGER;
  47. cellBound: BOOLEAN;
  48. PROCEDURE OnSetup (factory: ADDRESS; item: ADDRESS; user: ADDRESS);
  49. BEGIN
  50. gtk_list_item_set_child(item, gtk_label_new(""))
  51. END OnSetup;
  52. PROCEDURE OnBind (factory: ADDRESS; item: ADDRESS; user: ADDRESS);
  53. VAR
  54. obj, child: ADDRESS;
  55. buf: ARRAY [0..63] OF CHAR;
  56. BEGIN
  57. obj := gtk_list_item_get_item(item);
  58. CStrToM2(gtk_string_object_get_string(obj), buf);
  59. child := gtk_list_item_get_child(item);
  60. gtk_label_set_text(child, buf);
  61. bound := TRUE;
  62. INC(boundCount)
  63. END OnBind;
  64. PROCEDURE ColSetup (factory: ADDRESS; cell: ADDRESS; user: ADDRESS);
  65. BEGIN
  66. gtk_column_view_cell_set_child(cell, gtk_label_new(""))
  67. END ColSetup;
  68. PROCEDURE ColBind (factory: ADDRESS; cell: ADDRESS; user: ADDRESS);
  69. VAR
  70. obj, child: ADDRESS;
  71. buf: ARRAY [0..63] OF CHAR;
  72. BEGIN
  73. obj := gtk_column_view_cell_get_item(cell);
  74. CStrToM2(gtk_string_object_get_string(obj), buf);
  75. child := gtk_column_view_cell_get_child(cell);
  76. gtk_label_set_text(child, buf);
  77. cellBound := TRUE
  78. END ColBind;
  79. PROCEDURE AfterMap (user: ADDRESS) : INTEGER;
  80. BEGIN
  81. IF NOT bound THEN
  82. printf("list factory never bound\n");
  83. passed := FALSE
  84. END;
  85. IF boundCount < 1 THEN passed := FALSE END;
  86. IF NOT cellBound THEN
  87. printf("column factory never bound\n");
  88. passed := FALSE
  89. END;
  90. g_application_quit(app);
  91. RETURN GSourceRemove
  92. END AfterMap;
  93. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  94. VAR
  95. window, box, store, factory, colFactory, sel, listView, gridView,
  96. columnView, column: ADDRESS;
  97. buf: ARRAY [0..63] OF CHAR;
  98. ok: BOOLEAN;
  99. BEGIN
  100. ok := TRUE;
  101. bound := FALSE;
  102. boundCount := 0;
  103. cellBound := FALSE;
  104. store := g_list_store_new(gtk_string_object_get_type());
  105. g_list_store_append(store, gtk_string_object_new("Alpha"));
  106. g_list_store_append(store, gtk_string_object_new("Beta"));
  107. g_list_store_append(store, gtk_string_object_new("Gamma"));
  108. factory := gtk_signal_list_item_factory_new();
  109. Connect3(factory, "setup", OnSetup, NIL);
  110. Connect3(factory, "bind", OnBind, NIL);
  111. colFactory := gtk_signal_list_item_factory_new();
  112. Connect3(colFactory, "setup", ColSetup, NIL);
  113. Connect3(colFactory, "bind", ColBind, NIL);
  114. sel := gtk_single_selection_new(store);
  115. IF gtk_single_selection_get_model(sel) # store THEN
  116. printf("single selection model wrong\n");
  117. ok := FALSE
  118. END;
  119. gtk_single_selection_set_selected(sel, 1);
  120. IF gtk_single_selection_get_selected(sel) # 1 THEN
  121. printf("single selection index wrong\n");
  122. ok := FALSE
  123. END;
  124. listView := gtk_list_view_new(sel, factory);
  125. IF gtk_list_view_get_model(listView) # sel THEN
  126. printf("list view model wrong\n");
  127. ok := FALSE
  128. END;
  129. IF gtk_list_view_get_factory(listView) # factory THEN
  130. printf("list view factory wrong\n");
  131. ok := FALSE
  132. END;
  133. gridView := gtk_grid_view_new(gtk_no_selection_new(store), factory);
  134. gtk_grid_view_set_max_columns(gridView, 3);
  135. IF gtk_grid_view_get_max_columns(gridView) # 3 THEN
  136. printf("grid max columns wrong\n");
  137. ok := FALSE
  138. END;
  139. columnView := gtk_column_view_new(gtk_no_selection_new(store));
  140. column := gtk_column_view_column_new("Name", colFactory);
  141. CStrToM2(gtk_column_view_column_get_title(column), buf);
  142. IF (buf[0] # 'N') OR (buf[4] # 0C) THEN
  143. printf("column title wrong: [%s]\n", buf);
  144. ok := FALSE
  145. END;
  146. gtk_column_view_append_column(columnView, column);
  147. box := gtk_box_new(GtkVertical, 6);
  148. gtk_box_append(box, listView);
  149. gtk_box_append(box, gridView);
  150. gtk_box_append(box, columnView);
  151. window := gtk_application_window_new(application);
  152. gtk_window_set_default_size(window, 400, 420);
  153. gtk_window_set_child(window, box);
  154. gtk_window_present(window);
  155. passed := ok;
  156. g_timeout_add(400, AfterMap, NIL)
  157. END OnActivate;
  158. VAR
  159. rc: INTEGER;
  160. BEGIN
  161. passed := FALSE;
  162. app := gtk_application_new(AppId, 0);
  163. IF app = NIL THEN
  164. printf("test_views: FAIL (no app)\n");
  165. HALT(1)
  166. END;
  167. Connect(app, "activate", ADR(OnActivate), NIL);
  168. rc := g_application_run(app, 0, NIL);
  169. IF passed THEN
  170. printf("test_views: PASS\n");
  171. HALT(0)
  172. ELSE
  173. printf("test_views: FAIL\n");
  174. HALT(1)
  175. END
  176. END test_views.