diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-03-03 16:47:55 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-03-03 16:49:49 -0500 |
commit | 77e46de0e173fda917d1141ccfe69ce668a81b31 (patch) | |
tree | f50c785c244b4fdfdb75b1639e15b7ef0cae7e21 /gtk/gtkscale.c | |
parent | 2a9d130ed207bb83dc4ac7ab4510b13e8d60f84d (diff) | |
download | gtk+-77e46de0e173fda917d1141ccfe69ce668a81b31.tar.gz |
GtkScale: Add style classes for marks
This enables better styling of the slider in the presence of
marks. Based on a patch by Bastien Nocera,
https://bugzilla.gnome.org/show_bug.cgi?id=643685
Diffstat (limited to 'gtk/gtkscale.c')
-rw-r--r-- | gtk/gtkscale.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c index a9a9880006..95ce6bab47 100644 --- a/gtk/gtkscale.c +++ b/gtk/gtkscale.c @@ -77,7 +77,6 @@ * unrelated code portions otherwise */ - typedef struct _GtkScaleMark GtkScaleMark; struct _GtkScalePrivate @@ -1459,6 +1458,7 @@ void gtk_scale_clear_marks (GtkScale *scale) { GtkScalePrivate *priv; + GtkStyleContext *context; g_return_if_fail (GTK_IS_SCALE (scale)); @@ -1468,6 +1468,10 @@ gtk_scale_clear_marks (GtkScale *scale) g_slist_free (priv->marks); priv->marks = NULL; + context = gtk_widget_get_style_context (GTK_WIDGET (scale)); + gtk_style_context_remove_class (context, GTK_STYLE_CLASS_SCALE_HAS_MARKS_BELOW); + gtk_style_context_remove_class (context, GTK_STYLE_CLASS_SCALE_HAS_MARKS_ABOVE); + _gtk_range_set_stop_values (GTK_RANGE (scale), NULL, 0); gtk_widget_queue_resize (GTK_WIDGET (scale)); @@ -1518,6 +1522,8 @@ gtk_scale_add_mark (GtkScale *scale, GSList *m; gdouble *values; gint n, i; + GtkStyleContext *context; + int all_pos; g_return_if_fail (GTK_IS_SCALE (scale)); @@ -1531,22 +1537,44 @@ gtk_scale_add_mark (GtkScale *scale, mark->position = GTK_POS_TOP; else mark->position = GTK_POS_BOTTOM; - + priv->marks = g_slist_insert_sorted (priv->marks, mark, (GCompareFunc) compare_marks); +#define MARKS_ABOVE 1 +#define MARKS_BELOW 2 + + all_pos = 0; n = g_slist_length (priv->marks); values = g_new (gdouble, n); for (m = priv->marks, i = 0; m; m = m->next, i++) { mark = m->data; values[i] = mark->value; + if (mark->position == GTK_POS_TOP) + all_pos |= MARKS_ABOVE; + else + all_pos |= MARKS_BELOW; } - + _gtk_range_set_stop_values (GTK_RANGE (scale), values, n); g_free (values); + /* Set the style classes for the slider, so it could + * point to the right direction when marks are present + */ + context = gtk_widget_get_style_context (GTK_WIDGET (scale)); + + if (all_pos & MARKS_ABOVE) + gtk_style_context_add_class (context, GTK_STYLE_CLASS_SCALE_HAS_MARKS_ABOVE); + else + gtk_style_context_remove_class (context, GTK_STYLE_CLASS_SCALE_HAS_MARKS_ABOVE); + if (all_pos & MARKS_BELOW) + gtk_style_context_add_class (context, GTK_STYLE_CLASS_SCALE_HAS_MARKS_BELOW); + else + gtk_style_context_remove_class (context, GTK_STYLE_CLASS_SCALE_HAS_MARKS_BELOW); + gtk_widget_queue_resize (GTK_WIDGET (scale)); } |