forked from AuroraMiddleware/gtk
a938c14d11
This library is meant to be the new CSS library that gets used from GDK, GSK and GTK for string printing and parsing. As a first step, move GtkCssProviderError into it. While doing so, split it into GtkCssParserError (for critical problems) and GtkCssParserWarning (for non-critical problems).
238 lines
7.8 KiB
C
238 lines
7.8 KiB
C
/* testbox.c
|
|
*
|
|
* Copyright (C) 2010 Benjamin Otte <otte@gnome.ogr>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "config.h"
|
|
#include <gtk/gtk.h>
|
|
|
|
/* This is exactly the style information you've been looking for */
|
|
#define GTK_STYLE_PROVIDER_PRIORITY_FORCE G_MAXUINT
|
|
|
|
#define DEFAULT_CSS \
|
|
".play {\n" \
|
|
" background-image: none;\n" \
|
|
" background-color: red;\n" \
|
|
" border-color: black;\n" \
|
|
" border-radius: 0px;\n" \
|
|
"}\n" \
|
|
"\n" \
|
|
".play:nth-child(even) {\n" \
|
|
" background-color: yellow;\n" \
|
|
" color: green;\n" \
|
|
"}\n" \
|
|
"\n" \
|
|
".play:nth-child(first) {\n" \
|
|
" border-radius: 5px 0px 0px 5px;\n" \
|
|
"}\n" \
|
|
"\n" \
|
|
".play:nth-child(last) {\n" \
|
|
" border-radius: 0px 5px 5px 0px;\n" \
|
|
"}\n" \
|
|
"\n"
|
|
|
|
static void
|
|
show_parsing_error (GtkCssProvider *provider,
|
|
GtkCssSection *section,
|
|
const GError *error,
|
|
GtkTextBuffer *buffer)
|
|
{
|
|
GtkTextIter start, end;
|
|
const char *tag_name;
|
|
|
|
gtk_text_buffer_get_iter_at_line_index (buffer,
|
|
&start,
|
|
gtk_css_section_get_start_line (section),
|
|
gtk_css_section_get_start_position (section));
|
|
gtk_text_buffer_get_iter_at_line_index (buffer,
|
|
&end,
|
|
gtk_css_section_get_end_line (section),
|
|
gtk_css_section_get_end_position (section));
|
|
|
|
if (error->domain == GTK_CSS_PARSER_WARNING)
|
|
tag_name = "warning";
|
|
else
|
|
tag_name = "error";
|
|
|
|
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
|
}
|
|
|
|
static void
|
|
css_text_changed (GtkTextBuffer *buffer,
|
|
GtkCssProvider *provider)
|
|
{
|
|
GtkTextIter start, end;
|
|
char *text;
|
|
|
|
gtk_text_buffer_get_start_iter (buffer, &start);
|
|
gtk_text_buffer_get_end_iter (buffer, &end);
|
|
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
|
|
|
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
|
gtk_css_provider_load_from_data (provider, text, -1);
|
|
g_free (text);
|
|
}
|
|
|
|
static void
|
|
remove_widget (GtkWidget *widget)
|
|
{
|
|
gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (widget)), widget);
|
|
}
|
|
|
|
static int count = 0;
|
|
|
|
static void
|
|
add_button (GtkBox *box)
|
|
{
|
|
GtkWidget* button;
|
|
char *text;
|
|
|
|
text = g_strdup_printf ("Remove %d", ++count);
|
|
button = (GtkWidget *)gtk_button_new_with_label (text);
|
|
g_free (text);
|
|
gtk_style_context_add_class (gtk_widget_get_style_context (button), "play");
|
|
g_signal_connect_swapped (button,
|
|
"clicked",
|
|
G_CALLBACK (remove_widget),
|
|
button);
|
|
gtk_widget_show (button);
|
|
gtk_container_add (GTK_CONTAINER (box), button);
|
|
}
|
|
|
|
static void
|
|
add_toolbutton (GtkToolbar *toolbar)
|
|
{
|
|
GtkWidget* button;
|
|
char *text;
|
|
|
|
text = g_strdup_printf ("Remove %d", ++count);
|
|
button = (GtkWidget *)gtk_tool_button_new (NULL, text);
|
|
g_free (text);
|
|
gtk_style_context_add_class (gtk_widget_get_style_context (button), "play");
|
|
g_signal_connect_swapped (button,
|
|
"clicked",
|
|
G_CALLBACK (remove_widget),
|
|
button);
|
|
gtk_widget_show (button);
|
|
gtk_container_add (GTK_CONTAINER (toolbar), button);
|
|
}
|
|
|
|
static void
|
|
set_orientation (GtkSwitch *switch_)
|
|
{
|
|
gtk_widget_set_default_direction (gtk_switch_get_active (switch_) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL);
|
|
}
|
|
|
|
gint
|
|
main (gint argc, gchar **argv)
|
|
{
|
|
GtkWidget *window, *main_box, *container, *child;
|
|
GtkWidget *box, *toolbar;
|
|
GtkStyleProvider *provider;
|
|
GtkTextBuffer *css;
|
|
|
|
gtk_init ();
|
|
|
|
css = gtk_text_buffer_new (NULL);
|
|
gtk_text_buffer_create_tag (css,
|
|
"warning",
|
|
"background", "rgba(255,255,0,0.3)",
|
|
NULL);
|
|
gtk_text_buffer_create_tag (css,
|
|
"error",
|
|
"background", "rgba(255,0,0,0.3)",
|
|
NULL);
|
|
|
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
|
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
|
|
provider,
|
|
GTK_STYLE_PROVIDER_PRIORITY_FORCE);
|
|
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
|
|
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
|
|
|
|
main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
|
gtk_container_add (GTK_CONTAINER (window), main_box);
|
|
|
|
toolbar = gtk_toolbar_new ();
|
|
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_TEXT);
|
|
gtk_container_add (GTK_CONTAINER (main_box), toolbar);
|
|
|
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
|
gtk_container_add (GTK_CONTAINER (main_box), box);
|
|
|
|
container = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW (container), 200);
|
|
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (container), 200);
|
|
gtk_widget_set_vexpand (container, TRUE);
|
|
gtk_container_add (GTK_CONTAINER (main_box), container);
|
|
child = gtk_text_view_new_with_buffer (css);
|
|
gtk_container_add (GTK_CONTAINER (container), child);
|
|
g_signal_connect (css,
|
|
"changed",
|
|
G_CALLBACK (css_text_changed),
|
|
provider);
|
|
gtk_text_buffer_set_text (css,
|
|
DEFAULT_CSS,
|
|
-1);
|
|
g_signal_connect (provider,
|
|
"parsing-error",
|
|
G_CALLBACK (show_parsing_error),
|
|
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
|
|
|
container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
|
gtk_container_add (GTK_CONTAINER (main_box), container);
|
|
child = gtk_switch_new ();
|
|
gtk_switch_set_active (GTK_SWITCH (child), gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR);
|
|
g_signal_connect (child,
|
|
"notify::active",
|
|
G_CALLBACK (set_orientation),
|
|
NULL);
|
|
gtk_container_add (GTK_CONTAINER (container), child);
|
|
child = gtk_label_new ("left-to-right");
|
|
gtk_widget_set_hexpand (child, TRUE);
|
|
gtk_widget_set_halign (child, GTK_ALIGN_START);
|
|
gtk_container_add (GTK_CONTAINER (container), child);
|
|
child = gtk_button_new_with_label ("Add toolbutton");
|
|
g_signal_connect_swapped (child,
|
|
"clicked",
|
|
G_CALLBACK (add_toolbutton),
|
|
toolbar);
|
|
gtk_container_add (GTK_CONTAINER (container), child);
|
|
child = gtk_button_new_with_label ("Add button");
|
|
g_signal_connect_swapped (child,
|
|
"clicked",
|
|
G_CALLBACK (add_button),
|
|
box);
|
|
gtk_container_add (GTK_CONTAINER (container), child);
|
|
|
|
add_toolbutton (GTK_TOOLBAR (toolbar));
|
|
add_toolbutton (GTK_TOOLBAR (toolbar));
|
|
add_toolbutton (GTK_TOOLBAR (toolbar));
|
|
add_toolbutton (GTK_TOOLBAR (toolbar));
|
|
|
|
add_button (GTK_BOX (box));
|
|
add_button (GTK_BOX (box));
|
|
add_button (GTK_BOX (box));
|
|
add_button (GTK_BOX (box));
|
|
|
|
gtk_widget_show (window);
|
|
|
|
gtk_main ();
|
|
|
|
return 0;
|
|
}
|