| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- 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.
|