spinbutton.pp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. {
  2. $Id$
  3. Converted from C to Pascal by Artur Bac with liitle additions by me
  4. <[email protected]>
  5. Reda Poland
  6. }
  7. {$MODE objfpc}
  8. {$H+}
  9. {$S+}
  10. {$HINTS ON}
  11. {$ifdef win32}
  12. {$define extdecl := stdcall;}
  13. {$APPTYPE GUI}
  14. {$endif}
  15. {$ifdef unix}
  16. {$define extdecl := cdecl;}
  17. {$endif}
  18. Program spinbutton;
  19. Uses glib,gtk;
  20. Type
  21. PGInt = ^gint;
  22. Const
  23. a : gint = 1;
  24. b : gint = 2;
  25. Var
  26. spinner1 ,
  27. spinner2 : PGtkWidget;
  28. Function GPOINTER_TO_INT (data : pgint) : gint;
  29. Begin
  30. GPOINTER_TO_INT := data^;
  31. End;
  32. Procedure toggle_snap( widget : PGtkWidget;
  33. spin : PGtkSpinButton ); cdecl;
  34. Begin
  35. gtk_spin_button_set_snap_to_ticks (spin,
  36. gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
  37. End ;
  38. Procedure toggle_numeric( widget : PGtkWidget;
  39. spin : PGtkSpinButton ); cdecl;
  40. Begin
  41. gtk_spin_button_set_numeric (spin,
  42. gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
  43. End;
  44. Procedure change_digits( widget : PGtkWidget;
  45. spin : PGtkSpinButton ); cdecl;
  46. Begin
  47. gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
  48. gtk_spin_button_get_value_as_int (spin));
  49. End;
  50. Procedure get_value( widget : PGtkWidget;
  51. data : gpointer ) ; cdecl;
  52. Var
  53. Ptr_buf : PGchar;
  54. buf : string;
  55. label_l : PGtkLabel ;
  56. spin,spin2: PGtkSpinButton;
  57. Begin
  58. spin := GTK_SPIN_BUTTON (spinner1);
  59. spin2 := GTK_SPIN_BUTTON (spinner2);
  60. label_l := GTK_LABEL (gtk_object_get_user_data (GTK_OBJECT (widget)));
  61. if (GPOINTER_TO_INT (data) = 1) then
  62. str(gtk_spin_button_get_value_as_int (spin),buf)
  63. else
  64. Str(gtk_spin_button_get_value_as_float (spin)
  65. :10:gtk_spin_button_get_value_as_int(spin2) //This checks how many digits we have
  66. ,buf);
  67. Ptr_buf:=PChar(buf); //We have to change ansistring to a pointer to char PChar == PGChar
  68. gtk_label_set_text (label_l, Ptr_buf);
  69. End;
  70. Var
  71. window,
  72. frame,
  73. hbox,
  74. main_vbox,
  75. vbox,
  76. vbox2,
  77. spinner,
  78. button,
  79. label_l,
  80. val_label : PGtkWidget;
  81. adj : PGtkAdjustment;
  82. Begin
  83. // Initialise GTK
  84. gtk_set_locale ();
  85. gtk_init(@argc, @argv);
  86. gtk_rc_init;
  87. window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  88. gtk_signal_connect (GTK_OBJECT (window), 'destroy',
  89. GTK_SIGNAL_FUNC (@gtk_main_quit),
  90. NULL);
  91. gtk_window_set_title (GTK_WINDOW (window), 'Spin Button');
  92. main_vbox := gtk_vbox_new (FALSE, 5);
  93. gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
  94. gtk_container_add (GTK_CONTAINER (window), main_vbox);
  95. frame := gtk_frame_new ('Not accelerated');
  96. gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
  97. vbox := gtk_vbox_new (FALSE, 0);
  98. gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
  99. gtk_container_add (GTK_CONTAINER (frame), vbox);
  100. // Day, month, year spinners
  101. hbox := gtk_hbox_new (FALSE, 0);
  102. gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
  103. vbox2 := gtk_vbox_new (FALSE, 0);
  104. gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
  105. label_l := gtk_label_new ('Day :');
  106. gtk_misc_set_alignment (GTK_MISC (label_l), 0, 0.5);
  107. gtk_box_pack_start (GTK_BOX (vbox2), label_l, FALSE, TRUE, 0);
  108. adj := PGtkAdjustment ( gtk_adjustment_new (1.0, 1.0, 31.0, 1.0,
  109. 5.0, 0.0));
  110. spinner := gtk_spin_button_new (adj, 0, 0);
  111. gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
  112. gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
  113. GTK_SHADOW_OUT);
  114. gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
  115. vbox2 := gtk_vbox_new (FALSE, 0);
  116. gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
  117. label_l := gtk_label_new ('Month :');
  118. gtk_misc_set_alignment (GTK_MISC (label_l), 0, 0.5);
  119. gtk_box_pack_start (GTK_BOX (vbox2), label_l, FALSE, TRUE, 0);
  120. adj := PGtkAdjustment (gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
  121. 5.0, 0.0));
  122. spinner := gtk_spin_button_new (adj, 0, 0);
  123. gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
  124. gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
  125. GTK_SHADOW_ETCHED_IN);
  126. gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
  127. vbox2 := gtk_vbox_new (FALSE, 0);
  128. gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
  129. label_l := gtk_label_new ('Year :');
  130. gtk_misc_set_alignment (GTK_MISC (label_l), 0, 0.5);
  131. gtk_box_pack_start (GTK_BOX (vbox2), label_l, FALSE, TRUE, 0);
  132. adj := PGtkAdjustment (gtk_adjustment_new (1998.0, 0.0, 2100.0,
  133. 1.0, 100.0, 0.0));
  134. spinner := gtk_spin_button_new (adj, 0, 0);
  135. gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), FALSE);
  136. gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
  137. GTK_SHADOW_IN);
  138. gtk_widget_set_usize (spinner, 55, 0);
  139. gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
  140. frame := gtk_frame_new ('Accelerated');
  141. gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
  142. vbox := gtk_vbox_new (FALSE, 0);
  143. gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
  144. gtk_container_add (GTK_CONTAINER (frame), vbox);
  145. hbox := gtk_hbox_new (FALSE, 0);
  146. gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
  147. vbox2 := gtk_vbox_new (FALSE, 0);
  148. gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
  149. label_l := gtk_label_new ('Value :');
  150. gtk_misc_set_alignment (GTK_MISC (label_l), 0, 0.5);
  151. gtk_box_pack_start (GTK_BOX (vbox2), label_l, FALSE, TRUE, 0);
  152. adj := PGtkAdjustment (gtk_adjustment_new (0.0, -10000.0, 10000.0,
  153. 0.5, 100.0, 0.0));
  154. spinner1 := gtk_spin_button_new (adj, 1.0, 2);
  155. gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
  156. gtk_widget_set_usize (spinner1, 100, 0);
  157. gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
  158. vbox2 := gtk_vbox_new (FALSE, 0);
  159. gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
  160. label_l := gtk_label_new ('Digits :');
  161. gtk_misc_set_alignment (GTK_MISC (label_l), 0, 0.5);
  162. gtk_box_pack_start (GTK_BOX (vbox2), label_l, FALSE, TRUE, 0);
  163. adj := PGtkAdjustment (gtk_adjustment_new (2, 1, 5, 1, 1, 0));
  164. spinner2 := gtk_spin_button_new (adj, 0.0, 0);
  165. gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner2), TRUE);
  166. gtk_signal_connect (GTK_OBJECT (adj), 'value_changed',
  167. GTK_SIGNAL_FUNC (@change_digits),
  168. gpointer (spinner2));
  169. gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
  170. hbox := gtk_hbox_new (FALSE, 0);
  171. gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
  172. button := gtk_check_button_new_with_label ('Snap to 0.5-ticks');
  173. gtk_signal_connect (GTK_OBJECT (button), 'clicked',
  174. GTK_SIGNAL_FUNC (@toggle_snap),
  175. spinner1);
  176. gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
  177. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
  178. button := gtk_check_button_new_with_label ('Numeric only input mode');
  179. gtk_signal_connect (GTK_OBJECT (button), 'clicked',
  180. GTK_SIGNAL_FUNC (@toggle_numeric),
  181. spinner1);
  182. gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
  183. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
  184. val_label := gtk_label_new ('');
  185. hbox := gtk_hbox_new (FALSE, 0);
  186. gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
  187. button := gtk_button_new_with_label ('Value as Int');
  188. gtk_object_set_user_data (GTK_OBJECT (button), val_label);
  189. gtk_signal_connect (GTK_OBJECT (button), 'clicked',
  190. GTK_SIGNAL_FUNC (@get_value),@a);
  191. gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
  192. button := gtk_button_new_with_label ('Value as Float');
  193. gtk_object_set_user_data (GTK_OBJECT (button), val_label);
  194. gtk_signal_connect (GTK_OBJECT (button), 'clicked',
  195. GTK_SIGNAL_FUNC (@get_value),@b);
  196. gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
  197. gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
  198. gtk_label_set_text (GTK_LABEL (val_label), '0');
  199. hbox := gtk_hbox_new (FALSE, 0);
  200. gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
  201. button := gtk_button_new_with_label ('Close');
  202. gtk_signal_connect_object (GTK_OBJECT (button), 'clicked',
  203. GTK_SIGNAL_FUNC (@gtk_widget_destroy),
  204. GTK_OBJECT (window));
  205. gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
  206. gtk_widget_show_all (window);
  207. // Enter the event loop
  208. gtk_main ();
  209. End.