diff options
author | Havoc Pennington <hp@redhat.com> | 2000-11-15 23:25:08 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2000-11-15 23:25:08 +0000 |
commit | ac5c0dbc986168216f79d309e15c020b3d39fedf (patch) | |
tree | cc5d964efa37dfd763cac8fb72e6e74e220eb490 /tests | |
parent | 152f160a8a57281d05ebb8612f4291e1a36d98b6 (diff) | |
download | gdk-pixbuf-ac5c0dbc986168216f79d309e15c020b3d39fedf.tar.gz |
Implement essential color cycling feature
2000-11-15 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c: Implement essential color cycling feature
Diffstat (limited to 'tests')
-rw-r--r-- | tests/testtext.c | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/tests/testtext.c b/tests/testtext.c index ec2c5a1a5..e8a6e42f0 100644 --- a/tests/testtext.c +++ b/tests/testtext.c @@ -24,6 +24,9 @@ struct _Buffer GtkTextTag *not_editable_tag; GtkTextTag *found_text_tag; GtkTextTag *custom_tabs_tag; + GSList *color_tags; + guint color_cycle_timeout; + gdouble start_hue; }; struct _View @@ -51,6 +54,9 @@ static void buffer_search_forward (Buffer *buffer, static void buffer_search_backward (Buffer *buffer, const char *str, View *view); +static void buffer_set_colors (Buffer *buffer, + gboolean enabled); +static void buffer_cycle_colors (Buffer *buffer); static View *view_from_widget (GtkWidget *widget); @@ -906,6 +912,16 @@ do_cursor_visible_changed (gpointer callback_data, } static void +do_color_cycle_changed (gpointer callback_data, + guint callback_action, + GtkWidget *widget) +{ + View *view = view_from_widget (widget); + + buffer_set_colors (view->buffer, callback_action); +} + +static void do_apply_editable (gpointer callback_data, guint callback_action, GtkWidget *widget) @@ -986,6 +1002,69 @@ do_apply_tabs (gpointer callback_data, } } +static void +do_apply_colors (gpointer callback_data, + guint callback_action, + GtkWidget *widget) +{ + View *view = view_from_widget (widget); + Buffer *buffer = view->buffer; + GtkTextIter start; + GtkTextIter end; + + if (gtk_text_buffer_get_selection_bounds (view->buffer->buffer, + &start, &end)) + { + if (!callback_action) + { + GSList *tmp; + + tmp = buffer->color_tags; + while (tmp != NULL) + { + gtk_text_buffer_remove_tag (view->buffer->buffer, + tmp->data, + &start, &end); + tmp = g_slist_next (tmp); + } + } + else + { + GSList *tmp; + + tmp = buffer->color_tags; + while (TRUE) + { + GtkTextIter next; + gboolean done = FALSE; + + next = start; + gtk_text_iter_next_char (&next); + gtk_text_iter_next_char (&next); + + if (gtk_text_iter_compare (&next, &end) > 0) + { + next = end; + done = TRUE; + } + + gtk_text_buffer_apply_tag (view->buffer->buffer, + tmp->data, + &start, &next); + + start = next; + + if (done) + return; + + tmp = g_slist_next (tmp); + if (tmp == NULL) + tmp = buffer->color_tags; + } + } + } +} + enum { RESPONSE_FORWARD, @@ -1142,6 +1221,9 @@ static GtkItemFactoryEntry menu_items[] = { "/Settings/sep1", NULL, 0, 0, "<Separator>" }, { "/Settings/Sane spacing", NULL, do_spacing_changed, FALSE, "<RadioItem>" }, { "/Settings/Funky spacing", NULL, do_spacing_changed, TRUE, "/Settings/Sane spacing" }, + { "/Settings/sep1", NULL, 0, 0, "<Separator>" }, + { "/Settings/Don't cycle color tags", NULL, do_color_cycle_changed, FALSE, "<RadioItem>" }, + { "/Settings/Cycle colors", NULL, do_color_cycle_changed, TRUE, "/Settings/Don't cycle color tags" }, { "/_Attributes", NULL, 0, 0, "<Branch>" }, { "/Attributes/Editable", NULL, do_apply_editable, TRUE, NULL }, { "/Attributes/Not editable", NULL, do_apply_editable, FALSE, NULL }, @@ -1149,6 +1231,8 @@ static GtkItemFactoryEntry menu_items[] = { "/Attributes/Visible", NULL, do_apply_invisible, TRUE, NULL }, { "/Attributes/Custom tabs", NULL, do_apply_tabs, FALSE, NULL }, { "/Attributes/Default tabs", NULL, do_apply_tabs, TRUE, NULL }, + { "/Attributes/Color cycles", NULL, do_apply_colors, TRUE, NULL }, + { "/Attributes/No colors", NULL, do_apply_colors, FALSE, NULL }, { "/_Test", NULL, 0, 0, "<Branch>" }, { "/Test/_Example", NULL, do_example, 0, NULL }, }; @@ -1298,11 +1382,14 @@ check_buffer_saved (Buffer *buffer) return TRUE; } +#define N_COLORS 16 + static Buffer * create_buffer (void) { Buffer *buffer; PangoTabArray *tabs; + gint i; buffer = g_new (Buffer, 1); @@ -1312,6 +1399,22 @@ create_buffer (void) buffer->filename = NULL; buffer->untitled_serial = -1; + buffer->color_tags = NULL; + buffer->color_cycle_timeout = 0; + buffer->start_hue = 0.0; + + i = 0; + while (i < N_COLORS) + { + GtkTextTag *tag; + + tag = gtk_text_buffer_create_tag (buffer->buffer, NULL); + + buffer->color_tags = g_slist_prepend (buffer->color_tags, tag); + + ++i; + } + buffer->invisible_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL); gtk_object_set (GTK_OBJECT (buffer->invisible_tag), "invisible", TRUE, @@ -1480,6 +1583,7 @@ buffer_unref (Buffer *buffer) buffer->refcount--; if (buffer->refcount == 0) { + buffer_set_colors (buffer, FALSE); buffers = g_slist_remove (buffers, buffer); gtk_object_unref (GTK_OBJECT (buffer->buffer)); g_free (buffer->filename); @@ -1488,6 +1592,176 @@ buffer_unref (Buffer *buffer) } static void +hsv_to_rgb (gdouble *h, + gdouble *s, + gdouble *v) +{ + gdouble hue, saturation, value; + gdouble f, p, q, t; + + if (*s == 0.0) + { + *h = *v; + *s = *v; + *v = *v; /* heh */ + } + else + { + hue = *h * 6.0; + saturation = *s; + value = *v; + + if (hue >= 6.0) + hue = 0.0; + + f = hue - (int) hue; + p = value * (1.0 - saturation); + q = value * (1.0 - saturation * f); + t = value * (1.0 - saturation * (1.0 - f)); + + switch ((int) hue) + { + case 0: + *h = value; + *s = t; + *v = p; + break; + + case 1: + *h = q; + *s = value; + *v = p; + break; + + case 2: + *h = p; + *s = value; + *v = t; + break; + + case 3: + *h = p; + *s = q; + *v = value; + break; + + case 4: + *h = t; + *s = p; + *v = value; + break; + + case 5: + *h = value; + *s = p; + *v = q; + break; + + default: + g_assert_not_reached (); + } + } +} + +static void +hue_to_color (gdouble hue, + GdkColor *color) +{ + gdouble h, s, v; + + h = hue; + s = 1.0; + v = 1.0; + + g_return_if_fail (hue <= 1.0); + + hsv_to_rgb (&h, &s, &v); + + color->red = h * 65535; + color->green = s * 65535; + color->blue = v * 65535; +} + + +static gint +color_cycle_timeout (gpointer data) +{ + Buffer *buffer = data; + + buffer_cycle_colors (buffer); + + return TRUE; +} + +static void +buffer_set_colors (Buffer *buffer, + gboolean enabled) +{ + GSList *tmp; + gdouble hue = 0.0; + + if (enabled && buffer->color_cycle_timeout == 0) + buffer->color_cycle_timeout = gtk_timeout_add (500, color_cycle_timeout, buffer); + else if (!enabled && buffer->color_cycle_timeout != 0) + { + gtk_timeout_remove (buffer->color_cycle_timeout); + buffer->color_cycle_timeout = 0; + } + + tmp = buffer->color_tags; + while (tmp != NULL) + { + if (enabled) + { + GdkColor color; + + hue_to_color (hue, &color); + + gtk_object_set (GTK_OBJECT (tmp->data), + "foreground_gdk", &color, + NULL); + } + else + gtk_object_set (GTK_OBJECT (tmp->data), + "foreground_set", FALSE, + NULL); + + hue += 1.0 / N_COLORS; + + tmp = g_slist_next (tmp); + } +} + +static void +buffer_cycle_colors (Buffer *buffer) +{ + GSList *tmp; + gdouble hue = buffer->start_hue; + + tmp = buffer->color_tags; + while (tmp != NULL) + { + GdkColor color; + + hue_to_color (hue, &color); + + gtk_object_set (GTK_OBJECT (tmp->data), + "foreground_gdk", &color, + NULL); + + hue += 1.0 / N_COLORS; + if (hue > 1.0) + hue = 0.0; + + tmp = g_slist_next (tmp); + } + + buffer->start_hue += 1.0 / N_COLORS; + if (buffer->start_hue > 1.0) + buffer->start_hue = 0.0; +} + +static void close_view (View *view) { views = g_slist_remove (views, view); |