| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- MODULE customlayout ;
- (*
- m2-GTK4 example - a custom layout manager from Modula-2.
- The shim's M2LayoutManager positions the parent's children in a
- single column using the Modula-2 measure/allocate callbacks.
- Build: make examples
- Run: ./build/examples/customlayout
- *)
- FROM Gio IMPORT g_application_run;
- FROM GtkApplication IMPORT gtk_application_new;
- FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
- gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
- FROM GtkLabel IMPORT gtk_label_new;
- FROM GtkWidget IMPORT gtk_widget_set_parent, gtk_widget_get_first_child,
- gtk_widget_get_next_sibling, gtk_widget_set_layout_manager;
- FROM M2GtkShim IMPORT m2_gtk_widget_new, m2_layout_manager_new,
- m2_layout_allocate_child;
- FROM GtkClosures IMPORT Connect2;
- FROM SYSTEM IMPORT ADDRESS, ADR;
- FROM libc IMPORT printf;
- CONST
- AppId = "org.example.m2gtk4.CustomLayout";
- RowHeight = 36;
- PROCEDURE Measure (widget: ADDRESS; orientation: INTEGER; for_size: INTEGER;
- VAR minimum, natural: INTEGER; user: ADDRESS);
- BEGIN
- minimum := 240;
- natural := 240
- END Measure;
- PROCEDURE Allocate (widget: ADDRESS; width, height, baseline: INTEGER;
- user: ADDRESS);
- VAR
- child: ADDRESS;
- i: INTEGER;
- BEGIN
- i := 0;
- child := gtk_widget_get_first_child(widget);
- WHILE child # NIL DO
- m2_layout_allocate_child(child, 8, i * RowHeight, width - 16,
- RowHeight - 4);
- INC(i);
- child := gtk_widget_get_next_sibling(child)
- END
- END Allocate;
- PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
- VAR
- window, parent, manager: ADDRESS;
- BEGIN
- parent := m2_gtk_widget_new(NIL, NIL, NIL);
- manager := m2_layout_manager_new(ADR(Measure), ADR(Allocate), NIL, NIL);
- gtk_widget_set_layout_manager(parent, manager);
- gtk_widget_set_parent(gtk_label_new("row one"), parent);
- gtk_widget_set_parent(gtk_label_new("row two"), parent);
- gtk_widget_set_parent(gtk_label_new("row three"), parent);
- gtk_widget_set_parent(gtk_label_new("row four"), parent);
- window := gtk_application_window_new(application);
- gtk_window_set_title(window, "m2-GTK4 Custom Layout");
- gtk_window_set_default_size(window, 300, 220);
- gtk_window_set_child(window, parent);
- 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 customlayout.
|