tut8_5.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. {
  2. This file extracted from the GTK 1.2 tutorial.
  3. Section 8.5
  4. Converted from C to Pascal by Thomas E. Payne
  5. }
  6. program Tut8_5;
  7. {$mode objfpc}
  8. uses
  9. glib,gdk,gtk,sysutils;
  10. //* example-start rangewidgets rangewidgets.c *//
  11. var
  12. hscale, vscale : pGtkWidget;
  13. procedure cb_pos_menu_select( item : pGtkWidget;
  14. pos : TGtkPositionType );cdecl;
  15. begin
  16. //* Set the value position on both scale widgets *//
  17. gtk_scale_set_value_pos (GTK_SCALE (hscale), pos);
  18. gtk_scale_set_value_pos (GTK_SCALE (vscale), pos);
  19. end;
  20. procedure cb_update_menu_select( item : pGtkWidget;
  21. policy : TGtkUpdateType);cdecl;
  22. begin
  23. //* Set the update policy for both scale widgets *//
  24. gtk_range_set_update_policy (GTK_RANGE (hscale), policy);
  25. gtk_range_set_update_policy (GTK_RANGE (vscale), policy);
  26. end;
  27. procedure cb_digits_scale( adj :pGtkAdjustment );cdecl;
  28. begin
  29. //* Set the number of decimal places to which adj->value is rounded *//
  30. gtk_scale_set_digits (GTK_SCALE (hscale), round(adj^.value));
  31. gtk_scale_set_digits (GTK_SCALE (vscale), round(adj^.value));
  32. end;
  33. procedure cb_page_size( get : pGtkAdjustment; set_ : pGtkAdjustment );cdecl;
  34. begin
  35. //* Set the page size and page increment size of the sample
  36. //* adjustment to the value specified by the 'Page Size' scale *//
  37. set_^.page_size := get^.value;
  38. set_^.page_increment := get^.value;
  39. //* Now emit the 'changed' signal to reconfigure all the widgets that
  40. //* are attached to this adjustment *//
  41. gtk_signal_emit_by_name (GTK_OBJECT (set_), 'changed');
  42. end;
  43. procedure cb_draw_value( button : pGtkToggleButton );cdecl;
  44. begin
  45. //* Turn the value display on the scale widgets off or on depending
  46. //* on the state of the checkbutton *//
  47. gtk_scale_set_draw_value (GTK_SCALE (hscale), active(button^)<>0);
  48. gtk_scale_set_draw_value (GTK_SCALE (vscale), active(button^)<>0);
  49. end;
  50. //* Convenience functions *//
  51. function make_menu_item( name : pgchar;
  52. callback : TGtkSignalFunc;
  53. data : gint ) : pGtkWidget;
  54. var
  55. item : pGtkWidget ;
  56. begin
  57. item := gtk_menu_item_new_with_label (name);
  58. gtk_signal_connect (GTK_OBJECT (item), 'activate',
  59. callback, gpointer(data));
  60. gtk_widget_show (item);
  61. make_menu_item := item;
  62. end;
  63. function GINT_TO_POINTER( t : gint): gpointer;
  64. var
  65. temp : gint;
  66. begin
  67. temp := t;
  68. GINT_TO_POINTER := @temp;
  69. end;
  70. procedure scale_set_default_values( scale : pGtkScale);
  71. begin
  72. gtk_range_set_update_policy (GTK_RANGE (scale),
  73. GTK_UPDATE_CONTINUOUS);
  74. gtk_scale_set_digits (scale, 1);
  75. gtk_scale_set_value_pos (scale, GTK_POS_TOP);
  76. gtk_scale_set_draw_value (scale, TRUE);
  77. end;
  78. //* makes the sample window *//
  79. procedure create_range_controls;
  80. var
  81. window,
  82. box1, box2, box3,
  83. button,
  84. scrollbar,
  85. separator,
  86. opt, menu, item,
  87. label_,
  88. scale : pGtkWidget;
  89. adj1, adj2 : pGtkObject;
  90. begin
  91. //* Standard window-creating stuff *//
  92. window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  93. gtk_signal_connect (GTK_OBJECT (window), 'destroy',
  94. GTK_SIGNAL_FUNC(@gtk_main_quit),
  95. Nil);
  96. gtk_window_set_title (GTK_WINDOW (window), 'range controls');
  97. box1 := gtk_vbox_new (FALSE, 0);
  98. gtk_container_add (GTK_CONTAINER (window), box1);
  99. gtk_widget_show (box1);
  100. box2 := gtk_hbox_new (FALSE, 10);
  101. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  102. gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  103. gtk_widget_show (box2);
  104. //* calue, lower, upper, step_increment, page_increment, page_size *//
  105. //* Note that the page_size value only makes a difference for
  106. //* scrollbar widgets, and the highest value you'll get is actually
  107. //* (upper - page_size). *//
  108. adj1 := gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
  109. vscale := gtk_vscale_new (GTK_ADJUSTMENT (adj1));
  110. scale_set_default_values (GTK_SCALE (vscale));
  111. gtk_box_pack_start (GTK_BOX (box2), vscale, TRUE, TRUE, 0);
  112. gtk_widget_show (vscale);
  113. box3 := gtk_vbox_new (FALSE, 10);
  114. gtk_box_pack_start (GTK_BOX (box2), box3, TRUE, TRUE, 0);
  115. gtk_widget_show (box3);
  116. //* Reuse the same adjustment *//
  117. hscale := gtk_hscale_new (GTK_ADJUSTMENT (adj1));
  118. gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 30);
  119. scale_set_default_values (GTK_SCALE (hscale));
  120. gtk_box_pack_start (GTK_BOX (box3), hscale, TRUE, TRUE, 0);
  121. gtk_widget_show (hscale);
  122. //* Reuse the same adjustment again *//
  123. scrollbar := gtk_hscrollbar_new (GTK_ADJUSTMENT (adj1));
  124. //* Notice how this causes the scales to always be updated
  125. // * continuously when the scrollbar is moved *//
  126. gtk_range_set_update_policy (GTK_RANGE (scrollbar),
  127. GTK_UPDATE_CONTINUOUS);
  128. gtk_box_pack_start (GTK_BOX (box3), scrollbar, TRUE, TRUE, 0);
  129. gtk_widget_show (scrollbar);
  130. box2 := gtk_hbox_new (FALSE, 10);
  131. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  132. gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  133. gtk_widget_show (box2);
  134. //* A checkbutton to control whether the value is displayed or not *//
  135. button := gtk_check_button_new_with_label('Display value on scale widgets');
  136. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
  137. gtk_signal_connect (GTK_OBJECT (button), 'toggled',
  138. GTK_SIGNAL_FUNC(@cb_draw_value), Nil);
  139. gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  140. gtk_widget_show (button);
  141. box2 := gtk_hbox_new (FALSE, 10);
  142. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  143. //* An option menu to change the position of the value *//
  144. label_ := gtk_label_new ('Scale Value Position:');
  145. gtk_box_pack_start (GTK_BOX (box2), label_, FALSE, FALSE, 0);
  146. gtk_widget_show (label_);
  147. opt := gtk_option_menu_new();
  148. menu := gtk_menu_new();
  149. item := make_menu_item ('Top',
  150. GTK_SIGNAL_FUNC(@cb_pos_menu_select),
  151. GTK_POS_TOP);
  152. gtk_menu_append (GTK_MENU (menu), item);
  153. item := make_menu_item ('Bottom', GTK_SIGNAL_FUNC (@cb_pos_menu_select),
  154. GTK_POS_BOTTOM);
  155. gtk_menu_append (GTK_MENU (menu), item);
  156. item := make_menu_item ('Left', GTK_SIGNAL_FUNC (@cb_pos_menu_select),
  157. GTK_POS_LEFT);
  158. gtk_menu_append (GTK_MENU (menu), item);
  159. item := make_menu_item ('Right', GTK_SIGNAL_FUNC (@cb_pos_menu_select),
  160. GTK_POS_RIGHT);
  161. gtk_menu_append (GTK_MENU (menu), item);
  162. gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu);
  163. gtk_box_pack_start (GTK_BOX (box2), opt, TRUE, TRUE, 0);
  164. gtk_widget_show (opt);
  165. gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  166. gtk_widget_show (box2);
  167. box2 := gtk_hbox_new (FALSE, 10);
  168. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  169. //* Yet another option menu, this time for the update policy of the
  170. // * scale widgets *//
  171. label_ := gtk_label_new ('Scale Update Policy:');
  172. gtk_box_pack_start (GTK_BOX (box2), label_, FALSE, FALSE, 0);
  173. gtk_widget_show (label_);
  174. opt := gtk_option_menu_new();
  175. menu := gtk_menu_new();
  176. item := make_menu_item ('Continuous',
  177. GTK_SIGNAL_FUNC (@cb_update_menu_select),
  178. GTK_UPDATE_CONTINUOUS);
  179. gtk_menu_append (GTK_MENU (menu), item);
  180. item := make_menu_item ('Discontinuous',
  181. GTK_SIGNAL_FUNC (@cb_update_menu_select),
  182. GTK_UPDATE_DISCONTINUOUS);
  183. gtk_menu_append (GTK_MENU (menu), item);
  184. item := make_menu_item ('Delayed',
  185. GTK_SIGNAL_FUNC (@cb_update_menu_select),
  186. GTK_UPDATE_DELAYED);
  187. gtk_menu_append (GTK_MENU (menu), item);
  188. gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu);
  189. gtk_box_pack_start (GTK_BOX (box2), opt, TRUE, TRUE, 0);
  190. gtk_widget_show (opt);
  191. gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  192. gtk_widget_show (box2);
  193. box2 := gtk_hbox_new (FALSE, 10);
  194. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  195. //* A GtkHScale widget for adjusting the number of digits on the
  196. //* sample scales. *//
  197. label_ := gtk_label_new ('Scale Digits:');
  198. gtk_box_pack_start (GTK_BOX (box2), label_, FALSE, FALSE, 0);
  199. gtk_widget_show (label_);
  200. adj2 := gtk_adjustment_new (1.0, 0.0, 5.0, 1.0, 1.0, 0.0);
  201. gtk_signal_connect (GTK_OBJECT (adj2), 'value_changed',
  202. GTK_SIGNAL_FUNC (@cb_digits_scale), Nil);
  203. scale := gtk_hscale_new (GTK_ADJUSTMENT (adj2));
  204. gtk_scale_set_digits (GTK_SCALE (scale), 0);
  205. gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
  206. gtk_widget_show (scale);
  207. gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  208. gtk_widget_show (box2);
  209. box2 := gtk_hbox_new (FALSE, 10);
  210. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  211. //* And, one last GtkHScale widget for adjusting the page size of the
  212. // * scrollbar. *//
  213. label_ := gtk_label_new ('Scrollbar Page Size:');
  214. gtk_box_pack_start (GTK_BOX (box2), label_, FALSE, FALSE, 0);
  215. gtk_widget_show (label_);
  216. adj2 := gtk_adjustment_new (1.0, 1.0, 101.0, 1.0, 1.0, 0.0);
  217. gtk_signal_connect (GTK_OBJECT (adj2), 'value_changed',
  218. GTK_SIGNAL_FUNC (@cb_page_size), adj1);
  219. scale := gtk_hscale_new (GTK_ADJUSTMENT (adj2));
  220. gtk_scale_set_digits (GTK_SCALE (scale), 0);
  221. gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
  222. gtk_widget_show (scale);
  223. gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  224. gtk_widget_show (box2);
  225. separator := gtk_hseparator_new ();
  226. gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
  227. gtk_widget_show (separator);
  228. box2 := gtk_vbox_new (FALSE, 10);
  229. gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  230. gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
  231. gtk_widget_show (box2);
  232. button := gtk_button_new_with_label ('Quit');
  233. gtk_signal_connect_object (GTK_OBJECT (button), 'clicked',
  234. GTK_SIGNAL_FUNC(@gtk_main_quit),
  235. Nil);
  236. gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  237. GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  238. gtk_widget_grab_default (button);
  239. gtk_widget_show (button);
  240. gtk_widget_show (window);
  241. end;
  242. begin
  243. gtk_init(@argc, @argv);
  244. create_range_controls();
  245. gtk_main();
  246. end.