| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- MODULE inputs ;
- (*
- m2-GTK4 example - a small form built from the input widgets.
- GtkEntry + GtkCheckButton + GtkSwitch + GtkScale, with signal
- handlers that rebuild a status label on every change. Demonstrates
- Connect(), CStrToM2(), StrAppend() and IntToStr() together.
- Build: make examples
- Run: ./build/examples/inputs
- *)
- 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 GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
- FROM GtkEnums IMPORT GtkVertical, GtkHorizontal;
- FROM GtkWidget IMPORT gtk_widget_set_margin_top, gtk_widget_set_margin_bottom,
- gtk_widget_set_margin_start, gtk_widget_set_margin_end;
- FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
- FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text;
- FROM GtkEditable IMPORT gtk_editable_get_text;
- FROM GtkCheckButton IMPORT gtk_check_button_new_with_label,
- gtk_check_button_get_active;
- FROM GtkSwitch IMPORT gtk_switch_new, gtk_switch_get_active;
- FROM GtkScale IMPORT gtk_scale_new_with_range, gtk_scale_set_digits;
- FROM GtkRange IMPORT gtk_range_get_value;
- FROM GtkUtils IMPORT Connect, CStrToM2, StrAppend, IntToStr;
- FROM SYSTEM IMPORT ADDRESS, ADR;
- FROM libc IMPORT printf;
- CONST
- AppId = "org.example.m2gtk4.Inputs";
- VAR
- entry, check, sw, scale, status: ADDRESS;
- PROCEDURE UpdateStatus;
- VAR
- name: ARRAY [0..63] OF CHAR;
- value: ARRAY [0..31] OF CHAR;
- line: ARRAY [0..191] OF CHAR;
- BEGIN
- line[0] := 0C;
- StrAppend(line, "name: ");
- CStrToM2(gtk_editable_get_text(entry), name);
- IF name[0] = 0C THEN
- StrAppend(line, "(empty)")
- ELSE
- StrAppend(line, name)
- END;
- StrAppend(line, " feature: ");
- IF gtk_check_button_get_active(check) # 0 THEN
- StrAppend(line, "on")
- ELSE
- StrAppend(line, "off")
- END;
- StrAppend(line, " switch: ");
- IF gtk_switch_get_active(sw) # 0 THEN
- StrAppend(line, "on")
- ELSE
- StrAppend(line, "off")
- END;
- StrAppend(line, " value: ");
- IntToStr(TRUNC(gtk_range_get_value(scale)), value);
- StrAppend(line, value);
- gtk_label_set_text(status, line)
- END UpdateStatus;
- PROCEDURE OnEntryChanged (editable: ADDRESS; data: ADDRESS);
- BEGIN
- UpdateStatus
- END OnEntryChanged;
- PROCEDURE OnToggled (button: ADDRESS; data: ADDRESS);
- BEGIN
- UpdateStatus
- END OnToggled;
- (* void notify(GObject *obj, GParamSpec *pspec, gpointer data) *)
- PROCEDURE OnSwitchNotify (obj: ADDRESS; pspec: ADDRESS; data: ADDRESS);
- BEGIN
- UpdateStatus
- END OnSwitchNotify;
- PROCEDURE OnScaleChanged (range: ADDRESS; data: ADDRESS);
- BEGIN
- UpdateStatus
- END OnScaleChanged;
- PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
- VAR
- window, box: ADDRESS;
- BEGIN
- box := gtk_box_new(GtkVertical, 10);
- gtk_box_set_spacing(box, 10);
- gtk_widget_set_margin_top(box, 14);
- gtk_widget_set_margin_bottom(box, 14);
- gtk_widget_set_margin_start(box, 14);
- gtk_widget_set_margin_end(box, 14);
- entry := gtk_entry_new();
- gtk_entry_set_placeholder_text(entry, "type your name");
- Connect(entry, "changed", ADR(OnEntryChanged), NIL);
- gtk_box_append(box, entry);
- check := gtk_check_button_new_with_label("Enable feature");
- Connect(check, "toggled", ADR(OnToggled), NIL);
- gtk_box_append(box, check);
- sw := gtk_switch_new();
- Connect(sw, "notify::active", ADR(OnSwitchNotify), NIL);
- gtk_box_append(box, sw);
- scale := gtk_scale_new_with_range(GtkHorizontal, 0.0, 100.0, 1.0);
- gtk_scale_set_digits(scale, 0);
- Connect(scale, "value-changed", ADR(OnScaleChanged), NIL);
- gtk_box_append(box, scale);
- status := gtk_label_new(" ");
- gtk_box_append(box, status);
- window := gtk_application_window_new(application);
- gtk_window_set_title(window, "m2-GTK4 Inputs");
- gtk_window_set_default_size(window, 460, 240);
- gtk_window_set_child(window, box);
- gtk_window_present(window);
- UpdateStatus
- 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;
- Connect(app, "activate", ADR(OnActivate), NIL);
- g_application_run(app, 0, NIL)
- END inputs.
|