MODULE test_views ; (* m2-GTK4 test - model-backed views. Builds a GListStore of strings, a signal factory, a single-selection model, and GtkListView / GtkGridView / GtkColumnView. The window is presented, and a timeout (run from the main loop) checks that the factory "setup"/"bind" callbacks actually fired. Requires a display. *) FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_default_size, gtk_window_set_child, gtk_window_present; FROM GtkBox IMPORT gtk_box_new, gtk_box_append; FROM GtkEnums IMPORT GtkVertical; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text; FROM GListStore IMPORT g_list_store_new, g_list_store_append; FROM GtkStringObject IMPORT gtk_string_object_new, gtk_string_object_get_string, gtk_string_object_get_type; FROM GtkSignalListItemFactory IMPORT gtk_signal_list_item_factory_new; FROM GtkListItem IMPORT gtk_list_item_get_item, gtk_list_item_get_child, gtk_list_item_set_child; FROM GtkColumnViewCell IMPORT gtk_column_view_cell_get_item, gtk_column_view_cell_get_child, gtk_column_view_cell_set_child; FROM GtkSingleSelection IMPORT gtk_single_selection_new, gtk_single_selection_get_model, gtk_single_selection_set_selected, gtk_single_selection_get_selected; FROM GtkNoSelection IMPORT gtk_no_selection_new; FROM GtkListView IMPORT gtk_list_view_new, gtk_list_view_get_model, gtk_list_view_get_factory; FROM GtkGridView IMPORT gtk_grid_view_new, gtk_grid_view_set_max_columns, gtk_grid_view_get_max_columns; FROM GtkColumnView IMPORT gtk_column_view_new, gtk_column_view_append_column; FROM GtkColumnViewColumn IMPORT gtk_column_view_column_new, gtk_column_view_column_get_title; FROM GtkClosures IMPORT Connect3; FROM GtkUtils IMPORT Connect, CStrToM2; FROM GLib IMPORT g_timeout_add, GSourceRemove; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestViews"; VAR app: ADDRESS; passed: BOOLEAN; bound: BOOLEAN; boundCount: INTEGER; cellBound: BOOLEAN; PROCEDURE OnSetup (factory: ADDRESS; item: ADDRESS; user: ADDRESS); BEGIN gtk_list_item_set_child(item, gtk_label_new("")) END OnSetup; PROCEDURE OnBind (factory: ADDRESS; item: ADDRESS; user: ADDRESS); VAR obj, child: ADDRESS; buf: ARRAY [0..63] OF CHAR; BEGIN obj := gtk_list_item_get_item(item); CStrToM2(gtk_string_object_get_string(obj), buf); child := gtk_list_item_get_child(item); gtk_label_set_text(child, buf); bound := TRUE; INC(boundCount) END OnBind; PROCEDURE ColSetup (factory: ADDRESS; cell: ADDRESS; user: ADDRESS); BEGIN gtk_column_view_cell_set_child(cell, gtk_label_new("")) END ColSetup; PROCEDURE ColBind (factory: ADDRESS; cell: ADDRESS; user: ADDRESS); VAR obj, child: ADDRESS; buf: ARRAY [0..63] OF CHAR; BEGIN obj := gtk_column_view_cell_get_item(cell); CStrToM2(gtk_string_object_get_string(obj), buf); child := gtk_column_view_cell_get_child(cell); gtk_label_set_text(child, buf); cellBound := TRUE END ColBind; PROCEDURE AfterMap (user: ADDRESS) : INTEGER; BEGIN IF NOT bound THEN printf("list factory never bound\n"); passed := FALSE END; IF boundCount < 1 THEN passed := FALSE END; IF NOT cellBound THEN printf("column factory never bound\n"); passed := FALSE END; g_application_quit(app); RETURN GSourceRemove END AfterMap; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, store, factory, colFactory, sel, listView, gridView, columnView, column: ADDRESS; buf: ARRAY [0..63] OF CHAR; ok: BOOLEAN; BEGIN ok := TRUE; bound := FALSE; boundCount := 0; cellBound := FALSE; store := g_list_store_new(gtk_string_object_get_type()); g_list_store_append(store, gtk_string_object_new("Alpha")); g_list_store_append(store, gtk_string_object_new("Beta")); g_list_store_append(store, gtk_string_object_new("Gamma")); factory := gtk_signal_list_item_factory_new(); Connect3(factory, "setup", OnSetup, NIL); Connect3(factory, "bind", OnBind, NIL); colFactory := gtk_signal_list_item_factory_new(); Connect3(colFactory, "setup", ColSetup, NIL); Connect3(colFactory, "bind", ColBind, NIL); sel := gtk_single_selection_new(store); IF gtk_single_selection_get_model(sel) # store THEN printf("single selection model wrong\n"); ok := FALSE END; gtk_single_selection_set_selected(sel, 1); IF gtk_single_selection_get_selected(sel) # 1 THEN printf("single selection index wrong\n"); ok := FALSE END; listView := gtk_list_view_new(sel, factory); IF gtk_list_view_get_model(listView) # sel THEN printf("list view model wrong\n"); ok := FALSE END; IF gtk_list_view_get_factory(listView) # factory THEN printf("list view factory wrong\n"); ok := FALSE END; gridView := gtk_grid_view_new(gtk_no_selection_new(store), factory); gtk_grid_view_set_max_columns(gridView, 3); IF gtk_grid_view_get_max_columns(gridView) # 3 THEN printf("grid max columns wrong\n"); ok := FALSE END; columnView := gtk_column_view_new(gtk_no_selection_new(store)); column := gtk_column_view_column_new("Name", colFactory); CStrToM2(gtk_column_view_column_get_title(column), buf); IF (buf[0] # 'N') OR (buf[4] # 0C) THEN printf("column title wrong: [%s]\n", buf); ok := FALSE END; gtk_column_view_append_column(columnView, column); box := gtk_box_new(GtkVertical, 6); gtk_box_append(box, listView); gtk_box_append(box, gridView); gtk_box_append(box, columnView); window := gtk_application_window_new(application); gtk_window_set_default_size(window, 400, 420); gtk_window_set_child(window, box); gtk_window_present(window); passed := ok; g_timeout_add(400, AfterMap, NIL) END OnActivate; VAR rc: INTEGER; BEGIN passed := FALSE; app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("test_views: FAIL (no app)\n"); HALT(1) END; Connect(app, "activate", ADR(OnActivate), NIL); rc := g_application_run(app, 0, NIL); IF passed THEN printf("test_views: PASS\n"); HALT(0) ELSE printf("test_views: FAIL\n"); HALT(1) END END test_views.