inputs.mod 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. MODULE inputs ;
  2. (*
  3. m2-GTK4 example - a small form built from the input widgets.
  4. GtkEntry + GtkCheckButton + GtkSwitch + GtkScale, with signal
  5. handlers that rebuild a status label on every change. Demonstrates
  6. Connect(), CStrToM2(), StrAppend() and IntToStr() together.
  7. Build: make examples
  8. Run: ./build/examples/inputs
  9. *)
  10. FROM Gio IMPORT g_application_run;
  11. FROM GtkApplication IMPORT gtk_application_new;
  12. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  13. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  14. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  15. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal;
  16. FROM GtkWidget IMPORT gtk_widget_set_margin_top, gtk_widget_set_margin_bottom,
  17. gtk_widget_set_margin_start, gtk_widget_set_margin_end;
  18. FROM GtkLabel IMPORT gtk_label_new, gtk_label_set_text;
  19. FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_set_placeholder_text;
  20. FROM GtkEditable IMPORT gtk_editable_get_text;
  21. FROM GtkCheckButton IMPORT gtk_check_button_new_with_label,
  22. gtk_check_button_get_active;
  23. FROM GtkSwitch IMPORT gtk_switch_new, gtk_switch_get_active;
  24. FROM GtkScale IMPORT gtk_scale_new_with_range, gtk_scale_set_digits;
  25. FROM GtkRange IMPORT gtk_range_get_value;
  26. FROM GtkUtils IMPORT Connect, CStrToM2, StrAppend, IntToStr;
  27. FROM SYSTEM IMPORT ADDRESS, ADR;
  28. FROM libc IMPORT printf;
  29. CONST
  30. AppId = "org.example.m2gtk4.Inputs";
  31. VAR
  32. entry, check, sw, scale, status: ADDRESS;
  33. PROCEDURE UpdateStatus;
  34. VAR
  35. name: ARRAY [0..63] OF CHAR;
  36. value: ARRAY [0..31] OF CHAR;
  37. line: ARRAY [0..191] OF CHAR;
  38. BEGIN
  39. line[0] := 0C;
  40. StrAppend(line, "name: ");
  41. CStrToM2(gtk_editable_get_text(entry), name);
  42. IF name[0] = 0C THEN
  43. StrAppend(line, "(empty)")
  44. ELSE
  45. StrAppend(line, name)
  46. END;
  47. StrAppend(line, " feature: ");
  48. IF gtk_check_button_get_active(check) # 0 THEN
  49. StrAppend(line, "on")
  50. ELSE
  51. StrAppend(line, "off")
  52. END;
  53. StrAppend(line, " switch: ");
  54. IF gtk_switch_get_active(sw) # 0 THEN
  55. StrAppend(line, "on")
  56. ELSE
  57. StrAppend(line, "off")
  58. END;
  59. StrAppend(line, " value: ");
  60. IntToStr(TRUNC(gtk_range_get_value(scale)), value);
  61. StrAppend(line, value);
  62. gtk_label_set_text(status, line)
  63. END UpdateStatus;
  64. PROCEDURE OnEntryChanged (editable: ADDRESS; data: ADDRESS);
  65. BEGIN
  66. UpdateStatus
  67. END OnEntryChanged;
  68. PROCEDURE OnToggled (button: ADDRESS; data: ADDRESS);
  69. BEGIN
  70. UpdateStatus
  71. END OnToggled;
  72. (* void notify(GObject *obj, GParamSpec *pspec, gpointer data) *)
  73. PROCEDURE OnSwitchNotify (obj: ADDRESS; pspec: ADDRESS; data: ADDRESS);
  74. BEGIN
  75. UpdateStatus
  76. END OnSwitchNotify;
  77. PROCEDURE OnScaleChanged (range: ADDRESS; data: ADDRESS);
  78. BEGIN
  79. UpdateStatus
  80. END OnScaleChanged;
  81. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  82. VAR
  83. window, box: ADDRESS;
  84. BEGIN
  85. box := gtk_box_new(GtkVertical, 10);
  86. gtk_box_set_spacing(box, 10);
  87. gtk_widget_set_margin_top(box, 14);
  88. gtk_widget_set_margin_bottom(box, 14);
  89. gtk_widget_set_margin_start(box, 14);
  90. gtk_widget_set_margin_end(box, 14);
  91. entry := gtk_entry_new();
  92. gtk_entry_set_placeholder_text(entry, "type your name");
  93. Connect(entry, "changed", ADR(OnEntryChanged), NIL);
  94. gtk_box_append(box, entry);
  95. check := gtk_check_button_new_with_label("Enable feature");
  96. Connect(check, "toggled", ADR(OnToggled), NIL);
  97. gtk_box_append(box, check);
  98. sw := gtk_switch_new();
  99. Connect(sw, "notify::active", ADR(OnSwitchNotify), NIL);
  100. gtk_box_append(box, sw);
  101. scale := gtk_scale_new_with_range(GtkHorizontal, 0.0, 100.0, 1.0);
  102. gtk_scale_set_digits(scale, 0);
  103. Connect(scale, "value-changed", ADR(OnScaleChanged), NIL);
  104. gtk_box_append(box, scale);
  105. status := gtk_label_new(" ");
  106. gtk_box_append(box, status);
  107. window := gtk_application_window_new(application);
  108. gtk_window_set_title(window, "m2-GTK4 Inputs");
  109. gtk_window_set_default_size(window, 460, 240);
  110. gtk_window_set_child(window, box);
  111. gtk_window_present(window);
  112. UpdateStatus
  113. END OnActivate;
  114. VAR
  115. app: ADDRESS;
  116. BEGIN
  117. app := gtk_application_new(AppId, 0);
  118. IF app = NIL THEN
  119. printf("gtk_application_new failed\n");
  120. HALT(1)
  121. END;
  122. Connect(app, "activate", ADR(OnActivate), NIL);
  123. g_application_run(app, 0, NIL)
  124. END inputs.