test_inputs2.mod 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. MODULE test_inputs2 ;
  2. (*
  3. m2-GTK4 test - second batch of input widgets: GtkSpinButton,
  4. GtkSearchEntry, GtkDropDown (+ GtkStringList/GListModel) and
  5. GtkTextView + GtkTextBuffer, including the opaque GtkTextIter that is
  6. marshalled by address. Requires a display.
  7. *)
  8. FROM Gio IMPORT g_application_run, g_application_quit;
  9. FROM GtkApplication IMPORT gtk_application_new;
  10. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child;
  11. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  12. FROM GtkEnums IMPORT GtkVertical, GtkWrapWordChar;
  13. FROM GtkSpinButton IMPORT gtk_spin_button_new_with_range,
  14. gtk_spin_button_set_value, gtk_spin_button_get_value,
  15. gtk_spin_button_get_value_as_int, gtk_spin_button_set_wrap,
  16. gtk_spin_button_get_wrap, gtk_spin_button_set_numeric,
  17. gtk_spin_button_get_numeric, gtk_spin_button_spin, GtkSpinUserDefined;
  18. FROM GtkSearchEntry IMPORT gtk_search_entry_new,
  19. gtk_search_entry_set_placeholder_text,
  20. gtk_search_entry_get_placeholder_text;
  21. FROM GtkStringList IMPORT gtk_string_list_new, gtk_string_list_append,
  22. gtk_string_list_get_string;
  23. FROM GtkDropDown IMPORT gtk_drop_down_new, gtk_drop_down_set_selected,
  24. gtk_drop_down_get_selected, gtk_drop_down_get_model,
  25. gtk_drop_down_set_enable_search, gtk_drop_down_get_enable_search;
  26. FROM GListModel IMPORT g_list_model_get_n_items;
  27. FROM GtkTextBuffer IMPORT gtk_text_buffer_new, gtk_text_buffer_set_text,
  28. gtk_text_buffer_get_text, gtk_text_buffer_get_bounds,
  29. gtk_text_buffer_get_char_count, gtk_text_buffer_get_line_count,
  30. gtk_text_buffer_get_modified, gtk_text_buffer_set_modified;
  31. FROM GtkTextIter IMPORT GtkTextIter;
  32. FROM GtkTextView IMPORT gtk_text_view_new_with_buffer,
  33. gtk_text_view_get_buffer, gtk_text_view_set_wrap_mode,
  34. gtk_text_view_get_wrap_mode, gtk_text_view_set_monospace,
  35. gtk_text_view_get_monospace, gtk_text_view_set_editable,
  36. gtk_text_view_get_editable;
  37. FROM GLib IMPORT g_free;
  38. FROM GtkUtils IMPORT Connect, CStrToM2;
  39. FROM SYSTEM IMPORT ADDRESS, ADR;
  40. FROM libc IMPORT printf;
  41. CONST
  42. AppId = "org.example.m2gtk4.TestInputs2";
  43. VAR
  44. app: ADDRESS;
  45. passed: BOOLEAN;
  46. temp: ADDRESS;
  47. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  48. VAR
  49. window, box, spin, search, dd, list, view, buffer: ADDRESS;
  50. start, stop: GtkTextIter;
  51. buf: ARRAY [0..63] OF CHAR;
  52. ok: BOOLEAN;
  53. BEGIN
  54. ok := TRUE;
  55. (* --- GtkSpinButton --- *)
  56. spin := gtk_spin_button_new_with_range(0.0, 100.0, 1.0);
  57. gtk_spin_button_set_value(spin, 42.0);
  58. IF ABS(gtk_spin_button_get_value(spin) - 42.0) > 0.001 THEN
  59. printf("spin value wrong\n");
  60. ok := FALSE
  61. END;
  62. IF gtk_spin_button_get_value_as_int(spin) # 42 THEN
  63. printf("spin int wrong\n");
  64. ok := FALSE
  65. END;
  66. gtk_spin_button_set_wrap(spin, 1);
  67. IF gtk_spin_button_get_wrap(spin) # 1 THEN ok := FALSE END;
  68. gtk_spin_button_set_numeric(spin, 1);
  69. IF gtk_spin_button_get_numeric(spin) # 1 THEN ok := FALSE END;
  70. gtk_spin_button_spin(spin, GtkSpinUserDefined, 5.0);
  71. IF ABS(gtk_spin_button_get_value(spin) - 47.0) > 0.001 THEN
  72. printf("spin step wrong\n");
  73. ok := FALSE
  74. END;
  75. (* --- GtkSearchEntry --- *)
  76. search := gtk_search_entry_new();
  77. gtk_search_entry_set_placeholder_text(search, "look for it");
  78. CStrToM2(gtk_search_entry_get_placeholder_text(search), buf);
  79. IF (buf[0] # 'l') OR (buf[11] # 0C) THEN
  80. printf("search placeholder wrong: [%s]\n", buf);
  81. ok := FALSE
  82. END;
  83. (* --- GtkDropDown + GtkStringList + GListModel --- *)
  84. list := gtk_string_list_new(NIL);
  85. gtk_string_list_append(list, "alpha");
  86. gtk_string_list_append(list, "beta");
  87. gtk_string_list_append(list, "gamma");
  88. IF g_list_model_get_n_items(list) # 3 THEN
  89. printf("string list size wrong\n");
  90. ok := FALSE
  91. END;
  92. CStrToM2(gtk_string_list_get_string(list, 1), buf);
  93. IF (buf[0] # 'b') OR (buf[4] # 0C) THEN
  94. printf("string list item wrong: [%s]\n", buf);
  95. ok := FALSE
  96. END;
  97. dd := gtk_drop_down_new(list, NIL);
  98. IF gtk_drop_down_get_model(dd) # list THEN ok := FALSE END;
  99. IF gtk_drop_down_get_selected(dd) # 0 THEN ok := FALSE END;
  100. gtk_drop_down_set_selected(dd, 2);
  101. IF gtk_drop_down_get_selected(dd) # 2 THEN
  102. printf("dropdown selection wrong\n");
  103. ok := FALSE
  104. END;
  105. gtk_drop_down_set_enable_search(dd, 1);
  106. IF gtk_drop_down_get_enable_search(dd) # 1 THEN ok := FALSE END;
  107. (* --- GtkTextBuffer + GtkTextView + GtkTextIter --- *)
  108. buffer := gtk_text_buffer_new(NIL);
  109. gtk_text_buffer_set_text(buffer, "hello", -1);
  110. IF gtk_text_buffer_get_char_count(buffer) # 5 THEN
  111. printf("buffer char count wrong\n");
  112. ok := FALSE
  113. END;
  114. IF gtk_text_buffer_get_line_count(buffer) # 1 THEN ok := FALSE END;
  115. gtk_text_buffer_get_bounds(buffer, start, stop);
  116. temp := gtk_text_buffer_get_text(buffer, start, stop, 0);
  117. CStrToM2(temp, buf);
  118. g_free(temp);
  119. IF (buf[0] # 'h') OR (buf[4] # 'o') OR (buf[5] # 0C) THEN
  120. printf("buffer text wrong: [%s]\n", buf);
  121. ok := FALSE
  122. END;
  123. gtk_text_buffer_set_modified(buffer, 0);
  124. IF gtk_text_buffer_get_modified(buffer) # 0 THEN ok := FALSE END;
  125. view := gtk_text_view_new_with_buffer(buffer);
  126. IF gtk_text_view_get_buffer(view) # buffer THEN
  127. printf("view buffer wrong\n");
  128. ok := FALSE
  129. END;
  130. gtk_text_view_set_wrap_mode(view, GtkWrapWordChar);
  131. IF gtk_text_view_get_wrap_mode(view) # GtkWrapWordChar THEN
  132. printf("wrap mode wrong\n");
  133. ok := FALSE
  134. END;
  135. gtk_text_view_set_monospace(view, 1);
  136. IF gtk_text_view_get_monospace(view) # 1 THEN ok := FALSE END;
  137. gtk_text_view_set_editable(view, 0);
  138. IF gtk_text_view_get_editable(view) # 0 THEN ok := FALSE END;
  139. box := gtk_box_new(GtkVertical, 4);
  140. gtk_box_append(box, spin);
  141. gtk_box_append(box, search);
  142. gtk_box_append(box, dd);
  143. gtk_box_append(box, view);
  144. window := gtk_application_window_new(application);
  145. gtk_window_set_child(window, box);
  146. passed := ok;
  147. g_application_quit(application)
  148. END OnActivate;
  149. VAR
  150. rc: INTEGER;
  151. BEGIN
  152. passed := FALSE;
  153. app := gtk_application_new(AppId, 0);
  154. IF app = NIL THEN
  155. printf("test_inputs2: FAIL (no app)\n");
  156. HALT(1)
  157. END;
  158. Connect(app, "activate", ADR(OnActivate), NIL);
  159. rc := g_application_run(app, 0, NIL);
  160. IF passed THEN
  161. printf("test_inputs2: PASS\n");
  162. HALT(0)
  163. ELSE
  164. printf("test_inputs2: FAIL\n");
  165. HALT(1)
  166. END
  167. END test_inputs2.