| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- MODULE layouts ;
- (*
- m2-GTK4 example - the second container batch.
- A GtkPaned splits the window:
- start - a GtkFrame containing a GtkExpander
- end - a GtkOverlay whose main child is a GtkListBox, with a
- corner label on top
- Activating a list row updates the status label underneath.
- Build: make examples
- Run: ./build/examples/layouts
- *)
- 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, GtkHorizontal, GtkAlignEnd, GtkAlignStart,
- GtkSelectionSingle;
- FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
- FROM GtkWidget IMPORT gtk_widget_set_vexpand, gtk_widget_set_halign,
- gtk_widget_set_valign, gtk_widget_set_margin_top,
- gtk_widget_set_margin_end;
- FROM GtkFrame IMPORT gtk_frame_new, gtk_frame_set_child;
- FROM GtkExpander IMPORT gtk_expander_new, gtk_expander_set_child,
- gtk_expander_set_expanded;
- FROM GtkPaned IMPORT gtk_paned_new, gtk_paned_set_start_child,
- gtk_paned_set_end_child, gtk_paned_set_position;
- FROM GtkOverlay IMPORT gtk_overlay_new, gtk_overlay_set_child,
- gtk_overlay_add_overlay;
- FROM GtkListBox IMPORT gtk_list_box_new, gtk_list_box_append,
- gtk_list_box_row_new, gtk_list_box_row_set_child,
- gtk_list_box_row_get_index, gtk_list_box_set_selection_mode;
- FROM GtkClosures IMPORT Connect2, Connect3;
- FROM GtkUtils IMPORT IntToStr, StrAppend;
- FROM SYSTEM IMPORT ADDRESS;
- FROM libc IMPORT printf;
- CONST
- AppId = "org.example.m2gtk4.Layouts";
- VAR
- status: ADDRESS;
- (* 3-argument: "row-activated" carries the GtkListBoxRow *)
- PROCEDURE OnRowActivated (listbox: ADDRESS; row: ADDRESS; user: ADDRESS);
- VAR
- buf: ARRAY [0..15] OF CHAR;
- line: ARRAY [0..63] OF CHAR;
- BEGIN
- line[0] := 0C;
- StrAppend(line, "activated row ");
- IntToStr(gtk_list_box_row_get_index(row), buf);
- StrAppend(line, buf);
- gtk_label_set_text(status, line)
- END OnRowActivated;
- PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
- VAR
- window, box, paned, frame, expander, overlay, overlayLabel,
- listbox, row: ADDRESS;
- i: INTEGER;
- text: ARRAY [0..15] OF CHAR;
- BEGIN
- status := gtk_label_new("Select a row");
- (* start pane: frame > expander > label *)
- expander := gtk_expander_new("Details");
- gtk_expander_set_child(expander, gtk_label_new("Collapsible content"));
- gtk_expander_set_expanded(expander, 1);
- frame := gtk_frame_new("Left pane");
- gtk_frame_set_child(frame, expander);
- (* end pane: overlay > list box, plus a top-right corner label *)
- listbox := gtk_list_box_new();
- gtk_list_box_set_selection_mode(listbox, GtkSelectionSingle);
- FOR i := 0 TO 4 DO
- IntToStr(i, text);
- row := gtk_list_box_row_new();
- gtk_list_box_row_set_child(row, gtk_label_new(text));
- gtk_list_box_append(listbox, row)
- END;
- overlayLabel := gtk_label_new("overlay");
- overlay := gtk_overlay_new();
- gtk_overlay_set_child(overlay, listbox);
- gtk_overlay_add_overlay(overlay, overlayLabel);
- gtk_widget_set_halign(overlayLabel, GtkAlignEnd);
- gtk_widget_set_valign(overlayLabel, GtkAlignStart);
- gtk_widget_set_margin_top(overlayLabel, 8);
- gtk_widget_set_margin_end(overlayLabel, 8);
- paned := gtk_paned_new(GtkHorizontal);
- gtk_paned_set_start_child(paned, frame);
- gtk_paned_set_end_child(paned, overlay);
- gtk_paned_set_position(paned, 180);
- gtk_widget_set_vexpand(paned, 1);
- Connect3(listbox, "row-activated", OnRowActivated, NIL);
- box := gtk_box_new(GtkVertical, 8);
- gtk_box_append(box, paned);
- gtk_box_append(box, status);
- window := gtk_application_window_new(application);
- gtk_window_set_title(window, "m2-GTK4 Layouts");
- gtk_window_set_default_size(window, 520, 340);
- 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 layouts.
|