]> Pileus Git - ~andy/gtk/blob - examples/spinbutton/spinbutton.c
a27e7e357de53eb51dea5e947b57fad1cd46857c
[~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 = gtk_adjustment_new (1.0, 1.0, 31.0, 1.0, 5.0, 0.0);
96   spinner = gtk_spin_button_new (adj, 0, 0);
97   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
98   gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
99
100   vbox2 = gtk_vbox_new (FALSE, 0);
101   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
102
103   label = gtk_label_new ("Month :");
104   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
105   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
106
107   adj = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0, 5.0, 0.0);
108   spinner = gtk_spin_button_new (adj, 0, 0);
109   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
110   gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
111
112   vbox2 = gtk_vbox_new (FALSE, 0);
113   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
114
115   label = gtk_label_new ("Year :");
116   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
117   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
118
119   adj = gtk_adjustment_new (1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0);
120   spinner = gtk_spin_button_new (adj, 0, 0);
121   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), FALSE);
122   gtk_widget_set_size_request (spinner, 55, -1);
123   gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
124
125   frame = gtk_frame_new ("Accelerated");
126   gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
127
128   vbox = gtk_vbox_new (FALSE, 0);
129   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
130   gtk_container_add (GTK_CONTAINER (frame), vbox);
131
132   hbox = gtk_hbox_new (FALSE, 0);
133   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
134
135   vbox2 = gtk_vbox_new (FALSE, 0);
136   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
137
138   label = gtk_label_new ("Value :");
139   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
140   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
141
142   adj = gtk_adjustment_new (0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0);
143   spinner1 = gtk_spin_button_new (adj, 1.0, 2);
144   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
145   gtk_widget_set_size_request (spinner1, 100, -1);
146   gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
147
148   vbox2 = gtk_vbox_new (FALSE, 0);
149   gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
150
151   label = gtk_label_new ("Digits :");
152   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
153   gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
154
155   adj = gtk_adjustment_new (2, 1, 5, 1, 1, 0);
156   spinner2 = gtk_spin_button_new (adj, 0.0, 0);
157   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner2), TRUE);
158   g_signal_connect (adj, "value-changed",
159                     G_CALLBACK (change_digits),
160                     spinner2);
161   gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
162
163   hbox = gtk_hbox_new (FALSE, 0);
164   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
165
166   button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
167   g_signal_connect (button, "clicked",
168                     G_CALLBACK (toggle_snap),
169                     spinner1);
170   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
171   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
172
173   button = gtk_check_button_new_with_label ("Numeric only input mode");
174   g_signal_connect (button, "clicked",
175                     G_CALLBACK (toggle_numeric),
176                     spinner1);
177   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
178   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
179
180   val_label = gtk_label_new ("");
181
182   hbox = gtk_hbox_new (FALSE, 0);
183   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
184   button = gtk_button_new_with_label ("Value as Int");
185   g_object_set_data (G_OBJECT (button), "user_data", val_label);
186   g_signal_connect (button, "clicked",
187                     G_CALLBACK (get_value),
188                     GINT_TO_POINTER (1));
189   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
190
191   button = gtk_button_new_with_label ("Value as Float");
192   g_object_set_data (G_OBJECT (button), "user_data", val_label);
193   g_signal_connect (button, "clicked",
194                     G_CALLBACK (get_value),
195                     GINT_TO_POINTER (2));
196   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
197
198   gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
199   gtk_label_set_text (GTK_LABEL (val_label), "0");
200
201   hbox = gtk_hbox_new (FALSE, 0);
202   gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
203
204   button = gtk_button_new_with_label ("Close");
205   g_signal_connect_swapped (button, "clicked",
206                             G_CALLBACK (gtk_widget_destroy),
207                             window);
208   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
209
210   gtk_widget_show_all (window);
211
212   /* Enter the event loop */
213   gtk_main ();
214
215   return 0;
216 }
217