MODULE richtext ;
(*
m2-GTK4 example - text extras.
A GtkTextView whose buffer is filled with Pango markup (bold/colour),
with a named mark used to scroll back to the top, plus a GtkEntry with
an attached GtkEntryCompletion.
Build: make examples
Run: ./build/examples/richtext
*)
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, GtkWrapWordChar;
FROM GtkScrolledWindow IMPORT gtk_scrolled_window_new,
gtk_scrolled_window_set_child;
FROM GtkTextView IMPORT gtk_text_view_new, gtk_text_view_get_buffer,
gtk_text_view_set_wrap_mode, gtk_text_view_set_monospace,
gtk_text_view_scroll_to_mark;
FROM GtkTextBuffer IMPORT gtk_text_buffer_get_start_iter,
gtk_text_buffer_create_mark, gtk_text_buffer_insert_markup;
FROM GtkTextIter IMPORT GtkTextIter;
FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_completion;
FROM GtkEntryCompletion IMPORT gtk_entry_completion_new,
gtk_entry_completion_set_text_column,
gtk_entry_completion_set_minimum_key_length,
gtk_entry_completion_set_popup_completion;
FROM GtkWidget IMPORT gtk_widget_set_vexpand;
FROM GtkClosures IMPORT Connect2;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM libc IMPORT printf;
CONST
AppId = "org.example.m2gtk4.RichText";
Markup = "Rich text from GNU Modula-2 - red, italic and monospace.";
PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
VAR
window, box, sw, view, buffer, entry, completion, mark: ADDRESS;
start: GtkTextIter;
BEGIN
view := gtk_text_view_new();
gtk_text_view_set_wrap_mode(view, GtkWrapWordChar);
gtk_text_view_set_monospace(view, 0);
buffer := gtk_text_view_get_buffer(view);
gtk_text_buffer_get_start_iter(buffer, start);
gtk_text_buffer_insert_markup(buffer, start, Markup, -1);
mark := gtk_text_buffer_create_mark(buffer, "top", start, 1);
gtk_text_view_scroll_to_mark(view, mark, 0.0, 0, 0.0, 0.0);
entry := gtk_entry_new();
completion := gtk_entry_completion_new();
gtk_entry_completion_set_text_column(completion, 0);
gtk_entry_completion_set_minimum_key_length(completion, 2);
gtk_entry_completion_set_popup_completion(completion, 1);
gtk_entry_set_completion(entry, completion);
sw := gtk_scrolled_window_new();
gtk_scrolled_window_set_child(sw, view);
gtk_widget_set_vexpand(sw, 1);
box := gtk_box_new(GtkVertical, 8);
gtk_box_set_spacing(box, 8);
gtk_box_append(box, entry);
gtk_box_append(box, sw);
window := gtk_application_window_new(application);
gtk_window_set_title(window, "m2-GTK4 Rich Text");
gtk_window_set_default_size(window, 460, 260);
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 richtext.