]> Pileus Git - ~andy/gtk/blob - tests/testboxcss.c
Updated POTFILES.skip
[~andy/gtk] / tests / testboxcss.c
1 /* testbox.c
2  *
3  * Copyright (C) 2010 Benjamin Otte <otte@gnome.ogr>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 #include "config.h"
21 #include <gtk/gtk.h>
22 #include "prop-editor.h"
23
24 /* This is exactly the style information you've been looking for */
25 #define GTK_STYLE_PROVIDER_PRIORITY_FORCE G_MAXUINT
26
27 #define DEFAULT_CSS \
28   ".play {\n" \
29   "  engine: none;\n" \
30   "  background-image: none;\n" \
31   "  background-color: red;\n" \
32   "  border-color: black;\n" \
33   "  border-radius: 0;\n" \
34   "}\n" \
35   "\n" \
36   ".play:nth-child(even) {\n" \
37   "  background-color: yellow;\n" \
38   "  color: green;\n" \
39   "}\n" \
40   "\n" \
41   ".play:nth-child(first) {\n" \
42   "  border-radius: 5 0 0 5;\n" \
43   "}\n" \
44   "\n" \
45   ".play:nth-child(last) {\n" \
46   "  border-radius: 0 5 5 0;\n" \
47   "}\n" \
48   "\n"
49
50 static void
51 show_parsing_error (GtkCssProvider *provider,
52                     GtkCssSection  *section,
53                     const GError   *error,
54                     GtkTextBuffer  *buffer)
55 {
56   GtkTextIter start, end;
57   const char *tag_name;
58
59   gtk_text_buffer_get_iter_at_line_index (buffer,
60                                           &start,
61                                           gtk_css_section_get_start_line (section),
62                                           gtk_css_section_get_start_position (section));
63   gtk_text_buffer_get_iter_at_line_index (buffer,
64                                           &end,
65                                           gtk_css_section_get_end_line (section),
66                                           gtk_css_section_get_end_position (section));
67
68   if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
69     tag_name = "warning";
70   else
71     tag_name = "error";
72
73   gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
74 }
75                     
76 static void
77 css_text_changed (GtkTextBuffer  *buffer,
78                   GtkCssProvider *provider)
79 {
80   GtkTextIter start, end;
81   char *text;
82
83   gtk_text_buffer_get_start_iter (buffer, &start);
84   gtk_text_buffer_get_end_iter (buffer, &end);
85   gtk_text_buffer_remove_all_tags (buffer, &start, &end);
86
87   text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
88   gtk_css_provider_load_from_data (provider, text, -1, NULL);
89   g_free (text);
90
91   gtk_style_context_reset_widgets (gdk_screen_get_default ());
92 }
93
94 static void
95 remove_widget (GtkWidget *widget)
96 {
97   gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (widget)), widget);
98 }
99
100 static int count = 0;
101
102 static void
103 add_button (GtkBox *box)
104 {
105   GtkWidget* button;
106   char *text;
107
108   text = g_strdup_printf ("Remove %d", ++count);
109   button = (GtkWidget *)gtk_button_new_from_stock (text);
110   g_free (text);
111   gtk_style_context_add_class (gtk_widget_get_style_context (button), "play");
112   g_signal_connect_swapped (button,
113                             "clicked",
114                             G_CALLBACK (remove_widget),
115                             button);
116   gtk_widget_show (button);
117   gtk_container_add (GTK_CONTAINER (box), button);
118 }
119
120 static void
121 add_toolbutton (GtkToolbar *toolbar)
122 {
123   GtkWidget* button;
124   char *text;
125
126   text = g_strdup_printf ("Remove %d", ++count);
127   button = (GtkWidget *)gtk_tool_button_new (NULL, text);
128   g_free (text);
129   gtk_style_context_add_class (gtk_widget_get_style_context (button), "play");
130   g_signal_connect_swapped (button,
131                             "clicked",
132                             G_CALLBACK (remove_widget),
133                             button);
134   gtk_widget_show (button);
135   gtk_container_add (GTK_CONTAINER (toolbar), button);
136 }
137
138 static void
139 set_orientation (GtkSwitch *switch_)
140 {
141   gtk_widget_set_default_direction (gtk_switch_get_active (switch_) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL);
142 }
143
144 gint
145 main (gint argc, gchar **argv)
146 {
147   GtkWidget *window, *main_box, *container, *child;
148   GtkWidget *box, *toolbar;
149   GtkStyleProvider *provider;
150   GtkTextBuffer *css;
151   
152   gtk_init (&argc, &argv);
153
154   css = gtk_text_buffer_new (NULL);
155   gtk_text_buffer_create_tag (css,
156                               "warning",
157                               "background", "rgba(255,255,0,0.3)",
158                               NULL);
159   gtk_text_buffer_create_tag (css,
160                               "error",
161                               "background", "rgba(255,0,0,0.3)",
162                               NULL);
163
164   provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
165   gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
166                                              provider,
167                                              GTK_STYLE_PROVIDER_PRIORITY_FORCE);
168   
169   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
170
171   g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
172   g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL);
173
174   main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
175   gtk_container_add (GTK_CONTAINER (window), main_box);
176
177   toolbar = gtk_toolbar_new ();
178   gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_TEXT);
179   gtk_box_pack_start (GTK_BOX (main_box), toolbar, FALSE, TRUE, 0);
180
181   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
182   gtk_box_pack_start (GTK_BOX (main_box), box, FALSE, TRUE, 0);
183
184   container = gtk_scrolled_window_new (NULL, NULL);
185   gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW (container), 200);
186   gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (container), 200);
187   gtk_box_pack_start (GTK_BOX (main_box), container, TRUE, TRUE, 0);
188   child = gtk_text_view_new_with_buffer (css);
189   gtk_container_add (GTK_CONTAINER (container), child);
190   g_signal_connect (css,
191                     "changed",
192                     G_CALLBACK (css_text_changed),
193                     provider);
194   gtk_text_buffer_set_text (css,
195                             DEFAULT_CSS,
196                             -1);
197   g_signal_connect (provider,
198                     "parsing-error",
199                     G_CALLBACK (show_parsing_error),
200                     gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
201
202   container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
203   gtk_box_pack_start (GTK_BOX (main_box), container, FALSE, TRUE, 0);
204   child = gtk_switch_new ();
205   gtk_switch_set_active (GTK_SWITCH (child), gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR);
206   g_signal_connect (child,
207                     "notify::active",
208                     G_CALLBACK (set_orientation),
209                     NULL);
210   gtk_box_pack_start (GTK_BOX (container), child, FALSE, FALSE, 0);
211   child = gtk_label_new ("left-to-right");
212   gtk_box_pack_start (GTK_BOX (container), child, FALSE, FALSE, 0);
213   child = gtk_button_new_with_label ("Add button");
214   g_signal_connect_swapped (child,
215                             "clicked",
216                             G_CALLBACK (add_button),
217                             box);
218   gtk_box_pack_end (GTK_BOX (container), child, FALSE, FALSE, 0);
219   child = gtk_button_new_with_label ("Add toolbutton");
220   g_signal_connect_swapped (child,
221                             "clicked",
222                             G_CALLBACK (add_toolbutton),
223                             toolbar);
224   gtk_box_pack_end (GTK_BOX (container), child, FALSE, FALSE, 0);
225
226   add_toolbutton (GTK_TOOLBAR (toolbar));
227   add_toolbutton (GTK_TOOLBAR (toolbar));
228   add_toolbutton (GTK_TOOLBAR (toolbar));
229   add_toolbutton (GTK_TOOLBAR (toolbar));
230
231   add_button (GTK_BOX (box));
232   add_button (GTK_BOX (box));
233   add_button (GTK_BOX (box));
234   add_button (GTK_BOX (box));
235
236   gtk_widget_show_all (window);
237
238   gtk_main ();
239   
240   return 0;
241 }