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