editor.mod 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. MODULE editor ;
  2. (*
  3. m2-GTK4 example - a small editor built from the second input batch.
  4. A GtkSearchEntry, a GtkTextView (in a GtkScrolledWindow) backed by a
  5. GtkTextBuffer, a GtkDropDown that selects the wrap mode, and a
  6. GtkSpinButton that sets the text padding. The signals use the
  7. GtkClosures helper (2- and 3-argument forms).
  8. Build: make examples
  9. Run: ./build/examples/editor
  10. *)
  11. FROM Gio IMPORT g_application_run;
  12. FROM GtkApplication IMPORT gtk_application_new;
  13. FROM GtkApplicationWindow IMPORT gtk_application_window_new;
  14. FROM GtkWindow IMPORT gtk_window_set_title, gtk_window_set_default_size,
  15. gtk_window_set_child, gtk_window_present;
  16. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  17. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal, GtkWrapWord;
  18. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  19. FROM GtkWidget IMPORT gtk_widget_set_margin_top,
  20. gtk_widget_set_margin_bottom, gtk_widget_set_margin_start,
  21. gtk_widget_set_margin_end, gtk_widget_set_vexpand;
  22. FROM GtkSearchEntry IMPORT gtk_search_entry_new,
  23. gtk_search_entry_set_placeholder_text;
  24. FROM GtkEditable IMPORT gtk_editable_get_text;
  25. FROM GtkScrolledWindow IMPORT gtk_scrolled_window_new,
  26. gtk_scrolled_window_set_child, gtk_scrolled_window_set_policy,
  27. GtkPolicyNever, GtkPolicyAutomatic;
  28. FROM GtkTextView IMPORT gtk_text_view_new, gtk_text_view_get_buffer,
  29. gtk_text_view_set_wrap_mode, gtk_text_view_set_monospace,
  30. gtk_text_view_set_left_margin, gtk_text_view_set_right_margin;
  31. FROM GtkTextBuffer IMPORT gtk_text_buffer_set_text;
  32. FROM GtkStringList IMPORT gtk_string_list_new, gtk_string_list_append;
  33. FROM GtkDropDown IMPORT gtk_drop_down_new, gtk_drop_down_get_selected,
  34. gtk_drop_down_set_selected;
  35. FROM GtkSpinButton IMPORT gtk_spin_button_new_with_range,
  36. gtk_spin_button_get_value, gtk_spin_button_set_value;
  37. FROM GtkClosures IMPORT Connect2, Connect3;
  38. FROM GtkUtils IMPORT CStrToM2, StrAppend;
  39. FROM SYSTEM IMPORT ADDRESS, ADR;
  40. FROM libc IMPORT printf;
  41. CONST
  42. AppId = "org.example.m2gtk4.Editor";
  43. VAR
  44. view, status: ADDRESS;
  45. PROCEDURE OnSearch (entry: ADDRESS; user: ADDRESS);
  46. VAR
  47. text: ARRAY [0..63] OF CHAR;
  48. line: ARRAY [0..95] OF CHAR;
  49. BEGIN
  50. line[0] := 0C;
  51. StrAppend(line, "search: ");
  52. CStrToM2(gtk_editable_get_text(entry), text);
  53. IF text[0] = 0C THEN
  54. StrAppend(line, "(none)")
  55. ELSE
  56. StrAppend(line, text)
  57. END;
  58. gtk_label_set_text(status, line)
  59. END OnSearch;
  60. (* 3-argument form: "notify::selected" carries the GParamSpec *)
  61. PROCEDURE OnWrap (dd: ADDRESS; pspec: ADDRESS; user: ADDRESS);
  62. BEGIN
  63. gtk_text_view_set_wrap_mode(view, gtk_drop_down_get_selected(dd))
  64. END OnWrap;
  65. PROCEDURE OnPad (spin: ADDRESS; user: ADDRESS);
  66. VAR
  67. margin: INTEGER;
  68. BEGIN
  69. margin := TRUNC(gtk_spin_button_get_value(spin));
  70. gtk_text_view_set_left_margin(view, margin);
  71. gtk_text_view_set_right_margin(view, margin)
  72. END OnPad;
  73. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  74. VAR
  75. window, box, search, scroller, bottom, wrapLabel, padLabel,
  76. dd, list, spin, buffer: ADDRESS;
  77. BEGIN
  78. status := gtk_label_new("Type in the box or search");
  79. (* text view inside a scrolled window *)
  80. view := gtk_text_view_new();
  81. gtk_text_view_set_monospace(view, 1);
  82. buffer := gtk_text_view_get_buffer(view);
  83. gtk_text_buffer_set_text(buffer, "Edit me!", -1);
  84. gtk_text_view_set_left_margin(view, 6);
  85. gtk_text_view_set_right_margin(view, 6);
  86. scroller := gtk_scrolled_window_new();
  87. gtk_scrolled_window_set_policy(scroller, GtkPolicyNever,
  88. GtkPolicyAutomatic);
  89. gtk_scrolled_window_set_child(scroller, view);
  90. gtk_widget_set_vexpand(scroller, 1);
  91. (* search entry *)
  92. search := gtk_search_entry_new();
  93. gtk_search_entry_set_placeholder_text(search, "search the text");
  94. Connect2(search, "search-changed", OnSearch, NIL);
  95. (* wrap-mode drop-down *)
  96. list := gtk_string_list_new(NIL);
  97. gtk_string_list_append(list, "No wrap");
  98. gtk_string_list_append(list, "Wrap chars");
  99. gtk_string_list_append(list, "Wrap words");
  100. gtk_string_list_append(list, "Wrap words/chars");
  101. dd := gtk_drop_down_new(list, NIL);
  102. gtk_drop_down_set_selected(dd, 2);
  103. gtk_text_view_set_wrap_mode(view, GtkWrapWord);
  104. Connect3(dd, "notify::selected", OnWrap, NIL);
  105. (* padding spin button *)
  106. spin := gtk_spin_button_new_with_range(0.0, 40.0, 1.0);
  107. gtk_spin_button_set_value(spin, 6.0);
  108. Connect2(spin, "value-changed", OnPad, NIL);
  109. wrapLabel := gtk_label_new("Wrap:");
  110. padLabel := gtk_label_new("Padding:");
  111. bottom := gtk_box_new(GtkHorizontal, 8);
  112. gtk_box_append(bottom, wrapLabel);
  113. gtk_box_append(bottom, dd);
  114. gtk_box_append(bottom, padLabel);
  115. gtk_box_append(bottom, spin);
  116. box := gtk_box_new(GtkVertical, 8);
  117. gtk_box_set_spacing(box, 8);
  118. gtk_widget_set_margin_top(box, 12);
  119. gtk_widget_set_margin_bottom(box, 12);
  120. gtk_widget_set_margin_start(box, 12);
  121. gtk_widget_set_margin_end(box, 12);
  122. gtk_box_append(box, search);
  123. gtk_box_append(box, scroller);
  124. gtk_box_append(box, bottom);
  125. gtk_box_append(box, status);
  126. window := gtk_application_window_new(application);
  127. gtk_window_set_title(window, "m2-GTK4 Editor");
  128. gtk_window_set_default_size(window, 520, 360);
  129. gtk_window_set_child(window, box);
  130. gtk_window_present(window)
  131. END OnActivate;
  132. VAR
  133. app: ADDRESS;
  134. BEGIN
  135. app := gtk_application_new(AppId, 0);
  136. IF app = NIL THEN
  137. printf("gtk_application_new failed\n");
  138. HALT(1)
  139. END;
  140. Connect2(app, "activate", OnActivate, NIL);
  141. g_application_run(app, 0, NIL)
  142. END editor.