]> Pileus Git - ~andy/gtk/blob - examples/spinbutton/spinbutton.c
Fixes #136082 and #135265, patch by Morten Welinder.
[~andy/gtk] / examples / spinbutton / spinbutton.c
1
2 #include <config.h>
3 #include <stdio.h>
4 #include <gtk/gtk.h>
5
6 static GtkWidget *spinner1;
7
8 void toggle_snap( GtkWidget     *widget,
9                   GtkSpinButton *spin )
10 {
11   gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
12 }
13
14 void toggle_numeric( GtkWidget *widget,
15                      GtkSpinButton *spin )
16 {
17   gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
18 }
19
20 void change_digits( GtkWidget *widget,
21                     GtkSpinButton *spin )
22 {
23   gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
24                               gtk_spin_button_get_value_as_int (spin));
25 }
26
27 void get_value( GtkWidget *widget,
28                 gpointer data )
29 {
30   gchar buf[32];
31   GtkLabel *label;
32   GtkSpinButton *spin;
33
34   spin = GTK_SPIN_BUTTON (spinner1);
35   label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
36   if (GPOINTER_TO_INT (data) == 1)
37     sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
38   else
39     sprintf (buf, "%0.*f", spin->digits,
40              gtk_spin_button_get_value (spin));
41   gtk_label_set_text (label, buf);
42 }
43
44
45 int main( int   argc,
46           char *argv[] )
47 {
48   GtkWidget *window;
49   GtkWidget *frame;
50   GtkWidget *hbox;
51   GtkWidget *main_vbox;
52   GtkWidget *vbox;
53   GtkWidget *vbox2;
54   GtkWidget *spinner2;
55   GtkWidget *spinner;
56   GtkWidget *button;
57   GtkWidget *label;
58   GtkWidget *val_label;
59   GtkAdjustment *adj;
60
61   /* Initialise GTK */
62   gtk_init (&argc, &argv);
63
64   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
65
66   g_signal_connect (G_OBJECT (window), "destroy",
67                     G_CALLBACK (gtk_main_quit),
68                     NULL);
69
70   gtk_window_set_title (GTK_WINDOW (window), "Spin Button");
71
72   main_vbox = gtk_vbox_new (FALSE, 5);
73   gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
74   gtk_container_add (GTK_CONTAINER (window), main_vbox);
75   
76   frame = gtk_frame_new ("Not accelerated");
77   gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
78   
79   vbox = gtk_vbox_new (FALSE, 0);
80   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
81   gtk_container_add (GTK_CONTAINER (frame), vbox);
82   
83   /* Day, month, year spinners */
84   
85   hbox = gtk_hbox_new (FALSE, 0);
86   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
87   
88   vbox2 = gtk_vbox_new (FALSE, 0);
89   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
90   
91   label = gtk_label_new ("Day :");
92   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
93   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
94   
95   adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 31.0, 1.0,
96                                               5.0, 0.0);
97   spinner = gtk_spin_button_new (adj, 0, 0);
98   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
99   gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
100   
101   vbox2 = gtk_vbox_new (FALSE, 0);
102   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
103   
104   label = gtk_label_new ("Month :");
105   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
106   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
107   
108   adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.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_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
113   
114   vbox2 = gtk_vbox_new (FALSE, 0);
115   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
116   
117   label = gtk_label_new ("Year :");
118   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
119   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
120   
121   adj = (GtkAdjustment *) gtk_adjustment_new (1998.0, 0.0, 2100.0,
122                                               1.0, 100.0, 0.0);
123   spinner = gtk_spin_button_new (adj, 0, 0);
124   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), FALSE);
125   gtk_widget_set_size_request (spinner, 55, -1);
126   gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
127   
128   frame = gtk_frame_new ("Accelerated");
129   gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
130   
131   vbox = gtk_vbox_new (FALSE, 0);
132   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
133   gtk_container_add (GTK_CONTAINER (frame), vbox);
134   
135   hbox = gtk_hbox_new (FALSE, 0);
136   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
137   
138   vbox2 = gtk_vbox_new (FALSE, 0);
139   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
140   
141   label = gtk_label_new ("Value :");
142   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
143   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
144   
145   adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
146                                               0.5, 100.0, 0.0);
147   spinner1 = gtk_spin_button_new (adj, 1.0, 2);
148   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
149   gtk_widget_set_size_request (spinner1, 100, -1);
150   gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
151   
152   vbox2 = gtk_vbox_new (FALSE, 0);
153   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
154   
155   label = gtk_label_new ("Digits :");
156   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
157   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
158   
159   adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 5, 1, 1, 0);
160   spinner2 = gtk_spin_button_new (adj, 0.0, 0);
161   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner2), TRUE);
162   g_signal_connect (G_OBJECT (adj), "value_changed",
163                     G_CALLBACK (change_digits),
164                     (gpointer) spinner2);
165   gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
166   
167   hbox = gtk_hbox_new (FALSE, 0);
168   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
169   
170   button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
171   g_signal_connect (G_OBJECT (button), "clicked",
172                     G_CALLBACK (toggle_snap),
173                     (gpointer) spinner1);
174   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
175   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
176   
177   button = gtk_check_button_new_with_label ("Numeric only input mode");
178   g_signal_connect (G_OBJECT (button), "clicked",
179                     G_CALLBACK (toggle_numeric),
180                     (gpointer) spinner1);
181   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
182   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
183   
184   val_label = gtk_label_new ("");
185   
186   hbox = gtk_hbox_new (FALSE, 0);
187   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
188   button = gtk_button_new_with_label ("Value as Int");
189   g_object_set_data (G_OBJECT (button), "user_data", val_label);
190   g_signal_connect (G_OBJECT (button), "clicked",
191                     G_CALLBACK (get_value),
192                     GINT_TO_POINTER (1));
193   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
194   
195   button = gtk_button_new_with_label ("Value as Float");
196   g_object_set_data (G_OBJECT (button), "user_data", val_label);
197   g_signal_connect (G_OBJECT (button), "clicked",
198                     G_CALLBACK (get_value),
199                     GINT_TO_POINTER (2));
200   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
201   
202   gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
203   gtk_label_set_text (GTK_LABEL (val_label), "0");
204   
205   hbox = gtk_hbox_new (FALSE, 0);
206   gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
207   
208   button = gtk_button_new_with_label ("Close");
209   g_signal_connect_swapped (G_OBJECT (button), "clicked",
210                             G_CALLBACK (gtk_widget_destroy),
211                             G_OBJECT (window));
212   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
213
214   gtk_widget_show_all (window);
215
216   /* Enter the event loop */
217   gtk_main ();
218     
219   return 0;
220 }
221