diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2016-02-28 00:12:22 -0800 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2016-02-29 10:45:14 -0800 |
commit | 1a8eb9fefa2693c274d7733c57727337dcba8b60 (patch) | |
tree | badc916df8afb2d8ffca25c6a236b34550aa76ed /gtk/gtkscale.c | |
parent | 562a501f3b3ab55d8cd02c4461198e117608c19a (diff) | |
download | gtk+-1a8eb9fefa2693c274d7733c57727337dcba8b60.tar.gz |
scale: implement size allocate for mark gadgets
This allows to move the mark sections around with e.g. margins.
Diffstat (limited to 'gtk/gtkscale.c')
-rw-r--r-- | gtk/gtkscale.c | 117 |
1 files changed, 108 insertions, 9 deletions
diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c index 671543e8e9..3f351b0c4c 100644 --- a/gtk/gtkscale.c +++ b/gtk/gtkscale.c @@ -256,6 +256,100 @@ gtk_scale_notify (GObject *object, G_OBJECT_CLASS (gtk_scale_parent_class)->notify (object, pspec); } +static void +gtk_scale_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GtkScale *scale = GTK_SCALE (widget); + GtkScalePrivate *priv = scale->priv; + GtkAllocation clip, marks_clip, range_rect, marks_rect; + GtkOrientation orientation; + + GTK_WIDGET_CLASS (gtk_scale_parent_class)->size_allocate (widget, allocation); + + gtk_widget_get_clip (widget, &clip); + orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget)); + gtk_range_get_range_rect (GTK_RANGE (scale), &range_rect); + + range_rect.x += allocation->x; + range_rect.y += allocation->y; + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + int marks_height = 0; + + if (priv->top_marks_gadget) + { + gtk_css_gadget_get_preferred_size (priv->top_marks_gadget, + GTK_ORIENTATION_VERTICAL, -1, + &marks_height, NULL, + NULL, NULL); + marks_rect = range_rect; + marks_rect.y -= marks_height; + marks_rect.height = marks_height; + gtk_css_gadget_allocate (priv->top_marks_gadget, + &marks_rect, + -1, + &marks_clip); + gdk_rectangle_union (&clip, &marks_clip, &clip); + } + + if (priv->bottom_marks_gadget) + { + gtk_css_gadget_get_preferred_size (priv->bottom_marks_gadget, + GTK_ORIENTATION_VERTICAL, -1, + &marks_height, NULL, + NULL, NULL); + marks_rect = range_rect; + marks_rect.y += range_rect.height; + marks_rect.height = marks_height; + gtk_css_gadget_allocate (priv->bottom_marks_gadget, + &marks_rect, + -1, + &marks_clip); + gdk_rectangle_union (&clip, &marks_clip, &clip); + } + } + else + { + int marks_width = 0; + + if (priv->top_marks_gadget) + { + gtk_css_gadget_get_preferred_size (priv->top_marks_gadget, + GTK_ORIENTATION_HORIZONTAL, -1, + &marks_width, NULL, + NULL, NULL); + marks_rect = range_rect; + marks_rect.x -= marks_width; + marks_rect.width = marks_width; + gtk_css_gadget_allocate (priv->top_marks_gadget, + &marks_rect, + -1, + &marks_clip); + gdk_rectangle_union (&clip, &marks_clip, &clip); + } + + if (priv->bottom_marks_gadget) + { + gtk_css_gadget_get_preferred_size (priv->bottom_marks_gadget, + GTK_ORIENTATION_HORIZONTAL, -1, + &marks_width, NULL, + NULL, NULL); + marks_rect = range_rect; + marks_rect.x += range_rect.width; + marks_rect.width = marks_width; + gtk_css_gadget_allocate (priv->bottom_marks_gadget, + &marks_rect, + -1, + &marks_clip); + gdk_rectangle_union (&clip, &marks_clip, &clip); + } + } + + gtk_widget_set_clip (widget, &clip); +} + #define add_slider_binding(binding_set, keyval, mask, scroll) \ gtk_binding_entry_add_signal (binding_set, keyval, mask, \ I_("move-slider"), 1, \ @@ -281,6 +375,7 @@ gtk_scale_class_init (GtkScaleClass *class) widget_class->style_updated = gtk_scale_style_updated; widget_class->screen_changed = gtk_scale_screen_changed; widget_class->draw = gtk_scale_draw; + widget_class->size_allocate = gtk_scale_size_allocate; widget_class->get_preferred_width = gtk_scale_get_preferred_width; widget_class->get_preferred_height = gtk_scale_get_preferred_height; @@ -1254,7 +1349,7 @@ gtk_scale_draw (GtkWidget *widget, if (priv->marks) { GtkOrientation orientation; - GdkRectangle range_rect; + GdkRectangle range_rect, marks_alloc; gint i; gint x1, x2, x3, y1, y2, y3; PangoLayout *layout; @@ -1282,15 +1377,17 @@ gtk_scale_draw (GtkWidget *widget, x1 = marks[i]; if (mark->position == GTK_POS_TOP) { - y1 = range_rect.y + slider_alloc.height / 4; - y2 = range_rect.y; + gtk_css_gadget_get_content_box (priv->top_marks_gadget, &marks_alloc); + y1 = marks_alloc.y + marks_alloc.height; + y2 = marks_alloc.y + marks_alloc.height - slider_alloc.height / 4; min_pos = min_pos_before; max_pos = find_next_pos (widget, m, marks + i, GTK_POS_TOP) - min_sep; } else { - y1 = range_rect.y + slider_alloc.height / 4; - y2 = range_rect.y + range_rect.height; + gtk_css_gadget_get_content_box (priv->bottom_marks_gadget, &marks_alloc); + y1 = marks_alloc.y; + y2 = marks_alloc.y + slider_alloc.height / 4; min_pos = min_pos_after; max_pos = find_next_pos (widget, m, marks + i, GTK_POS_BOTTOM) - min_sep; } @@ -1327,15 +1424,17 @@ gtk_scale_draw (GtkWidget *widget, { if (mark->position == GTK_POS_TOP) { - x1 = range_rect.x + slider_alloc.width / 4; - x2 = range_rect.x; + gtk_css_gadget_get_content_box (priv->top_marks_gadget, &marks_alloc); + x1 = marks_alloc.x + slider_alloc.width / 4; + x2 = marks_alloc.x; min_pos = min_pos_before; max_pos = find_next_pos (widget, m, marks + i, GTK_POS_TOP) - min_sep; } else { - x1 = range_rect.x + slider_alloc.width / 4; - x2 = range_rect.x + range_rect.width; + gtk_css_gadget_get_content_box (priv->bottom_marks_gadget, &marks_alloc); + x1 = marks_alloc.x; + x2 = marks_alloc.x + slider_alloc.width / 4; min_pos = min_pos_after; max_pos = find_next_pos (widget, m, marks + i, GTK_POS_BOTTOM) - min_sep; } |