]> Pileus Git - ~andy/gtk/blob - tests/testscrolledwindow.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testscrolledwindow.c
1 #include <gtk/gtk.h>
2
3
4 static void
5 horizontal_policy_changed (GtkComboBox *combo_box,
6                            GtkViewport *viewport)
7 {
8   GtkScrollablePolicy policy = gtk_combo_box_get_active (combo_box);
9
10   gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (viewport), policy);
11 }
12
13 static void
14 vertical_policy_changed (GtkComboBox *combo_box,
15                          GtkViewport *viewport)
16 {
17   GtkScrollablePolicy policy = gtk_combo_box_get_active (combo_box);
18
19   gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (viewport), policy);
20 }
21
22 static void
23 label_flip_changed (GtkComboBox *combo_box,
24                     GtkLabel    *label)
25 {
26   gint active = gtk_combo_box_get_active (combo_box);
27
28   if (active == 0)
29     gtk_label_set_angle (label, 0.0);
30   else 
31     gtk_label_set_angle (label, 90.0);
32 }
33
34 static void
35 content_width_changed (GtkSpinButton *spin_button,
36                        gpointer       data)
37 {
38   GtkScrolledWindow *swindow = data;
39   gdouble value;
40
41   value = gtk_spin_button_get_value (spin_button);
42   gtk_scrolled_window_set_min_content_width (swindow, (gint)value);
43 }
44
45 static void
46 content_height_changed (GtkSpinButton *spin_button,
47                         gpointer       data)
48 {
49   GtkScrolledWindow *swindow = data;
50   gdouble value;
51
52   value = gtk_spin_button_get_value (spin_button);
53   gtk_scrolled_window_set_min_content_height (swindow, (gint)value);
54 }
55
56 static void
57 kinetic_scrolling_changed (GtkToggleButton *toggle_button,
58                            gpointer         data)
59 {
60   GtkScrolledWindow *swindow = data;
61   gboolean enabled = gtk_toggle_button_get_active (toggle_button);
62
63   gtk_scrolled_window_set_kinetic_scrolling (swindow, enabled);
64 }
65
66 static void
67 scrollable_policy (void)
68 {
69   GtkWidget *window, *swindow, *hbox, *vbox, *frame, *cntl;
70   GtkWidget *viewport, *label, *expander, *widget;
71
72   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
73   hbox   = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
74   vbox   = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
75
76   gtk_container_set_border_width (GTK_CONTAINER (window), 8);
77
78   gtk_widget_show (vbox);
79   gtk_widget_show (hbox);
80   gtk_container_add (GTK_CONTAINER (window), hbox);
81   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
82
83   frame = gtk_frame_new ("Scrolled Window");
84   gtk_widget_show (frame);
85   gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
86
87   swindow = gtk_scrolled_window_new (NULL, NULL);
88   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
89                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
90   
91   gtk_widget_show (swindow);
92   gtk_container_add (GTK_CONTAINER (frame), swindow);
93
94   viewport = gtk_viewport_new (NULL, NULL);
95   label = gtk_label_new ("Here is a wrapping label with a minimum width-chars of 40 and "
96                          "a natural max-width-chars of 100 to demonstrate the usage of "
97                          "scrollable widgets \"hscroll-policy\" and \"vscroll-policy\" "
98                          "properties. Note also that when playing with the window height, "
99                          "one can observe that the vscrollbar disappears as soon as there "
100                          "is enough height to fit the content vertically if the window were "
101                          "to be allocated a width without a vscrollbar present");
102
103   gtk_label_set_line_wrap  (GTK_LABEL (label), TRUE);
104   gtk_label_set_width_chars  (GTK_LABEL (label), 40);
105   gtk_label_set_max_width_chars  (GTK_LABEL (label), 100);
106
107   gtk_widget_show (label);
108   gtk_widget_show (viewport);
109   gtk_container_add (GTK_CONTAINER (viewport), label);
110   gtk_container_add (GTK_CONTAINER (swindow), viewport);
111
112   /* Add controls here */
113   expander = gtk_expander_new ("Controls");
114   gtk_expander_set_expanded (GTK_EXPANDER (expander), TRUE);
115   cntl = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
116   gtk_widget_show (cntl);
117   gtk_widget_show (expander);
118   gtk_container_add (GTK_CONTAINER (expander), cntl);
119   gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 0);
120
121   /* Add Horizontal policy control here */
122   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
123   gtk_widget_show (hbox);
124
125   widget = gtk_label_new ("hscroll-policy");
126   gtk_widget_show (widget);
127   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
128
129   widget = gtk_combo_box_text_new ();
130   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Minimum");
131   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Natural");
132   gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
133   gtk_widget_show (widget);
134
135   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
136   gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
137
138   g_signal_connect (G_OBJECT (widget), "changed",
139                     G_CALLBACK (horizontal_policy_changed), viewport);
140
141   /* Add Vertical policy control here */
142   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
143   gtk_widget_show (hbox);
144
145   widget = gtk_label_new ("vscroll-policy");
146   gtk_widget_show (widget);
147   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
148
149   widget = gtk_combo_box_text_new ();
150   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Minimum");
151   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Natural");
152   gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
153   gtk_widget_show (widget);
154
155   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
156   gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
157
158   g_signal_connect (G_OBJECT (widget), "changed",
159                     G_CALLBACK (vertical_policy_changed), viewport);
160
161   /* Content size controls */
162   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
163
164   widget = gtk_label_new ("min-content-width");
165   gtk_widget_show (widget);
166   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
167
168   widget = gtk_spin_button_new_with_range (100.0, 1000.0, 10.0);
169   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
170   gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
171   gtk_widget_show (widget);
172   gtk_widget_show (hbox);
173
174   g_signal_connect (G_OBJECT (widget), "value-changed",
175                     G_CALLBACK (content_width_changed), swindow);
176
177   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
178
179   widget = gtk_label_new ("min-content-height");
180   gtk_widget_show (widget);
181   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
182
183   widget = gtk_spin_button_new_with_range (100.0, 1000.0, 10.0);
184   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
185   gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
186   gtk_widget_show (widget);
187   gtk_widget_show (hbox);
188
189   g_signal_connect (G_OBJECT (widget), "value-changed",
190                     G_CALLBACK (content_height_changed), swindow);
191
192   /* Add Label orientation control here */
193   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
194   gtk_widget_show (hbox);
195
196   widget = gtk_label_new ("label-flip");
197   gtk_widget_show (widget);
198   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
199
200   widget = gtk_combo_box_text_new ();
201   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Horizontal");
202   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Vertical");
203   gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
204   gtk_widget_show (widget);
205
206   gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
207   gtk_box_pack_start (GTK_BOX (cntl), hbox, FALSE, FALSE, 0);
208
209   g_signal_connect (G_OBJECT (widget), "changed",
210                     G_CALLBACK (label_flip_changed), label);
211
212   /* Add Kinetic scrolling control here */
213   widget = gtk_check_button_new_with_label ("Kinetic scrolling");
214   gtk_widget_show (widget);
215   gtk_box_pack_start (GTK_BOX (cntl), widget, TRUE, TRUE, 0);
216   g_signal_connect (G_OBJECT (widget), "toggled",
217                     G_CALLBACK (kinetic_scrolling_changed), swindow);
218
219   gtk_widget_show (window);
220 }
221
222
223 int
224 main (int argc, char *argv[])
225 {
226   gtk_init (NULL, NULL);
227
228   scrollable_policy ();
229
230   gtk_main ();
231
232   return 0;
233 }