range: move slider inside the trough
This will require a rewrite of most of the theme, but it's the right thing to do.
This commit is contained in:
190
gtk/gtkrange.c
190
gtk/gtkrange.c
@ -1765,7 +1765,10 @@ gtk_range_measure_trough (GtkCssGadget *gadget,
|
|||||||
GtkRangePrivate *priv = range->priv;
|
GtkRangePrivate *priv = range->priv;
|
||||||
gint min, nat;
|
gint min, nat;
|
||||||
|
|
||||||
*minimum = *natural = 0;
|
gtk_css_gadget_get_preferred_size (priv->slider_gadget,
|
||||||
|
orientation, for_size,
|
||||||
|
minimum, natural,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
if (priv->fill_gadget)
|
if (priv->fill_gadget)
|
||||||
{
|
{
|
||||||
@ -1797,37 +1800,18 @@ gtk_range_size_request (GtkWidget *widget,
|
|||||||
GtkRange *range = GTK_RANGE (widget);
|
GtkRange *range = GTK_RANGE (widget);
|
||||||
GtkRangePrivate *priv = range->priv;
|
GtkRangePrivate *priv = range->priv;
|
||||||
GtkBorder border = { 0 };
|
GtkBorder border = { 0 };
|
||||||
gint box_min, box_nat, slider_min, slider_nat;
|
|
||||||
|
|
||||||
/* First, measure everything */
|
/* Measure the main box */
|
||||||
gtk_css_gadget_get_preferred_size (priv->gadget,
|
gtk_css_gadget_get_preferred_size (priv->gadget,
|
||||||
orientation,
|
orientation,
|
||||||
-1,
|
-1,
|
||||||
&box_min, &box_nat,
|
minimum, natural,
|
||||||
NULL, NULL);
|
|
||||||
gtk_css_gadget_get_preferred_size (priv->slider_gadget,
|
|
||||||
orientation,
|
|
||||||
-1,
|
|
||||||
&slider_min, &slider_nat,
|
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
if (GTK_RANGE_GET_CLASS (range)->get_range_border)
|
if (GTK_RANGE_GET_CLASS (range)->get_range_border)
|
||||||
GTK_RANGE_GET_CLASS (range)->get_range_border (range, &border);
|
GTK_RANGE_GET_CLASS (range)->get_range_border (range, &border);
|
||||||
|
|
||||||
if (priv->orientation != orientation)
|
/* Add the border */
|
||||||
{
|
|
||||||
/* If we're measuring opposite orientation, return the maximum size */
|
|
||||||
*minimum = MAX (box_min, slider_min);
|
|
||||||
*natural = MAX (box_nat, slider_nat);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Otherwise, we report the box size */
|
|
||||||
*minimum = box_min;
|
|
||||||
*natural = box_nat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finally, add the border */
|
|
||||||
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
{
|
{
|
||||||
*minimum += border.left + border.right;
|
*minimum += border.left + border.right;
|
||||||
@ -1858,67 +1842,6 @@ gtk_range_get_preferred_height (GtkWidget *widget,
|
|||||||
minimum, natural);
|
minimum, natural);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_range_allocate_highlight (GtkRange *range,
|
|
||||||
GtkAllocation *out_clip)
|
|
||||||
{
|
|
||||||
GtkRangePrivate *priv = range->priv;
|
|
||||||
int baseline;
|
|
||||||
GtkAllocation trough_alloc, highlight_alloc, slider_alloc;
|
|
||||||
int highlight_min;
|
|
||||||
|
|
||||||
g_assert (priv->has_origin);
|
|
||||||
|
|
||||||
/* Note: the highlight is allocated on top of the trough, not inside */
|
|
||||||
gtk_css_gadget_get_border_allocation (priv->trough_gadget,
|
|
||||||
&trough_alloc, &baseline);
|
|
||||||
gtk_css_gadget_get_content_allocation (priv->slider_gadget,
|
|
||||||
&slider_alloc, NULL);
|
|
||||||
|
|
||||||
gtk_css_gadget_get_preferred_size (priv->highlight_gadget,
|
|
||||||
priv->orientation, -1,
|
|
||||||
&highlight_min, NULL,
|
|
||||||
NULL, NULL);
|
|
||||||
|
|
||||||
highlight_alloc = trough_alloc;
|
|
||||||
|
|
||||||
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
|
|
||||||
{
|
|
||||||
if (!should_invert (range))
|
|
||||||
{
|
|
||||||
highlight_alloc.x = trough_alloc.x;
|
|
||||||
highlight_alloc.width = slider_alloc.x + slider_alloc.width / 2 - trough_alloc.x;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
highlight_alloc.x = slider_alloc.x + slider_alloc.width / 2;
|
|
||||||
highlight_alloc.width = trough_alloc.x + trough_alloc.width - highlight_alloc.x;
|
|
||||||
}
|
|
||||||
|
|
||||||
highlight_alloc.width = MAX (highlight_min, highlight_alloc.width);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!should_invert (range))
|
|
||||||
{
|
|
||||||
highlight_alloc.y = trough_alloc.y;
|
|
||||||
highlight_alloc.height = slider_alloc.y + slider_alloc.height / 2 - trough_alloc.y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
highlight_alloc.y = slider_alloc.y + slider_alloc.height / 2;
|
|
||||||
highlight_alloc.height = trough_alloc.y + trough_alloc.height - highlight_alloc.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
highlight_alloc.height = MAX (highlight_min, highlight_alloc.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_css_gadget_allocate (priv->highlight_gadget,
|
|
||||||
&highlight_alloc,
|
|
||||||
baseline,
|
|
||||||
out_clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_range_allocate_trough (GtkCssGadget *gadget,
|
gtk_range_allocate_trough (GtkCssGadget *gadget,
|
||||||
const GtkAllocation *allocation,
|
const GtkAllocation *allocation,
|
||||||
@ -1929,17 +1852,36 @@ gtk_range_allocate_trough (GtkCssGadget *gadget,
|
|||||||
GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
|
GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
|
||||||
GtkRange *range = GTK_RANGE (widget);
|
GtkRange *range = GTK_RANGE (widget);
|
||||||
GtkRangePrivate *priv = range->priv;
|
GtkRangePrivate *priv = range->priv;
|
||||||
|
GtkAllocation border_alloc;
|
||||||
|
GtkAllocation slider_alloc, widget_alloc;
|
||||||
|
|
||||||
|
/* Note: fill/highlight are allocated on top of the trough, not inside */
|
||||||
|
gtk_css_gadget_get_border_allocation (gadget, &border_alloc, NULL);
|
||||||
|
|
||||||
|
/* Slider */
|
||||||
|
gtk_range_calc_marks (range);
|
||||||
|
gtk_range_calc_stepper_sensitivity (range);
|
||||||
|
|
||||||
|
gtk_widget_get_allocation (widget, &widget_alloc);
|
||||||
|
gtk_range_compute_slider_position (range,
|
||||||
|
gtk_adjustment_get_value (priv->adjustment),
|
||||||
|
&slider_alloc);
|
||||||
|
slider_alloc.x += widget_alloc.x;
|
||||||
|
slider_alloc.y += widget_alloc.y;
|
||||||
|
|
||||||
|
gtk_css_gadget_allocate (priv->slider_gadget,
|
||||||
|
&slider_alloc,
|
||||||
|
gtk_widget_get_allocated_baseline (widget),
|
||||||
|
out_clip);
|
||||||
|
|
||||||
if (priv->show_fill_level &&
|
if (priv->show_fill_level &&
|
||||||
gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment) -
|
gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment) -
|
||||||
gtk_adjustment_get_lower (priv->adjustment) != 0)
|
gtk_adjustment_get_lower (priv->adjustment) != 0)
|
||||||
{
|
{
|
||||||
gdouble level, fill;
|
gdouble level, fill;
|
||||||
GtkAllocation gadget_alloc, fill_alloc, fill_clip;
|
GtkAllocation fill_alloc, fill_clip;
|
||||||
|
|
||||||
/* Note: the fill is allocated on top of the trough, not inside */
|
fill_alloc = border_alloc;
|
||||||
gtk_css_gadget_get_border_allocation (gadget, &gadget_alloc, NULL);
|
|
||||||
fill_alloc = gadget_alloc;
|
|
||||||
|
|
||||||
level = CLAMP (priv->fill_level,
|
level = CLAMP (priv->fill_level,
|
||||||
gtk_adjustment_get_lower (priv->adjustment),
|
gtk_adjustment_get_lower (priv->adjustment),
|
||||||
@ -1956,14 +1898,14 @@ gtk_range_allocate_trough (GtkCssGadget *gadget,
|
|||||||
fill_alloc.width *= fill;
|
fill_alloc.width *= fill;
|
||||||
|
|
||||||
if (should_invert (range))
|
if (should_invert (range))
|
||||||
fill_alloc.x += gadget_alloc.width - fill_alloc.width;
|
fill_alloc.x += border_alloc.width - fill_alloc.width;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fill_alloc.height *= fill;
|
fill_alloc.height *= fill;
|
||||||
|
|
||||||
if (should_invert (range))
|
if (should_invert (range))
|
||||||
fill_alloc.y += gadget_alloc.height - (fill_alloc.height * fill);
|
fill_alloc.y += border_alloc.height - (fill_alloc.height * fill);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_css_gadget_allocate (priv->fill_gadget,
|
gtk_css_gadget_allocate (priv->fill_gadget,
|
||||||
@ -1972,6 +1914,49 @@ gtk_range_allocate_trough (GtkCssGadget *gadget,
|
|||||||
&fill_clip);
|
&fill_clip);
|
||||||
gdk_rectangle_union (out_clip, &fill_clip, out_clip);
|
gdk_rectangle_union (out_clip, &fill_clip, out_clip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->has_origin)
|
||||||
|
{
|
||||||
|
GtkAllocation highlight_alloc, highlight_clip;
|
||||||
|
|
||||||
|
gtk_css_gadget_get_content_allocation (priv->slider_gadget,
|
||||||
|
&slider_alloc, NULL);
|
||||||
|
highlight_alloc = border_alloc;
|
||||||
|
|
||||||
|
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
|
{
|
||||||
|
if (!should_invert (range))
|
||||||
|
{
|
||||||
|
highlight_alloc.x = border_alloc.x;
|
||||||
|
highlight_alloc.width = slider_alloc.x + slider_alloc.width / 2 - border_alloc.x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
highlight_alloc.x = slider_alloc.x + slider_alloc.width / 2;
|
||||||
|
highlight_alloc.width = border_alloc.x + border_alloc.width - highlight_alloc.x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!should_invert (range))
|
||||||
|
{
|
||||||
|
highlight_alloc.y = border_alloc.y;
|
||||||
|
highlight_alloc.height = slider_alloc.y + slider_alloc.height / 2 - border_alloc.y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
highlight_alloc.y = slider_alloc.y + slider_alloc.height / 2;
|
||||||
|
highlight_alloc.height = border_alloc.y + border_alloc.height - highlight_alloc.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_css_gadget_allocate (priv->highlight_gadget,
|
||||||
|
&highlight_alloc,
|
||||||
|
baseline,
|
||||||
|
&highlight_clip);
|
||||||
|
|
||||||
|
gdk_rectangle_union (out_clip, &highlight_clip, out_clip);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clamp dimensions and border inside allocation, such that we prefer
|
/* Clamp dimensions and border inside allocation, such that we prefer
|
||||||
@ -2105,7 +2090,7 @@ gtk_range_size_allocate (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
GtkRange *range = GTK_RANGE (widget);
|
GtkRange *range = GTK_RANGE (widget);
|
||||||
GtkRangePrivate *priv = range->priv;
|
GtkRangePrivate *priv = range->priv;
|
||||||
GtkAllocation clip, slider_alloc, slider_clip, highlight_clip;
|
GtkAllocation clip;
|
||||||
|
|
||||||
gtk_widget_set_allocation (widget, allocation);
|
gtk_widget_set_allocation (widget, allocation);
|
||||||
|
|
||||||
@ -2114,31 +2099,8 @@ gtk_range_size_allocate (GtkWidget *widget,
|
|||||||
allocation->x, allocation->y,
|
allocation->x, allocation->y,
|
||||||
allocation->width, allocation->height);
|
allocation->width, allocation->height);
|
||||||
|
|
||||||
/* Box */
|
|
||||||
gtk_range_allocate_box (range, &clip);
|
gtk_range_allocate_box (range, &clip);
|
||||||
|
|
||||||
/* Slider and highlight */
|
|
||||||
gtk_range_calc_marks (range);
|
|
||||||
gtk_range_calc_stepper_sensitivity (range);
|
|
||||||
|
|
||||||
gtk_range_compute_slider_position (range,
|
|
||||||
gtk_adjustment_get_value (priv->adjustment),
|
|
||||||
&slider_alloc);
|
|
||||||
slider_alloc.x += allocation->x;
|
|
||||||
slider_alloc.y += allocation->y;
|
|
||||||
|
|
||||||
gtk_css_gadget_allocate (priv->slider_gadget,
|
|
||||||
&slider_alloc,
|
|
||||||
gtk_widget_get_allocated_baseline (widget),
|
|
||||||
&slider_clip);
|
|
||||||
gdk_rectangle_union (&clip, &slider_clip, &clip);
|
|
||||||
|
|
||||||
if (priv->has_origin)
|
|
||||||
{
|
|
||||||
gtk_range_allocate_highlight (range, &highlight_clip);
|
|
||||||
gdk_rectangle_union (&clip, &highlight_clip, &clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_set_clip (widget, &clip);
|
gtk_widget_set_clip (widget, &clip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user