]> Pileus Git - ~andy/gtk/blob - examples/spinbutton/spinbutton.c
updated the (quite outdated) examples to use canonical signal names as
[~andy/gtk] / examples / spinbutton / spinbutton.c
1
2 #include <stdio.h>
3 #include <gtk/gtk.h>
4
5 static GtkWidget *spinner1;
6
7 static void toggle_snap( GtkWidget     *widget,
8                          GtkSpinButton *spin )
9 {
10   gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
11 }
12
13 static void toggle_numeric( GtkWidget *widget,
14                             GtkSpinButton *spin )
15 {
16   gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
17 }
18
19 static void change_digits( GtkWidget *widget,
20                            GtkSpinButton *spin )
21 {
22   gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
23                               gtk_spin_button_get_value_as_int (spin));
24 }
25
26 static void get_value( GtkWidget *widget,
27                        gpointer data )
28 {
29   gchar *buf;
30   GtkLabel *label;
31   GtkSpinButton *spin;
32
33   spin = GTK_SPIN_BUTTON (spinner1);
34   label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
35   if (GPOINTER_TO_INT (data) == 1)
36     buf = g_strdup_printf ("%d", gtk_spin_button_get_value_as_int (spin));
37   else
38     buf = g_strdup_printf ("%0.*f", spin->digits,
39                            gtk_spin_button_get_value (spin));
40   gtk_label_set_text (label, buf);
41   g_free (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 (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 (adj, "value-changed",
163                     G_CALLBACK (change_digits),
164                     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 (button, "clicked",
172                     G_CALLBACK (toggle_snap),
173                     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 (button, "clicked",
179                     G_CALLBACK (toggle_numeric),
180                     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 (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 (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 (button, "clicked",
210                             G_CALLBACK (gtk_widget_destroy),
211                             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