styling.mod 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. MODULE styling ;
  2. (*
  3. m2-GTK4 example - CSS styling.
  4. Loads a stylesheet from a string and installs it for the display,
  5. then toggles a CSS class on a label.
  6. Build: make examples
  7. Run: ./build/examples/styling
  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;
  15. FROM GtkLabel IMPORT gtk_label_new;
  16. FROM GtkButton IMPORT gtk_button_new_with_label;
  17. FROM GtkWidget IMPORT gtk_widget_add_css_class, gtk_widget_remove_css_class,
  18. gtk_widget_set_margin_top, gtk_widget_set_margin_bottom,
  19. gtk_widget_set_margin_start, gtk_widget_set_margin_end;
  20. FROM GtkCssProvider IMPORT gtk_css_provider_new,
  21. gtk_css_provider_load_from_string;
  22. FROM GtkStyleContext IMPORT gtk_style_context_add_provider_for_display,
  23. GtkStyleProviderPriorityApplication;
  24. FROM Gdk IMPORT gdk_display_get_default;
  25. FROM GtkClosures IMPORT Connect2;
  26. FROM SYSTEM IMPORT ADDRESS;
  27. FROM libc IMPORT printf;
  28. CONST
  29. AppId = "org.example.m2gtk4.Styling";
  30. Css = ".m2accent { color: #e01b24; font-weight: bold; }";
  31. VAR
  32. label: ADDRESS;
  33. accented: BOOLEAN;
  34. PROCEDURE OnToggle (button: ADDRESS; user: ADDRESS);
  35. BEGIN
  36. IF accented THEN
  37. gtk_widget_remove_css_class(label, "m2accent");
  38. accented := FALSE
  39. ELSE
  40. gtk_widget_add_css_class(label, "m2accent");
  41. accented := TRUE
  42. END
  43. END OnToggle;
  44. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  45. VAR
  46. window, box, provider, toggle: ADDRESS;
  47. BEGIN
  48. provider := gtk_css_provider_new();
  49. gtk_css_provider_load_from_string(provider, Css);
  50. gtk_style_context_add_provider_for_display(gdk_display_get_default(),
  51. provider, GtkStyleProviderPriorityApplication);
  52. label := gtk_label_new("Styled label");
  53. accented := FALSE;
  54. toggle := gtk_button_new_with_label("Toggle accent");
  55. Connect2(toggle, "clicked", OnToggle, NIL);
  56. box := gtk_box_new(GtkVertical, 12);
  57. gtk_box_set_spacing(box, 12);
  58. gtk_widget_set_margin_top(box, 14);
  59. gtk_widget_set_margin_bottom(box, 14);
  60. gtk_widget_set_margin_start(box, 14);
  61. gtk_widget_set_margin_end(box, 14);
  62. gtk_box_append(box, label);
  63. gtk_box_append(box, toggle);
  64. window := gtk_application_window_new(application);
  65. gtk_window_set_title(window, "m2-GTK4 Styling");
  66. gtk_window_set_default_size(window, 360, 160);
  67. gtk_window_set_child(window, box);
  68. gtk_window_present(window)
  69. END OnActivate;
  70. VAR
  71. app: ADDRESS;
  72. BEGIN
  73. app := gtk_application_new(AppId, 0);
  74. IF app = NIL THEN
  75. printf("gtk_application_new failed\n");
  76. HALT(1)
  77. END;
  78. Connect2(app, "activate", OnActivate, NIL);
  79. g_application_run(app, 0, NIL)
  80. END styling.