feedback.mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. MODULE feedback ;
  2. (*
  3. m2-GTK4 example - progress, spinner, separator and image.
  4. A progress bar fills from 0 to 1 on a timer while a spinner runs;
  5. when it completes the spinner stops and the bar reads "Done".
  6. Build: make examples
  7. Run: ./build/examples/feedback
  8. *)
  9. FROM Gio IMPORT g_application_run;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  12. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  14. FROM GtkEnums IMPORT GtkVertical, GtkHorizontal;
  15. FROM GtkWidget IMPORT gtk_widget_set_margin_top,
  16. gtk_widget_set_margin_bottom, gtk_widget_set_margin_start,
  17. gtk_widget_set_margin_end;
  18. FROM GtkProgressBar IMPORT gtk_progress_bar_new, gtk_progress_bar_set_fraction,
  19. gtk_progress_bar_set_show_text, gtk_progress_bar_set_text;
  20. FROM GtkSpinner IMPORT gtk_spinner_new, gtk_spinner_start, gtk_spinner_stop;
  21. FROM GtkSeparator IMPORT gtk_separator_new;
  22. FROM GtkImage IMPORT gtk_image_new_from_icon_name;
  23. FROM GLib IMPORT g_timeout_add, GSourceRemove, GSourceContinue;
  24. FROM GtkClosures IMPORT Connect2;
  25. FROM SYSTEM IMPORT ADDRESS;
  26. FROM libc IMPORT printf;
  27. CONST
  28. AppId = "org.example.m2gtk4.Feedback";
  29. VAR
  30. progress, spinner: ADDRESS;
  31. fraction: REAL;
  32. PROCEDURE OnTick (data: ADDRESS) : INTEGER;
  33. BEGIN
  34. fraction := fraction + 0.05;
  35. IF fraction >= 1.0 THEN
  36. gtk_progress_bar_set_fraction(progress, 1.0);
  37. gtk_progress_bar_set_text(progress, "Done");
  38. gtk_spinner_stop(spinner);
  39. RETURN GSourceRemove
  40. ELSE
  41. gtk_progress_bar_set_fraction(progress, fraction);
  42. RETURN GSourceContinue
  43. END
  44. END OnTick;
  45. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  46. VAR
  47. window, box: ADDRESS;
  48. BEGIN
  49. fraction := 0.0;
  50. progress := gtk_progress_bar_new();
  51. gtk_progress_bar_set_show_text(progress, 1);
  52. gtk_progress_bar_set_fraction(progress, 0.0);
  53. spinner := gtk_spinner_new();
  54. gtk_spinner_start(spinner);
  55. box := gtk_box_new(GtkVertical, 12);
  56. gtk_box_set_spacing(box, 12);
  57. gtk_widget_set_margin_top(box, 14);
  58. gtk_widget_set_margin_bottom(box, 14);
  59. gtk_widget_set_margin_start(box, 14);
  60. gtk_widget_set_margin_end(box, 14);
  61. gtk_box_append(box, gtk_image_new_from_icon_name("application-x-executable"));
  62. gtk_box_append(box, progress);
  63. gtk_box_append(box, gtk_separator_new(GtkHorizontal));
  64. gtk_box_append(box, spinner);
  65. window := gtk_application_window_new(application);
  66. gtk_window_set_title(window, "m2-GTK4 Feedback");
  67. gtk_window_set_default_size(window, 360, 200);
  68. gtk_window_set_child(window, box);
  69. gtk_window_present(window);
  70. g_timeout_add(100, OnTick, NIL)
  71. END OnActivate;
  72. VAR
  73. app: ADDRESS;
  74. BEGIN
  75. app := gtk_application_new(AppId, 0);
  76. IF app = NIL THEN
  77. printf("gtk_application_new failed\n");
  78. HALT(1)
  79. END;
  80. Connect2(app, "activate", OnActivate, NIL);
  81. g_application_run(app, 0, NIL)
  82. END feedback.