MODULE views ; (* m2-GTK4 example - model-backed views. One GListStore of strings feeds three views in a GtkNotebook: List - GtkListView with a GtkSingleSelection; the selected item is reported in a status label ("notify::selected") Grid - GtkGridView (display only) Columns - GtkColumnView with "Name" and "#" columns Build: make examples Run: ./build/examples/views *) FROM Gio IMPORT g_application_run; FROM GtkApplication IMPORT gtk_application_new; FROM GtkApplicationWindow IMPORT gtk_application_window_new; FROM GtkWindow IMPORT gtk_window_set_title, 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 GtkNotebook IMPORT gtk_notebook_new, gtk_notebook_append_page; FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text; FROM GtkScrolledWindow IMPORT gtk_scrolled_window_new, gtk_scrolled_window_set_child; FROM GListStore IMPORT g_list_store_new, g_list_store_append; FROM GListModel IMPORT g_list_model_get_item; 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, gtk_column_view_cell_get_position; FROM GtkSingleSelection IMPORT gtk_single_selection_new, gtk_single_selection_get_selected; FROM GtkNoSelection IMPORT gtk_no_selection_new; FROM GtkListView IMPORT gtk_list_view_new; FROM GtkGridView IMPORT gtk_grid_view_new, gtk_grid_view_set_max_columns; FROM GtkColumnView IMPORT gtk_column_view_new, gtk_column_view_append_column; FROM GtkColumnViewColumn IMPORT gtk_column_view_column_new; FROM GObject IMPORT g_object_unref; FROM GtkClosures IMPORT Connect2, Connect3; FROM GtkUtils IMPORT CStrToM2, StrAppend, IntToStr; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Views"; InvalidListPosition = 0FFFFFFFFH; VAR store, selection, status: ADDRESS; (* --- list / grid label factory --- *) PROCEDURE RowSetup (factory: ADDRESS; item: ADDRESS; user: ADDRESS); BEGIN gtk_list_item_set_child(item, gtk_label_new("")) END RowSetup; PROCEDURE RowBind (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) END RowBind; (* --- column factories (cells) --- *) PROCEDURE CellSetup (factory: ADDRESS; cell: ADDRESS; user: ADDRESS); BEGIN gtk_column_view_cell_set_child(cell, gtk_label_new("")) END CellSetup; PROCEDURE NameBind (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) END NameBind; PROCEDURE PositionBind (factory: ADDRESS; cell: ADDRESS; user: ADDRESS); VAR child: ADDRESS; buf: ARRAY [0..15] OF CHAR; BEGIN child := gtk_column_view_cell_get_child(cell); IntToStr(gtk_column_view_cell_get_position(cell), buf); gtk_label_set_text(child, buf) END PositionBind; (* --- selection --- *) PROCEDURE OnSelected (model: ADDRESS; pspec: ADDRESS; user: ADDRESS); VAR index: CARDINAL; item: ADDRESS; buf: ARRAY [0..63] OF CHAR; line: ARRAY [0..127] OF CHAR; BEGIN line[0] := 0C; index := gtk_single_selection_get_selected(selection); IF index = InvalidListPosition THEN StrAppend(line, "Selected: (none)") ELSE StrAppend(line, "Selected: "); item := g_list_model_get_item(store, index); CStrToM2(gtk_string_object_get_string(item), buf); g_object_unref(item); StrAppend(line, buf) END; gtk_label_set_text(status, line) END OnSelected; PROCEDURE Scrolled (child: ADDRESS) : ADDRESS; VAR sw: ADDRESS; BEGIN sw := gtk_scrolled_window_new(); gtk_scrolled_window_set_child(sw, child); RETURN sw END Scrolled; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, notebook, factory, colFactory, listView, gridView, columnView, nameColumn, posColumn: ADDRESS; BEGIN store := g_list_store_new(gtk_string_object_get_type()); g_list_store_append(store, gtk_string_object_new("Apple")); g_list_store_append(store, gtk_string_object_new("Banana")); g_list_store_append(store, gtk_string_object_new("Cherry")); g_list_store_append(store, gtk_string_object_new("Damson")); g_list_store_append(store, gtk_string_object_new("Elderberry")); factory := gtk_signal_list_item_factory_new(); Connect3(factory, "setup", RowSetup, NIL); Connect3(factory, "bind", RowBind, NIL); colFactory := gtk_signal_list_item_factory_new(); Connect3(colFactory, "setup", CellSetup, NIL); Connect3(colFactory, "bind", NameBind, NIL); (* list page *) selection := gtk_single_selection_new(store); Connect3(selection, "notify::selected", OnSelected, NIL); listView := gtk_list_view_new(selection, factory); (* grid page *) gridView := gtk_grid_view_new(gtk_no_selection_new(store), factory); gtk_grid_view_set_max_columns(gridView, 3); (* columns page *) columnView := gtk_column_view_new(gtk_no_selection_new(store)); nameColumn := gtk_column_view_column_new("Name", colFactory); posColumn := gtk_column_view_column_new("#", factory); gtk_column_view_append_column(columnView, nameColumn); gtk_column_view_append_column(columnView, posColumn); notebook := gtk_notebook_new(); gtk_notebook_append_page(notebook, Scrolled(listView), gtk_label_new("List")); gtk_notebook_append_page(notebook, Scrolled(gridView), gtk_label_new("Grid")); gtk_notebook_append_page(notebook, Scrolled(columnView), gtk_label_new("Columns")); status := gtk_label_new("Selected: (none)"); box := gtk_box_new(GtkVertical, 8); gtk_box_append(box, notebook); gtk_box_append(box, status); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Views"); gtk_window_set_default_size(window, 460, 360); gtk_window_set_child(window, box); gtk_window_present(window) END OnActivate; VAR app: ADDRESS; BEGIN app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("gtk_application_new failed\n"); HALT(1) END; Connect2(app, "activate", OnActivate, NIL); g_application_run(app, 0, NIL) END views.