test_containers.mod 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. MODULE test_containers ;
  2. (*
  3. m2-GTK4 test - the layout containers.
  4. Exercises GtkGrid (attach + lookup), GtkStack + GtkStackSwitcher
  5. (named pages, visible child, transition), GtkNotebook (append,
  6. paging) and GtkScrolledWindow (child + policy round-trip).
  7. Requires a display.
  8. *)
  9. FROM Gio IMPORT g_application_run, g_application_quit;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child;
  12. FROM GtkLabel IMPORT gtk_label_new;
  13. FROM GtkGrid IMPORT gtk_grid_new, gtk_grid_attach, gtk_grid_get_child_at,
  14. gtk_grid_set_row_spacing, gtk_grid_get_row_spacing,
  15. gtk_grid_set_column_spacing, gtk_grid_get_column_spacing;
  16. FROM GtkStack IMPORT gtk_stack_new, gtk_stack_add_named,
  17. gtk_stack_set_visible_child_name, gtk_stack_get_visible_child_name,
  18. gtk_stack_set_transition_type, gtk_stack_get_transition_type,
  19. GtkStackTransitionCrossfade;
  20. FROM GtkStackSwitcher IMPORT gtk_stack_switcher_new,
  21. gtk_stack_switcher_set_stack, gtk_stack_switcher_get_stack;
  22. FROM GtkNotebook IMPORT gtk_notebook_new, gtk_notebook_append_page,
  23. gtk_notebook_get_n_pages, gtk_notebook_set_current_page,
  24. gtk_notebook_get_current_page, gtk_notebook_next_page,
  25. gtk_notebook_prev_page;
  26. FROM GtkScrolledWindow IMPORT gtk_scrolled_window_new,
  27. gtk_scrolled_window_set_child, gtk_scrolled_window_set_policy,
  28. gtk_scrolled_window_get_policy, GtkPolicyAutomatic, GtkPolicyNever,
  29. GtkPolicyType;
  30. FROM GtkUtils IMPORT Connect, CStrToM2;
  31. FROM SYSTEM IMPORT ADDRESS, ADR;
  32. FROM libc IMPORT printf;
  33. CONST
  34. AppId = "org.example.m2gtk4.TestContainers";
  35. VAR
  36. app: ADDRESS;
  37. passed: BOOLEAN;
  38. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  39. VAR
  40. window, grid, stack, switcher, notebook, sw, pages: ADDRESS;
  41. got: ARRAY [0..63] OF CHAR;
  42. hpol, vpol: GtkPolicyType;
  43. ok: BOOLEAN;
  44. i: INTEGER;
  45. BEGIN
  46. ok := TRUE;
  47. (* --- GtkGrid --- *)
  48. grid := gtk_grid_new();
  49. gtk_grid_set_row_spacing(grid, 4);
  50. gtk_grid_set_column_spacing(grid, 6);
  51. IF (gtk_grid_get_row_spacing(grid) # 4) OR
  52. (gtk_grid_get_column_spacing(grid) # 6) THEN
  53. printf("grid spacing wrong\n");
  54. ok := FALSE
  55. END;
  56. FOR i := 0 TO 3 DO
  57. gtk_grid_attach(grid, gtk_label_new("cell"),
  58. i MOD 2, i DIV 2, 1, 1)
  59. END;
  60. IF (gtk_grid_get_child_at(grid, 0, 0) = NIL) OR
  61. (gtk_grid_get_child_at(grid, 1, 1) = NIL) THEN
  62. printf("grid child missing\n");
  63. ok := FALSE
  64. END;
  65. (* --- GtkStack + GtkStackSwitcher --- *)
  66. stack := gtk_stack_new();
  67. gtk_stack_add_named(stack, gtk_label_new("one"), "one");
  68. gtk_stack_add_named(stack, gtk_label_new("two"), "two");
  69. gtk_stack_add_named(stack, gtk_label_new("three"), "three");
  70. gtk_stack_set_transition_type(stack, GtkStackTransitionCrossfade);
  71. IF gtk_stack_get_transition_type(stack) # GtkStackTransitionCrossfade THEN
  72. printf("stack transition wrong\n");
  73. ok := FALSE
  74. END;
  75. gtk_stack_set_visible_child_name(stack, "two");
  76. CStrToM2(gtk_stack_get_visible_child_name(stack), got);
  77. IF (got[0] # 't') OR (got[1] # 'w') OR (got[2] # 'o') OR (got[3] # 0C) THEN
  78. printf("stack visible name wrong: [%s]\n", got);
  79. ok := FALSE
  80. END;
  81. switcher := gtk_stack_switcher_new();
  82. gtk_stack_switcher_set_stack(switcher, stack);
  83. IF gtk_stack_switcher_get_stack(switcher) # stack THEN
  84. printf("switcher stack wrong\n");
  85. ok := FALSE
  86. END;
  87. (* --- GtkNotebook --- *)
  88. notebook := gtk_notebook_new();
  89. gtk_notebook_append_page(notebook, gtk_label_new("page0"),
  90. gtk_label_new("Tab 0"));
  91. gtk_notebook_append_page(notebook, gtk_label_new("page1"),
  92. gtk_label_new("Tab 1"));
  93. gtk_notebook_append_page(notebook, gtk_label_new("page2"),
  94. gtk_label_new("Tab 2"));
  95. IF gtk_notebook_get_n_pages(notebook) # 3 THEN
  96. printf("notebook page count wrong\n");
  97. ok := FALSE
  98. END;
  99. gtk_notebook_set_current_page(notebook, 1);
  100. IF gtk_notebook_get_current_page(notebook) # 1 THEN
  101. printf("notebook current page wrong\n");
  102. ok := FALSE
  103. END;
  104. gtk_notebook_next_page(notebook);
  105. IF gtk_notebook_get_current_page(notebook) # 2 THEN
  106. printf("notebook next page wrong\n");
  107. ok := FALSE
  108. END;
  109. gtk_notebook_prev_page(notebook);
  110. IF gtk_notebook_get_current_page(notebook) # 1 THEN
  111. printf("notebook prev page wrong\n");
  112. ok := FALSE
  113. END;
  114. (* --- GtkScrolledWindow --- *)
  115. sw := gtk_scrolled_window_new();
  116. gtk_scrolled_window_set_child(sw, gtk_label_new("scrollable"));
  117. gtk_scrolled_window_set_policy(sw, GtkPolicyAutomatic, GtkPolicyNever);
  118. gtk_scrolled_window_get_policy(sw, hpol, vpol);
  119. IF (hpol # GtkPolicyAutomatic) OR (vpol # GtkPolicyNever) THEN
  120. printf("scrolled window policy wrong\n");
  121. ok := FALSE
  122. END;
  123. (* nest grids/notebooks in a real window to exercise the container path *)
  124. window := gtk_application_window_new(application);
  125. pages := gtk_notebook_new();
  126. gtk_notebook_append_page(pages, grid, gtk_label_new("Grid"));
  127. gtk_notebook_append_page(pages, stack, gtk_label_new("Stack"));
  128. gtk_notebook_append_page(pages, sw, gtk_label_new("Scroll"));
  129. gtk_window_set_child(window, pages);
  130. passed := ok;
  131. g_application_quit(application)
  132. END OnActivate;
  133. VAR
  134. rc: INTEGER;
  135. BEGIN
  136. passed := FALSE;
  137. app := gtk_application_new(AppId, 0);
  138. IF app = NIL THEN
  139. printf("test_containers: FAIL (no app)\n");
  140. HALT(1)
  141. END;
  142. Connect(app, "activate", ADR(OnActivate), NIL);
  143. rc := g_application_run(app, 0, NIL);
  144. IF passed THEN
  145. printf("test_containers: PASS\n");
  146. HALT(0)
  147. ELSE
  148. printf("test_containers: FAIL\n");
  149. HALT(1)
  150. END
  151. END test_containers.