forked from AuroraMiddleware/gtk
range: don't use gtk_range_set_min_slider_size()
The way this method is used from the GtkRange subclasses doesn't really work well when the slider properties change as a consequence of e.g. a style class being applied (e.g. the fine-tune style class). In fact, there's no need to read the minimum slider size out of band, and we can obtain the same result in a way that always work by setting a private property on GtkRange.
This commit is contained in:
parent
0468ff1545
commit
424f17c0fb
@ -128,6 +128,7 @@ struct _GtkRangePrivate
|
||||
guint flippable : 1;
|
||||
guint inverted : 1;
|
||||
guint slider_size_fixed : 1;
|
||||
guint slider_use_min_size : 1;
|
||||
guint trough_click_forward : 1; /* trough click was on the forward side of slider */
|
||||
|
||||
/* Stepper sensitivity */
|
||||
@ -1110,6 +1111,19 @@ gtk_range_get_flippable (GtkRange *range)
|
||||
return range->priv->flippable;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_range_set_slider_use_min_size (GtkRange *range,
|
||||
gboolean use_min_size)
|
||||
{
|
||||
GtkRangePrivate *priv = range->priv;
|
||||
|
||||
if (use_min_size != priv->slider_use_min_size)
|
||||
{
|
||||
priv->slider_use_min_size = use_min_size;
|
||||
gtk_css_gadget_queue_resize (priv->slider_gadget);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_range_set_slider_size_fixed:
|
||||
* @range: a #GtkRange
|
||||
@ -3425,11 +3439,13 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
{
|
||||
GtkRangePrivate *priv = range->priv;
|
||||
GtkAllocation trough_content_alloc;
|
||||
int slider_width, slider_height;
|
||||
int slider_width, slider_height, min_slider_size;
|
||||
|
||||
measure_one_gadget (priv->slider_gadget, &slider_width, &slider_height);
|
||||
gtk_css_gadget_get_content_box (priv->trough_gadget, &trough_content_alloc);
|
||||
|
||||
min_slider_size = priv->min_slider_size;
|
||||
|
||||
if (priv->orientation == GTK_ORIENTATION_VERTICAL)
|
||||
{
|
||||
gint y, bottom, top, height;
|
||||
@ -3440,6 +3456,9 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
slider_rect->x = trough_content_alloc.x + (int) floor ((trough_content_alloc.width - slider_width) / 2);
|
||||
slider_rect->width = slider_width;
|
||||
|
||||
if (priv->slider_use_min_size)
|
||||
min_slider_size = slider_height;
|
||||
|
||||
/* Compute slider position/length */
|
||||
top = trough_content_alloc.y;
|
||||
bottom = top + trough_content_alloc.height;
|
||||
@ -3447,8 +3466,8 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
/* Scale slider half extends over the trough edge */
|
||||
if (GTK_IS_SCALE (range))
|
||||
{
|
||||
top -= priv->min_slider_size / 2;
|
||||
bottom += priv->min_slider_size / 2;
|
||||
top -= min_slider_size / 2;
|
||||
bottom += min_slider_size / 2;
|
||||
}
|
||||
|
||||
/* slider height is the fraction (page_size /
|
||||
@ -3459,11 +3478,11 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
height = ((bottom - top) * (gtk_adjustment_get_page_size (priv->adjustment) /
|
||||
(gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
|
||||
else
|
||||
height = priv->min_slider_size;
|
||||
height = min_slider_size;
|
||||
|
||||
if (height < priv->min_slider_size ||
|
||||
if (height < min_slider_size ||
|
||||
priv->slider_size_fixed)
|
||||
height = priv->min_slider_size;
|
||||
height = min_slider_size;
|
||||
|
||||
height = MIN (height, trough_content_alloc.height);
|
||||
|
||||
@ -3491,6 +3510,9 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
slider_rect->y = trough_content_alloc.y + (int) floor ((trough_content_alloc.height - slider_height) / 2);
|
||||
slider_rect->height = slider_height;
|
||||
|
||||
if (priv->slider_use_min_size)
|
||||
min_slider_size = slider_width;
|
||||
|
||||
/* Compute slider position/length */
|
||||
left = trough_content_alloc.x;
|
||||
right = left + trough_content_alloc.width;
|
||||
@ -3498,8 +3520,8 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
/* Scale slider half extends over the trough edge */
|
||||
if (GTK_IS_SCALE (range))
|
||||
{
|
||||
left -= priv->min_slider_size / 2;
|
||||
right += priv->min_slider_size / 2;
|
||||
left -= min_slider_size / 2;
|
||||
right += min_slider_size / 2;
|
||||
}
|
||||
|
||||
/* slider width is the fraction (page_size /
|
||||
@ -3510,11 +3532,11 @@ gtk_range_compute_slider_position (GtkRange *range,
|
||||
width = ((right - left) * (gtk_adjustment_get_page_size (priv->adjustment) /
|
||||
(gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
|
||||
else
|
||||
width = priv->min_slider_size;
|
||||
width = min_slider_size;
|
||||
|
||||
if (width < priv->min_slider_size ||
|
||||
if (width < min_slider_size ||
|
||||
priv->slider_size_fixed)
|
||||
width = priv->min_slider_size;
|
||||
width = min_slider_size;
|
||||
|
||||
width = MIN (width, trough_content_alloc.width);
|
||||
|
||||
|
@ -49,7 +49,9 @@ void _gtk_range_set_steppers (GtkRange *range
|
||||
gboolean has_c,
|
||||
gboolean has_d);
|
||||
|
||||
GtkCssGadget *gtk_range_get_slider_gadget (GtkRange *range);
|
||||
void gtk_range_set_slider_use_min_size (GtkRange *range,
|
||||
gboolean use_min_size);
|
||||
GtkCssGadget *gtk_range_get_slider_gadget (GtkRange *range);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -263,24 +263,6 @@ gtk_scale_notify (GObject *object,
|
||||
G_OBJECT_CLASS (gtk_scale_parent_class)->notify (object, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_scale_update_style (GtkScale *scale)
|
||||
{
|
||||
gint slider_length;
|
||||
GtkRange *range;
|
||||
GtkCssGadget *slider_gadget;
|
||||
|
||||
range = GTK_RANGE (scale);
|
||||
slider_gadget = gtk_range_get_slider_gadget (range);
|
||||
gtk_css_gadget_get_preferred_size (slider_gadget,
|
||||
gtk_orientable_get_orientation (GTK_ORIENTABLE (scale)), -1,
|
||||
&slider_length, NULL,
|
||||
NULL, NULL);
|
||||
|
||||
gtk_range_set_min_slider_size (range, slider_length);
|
||||
gtk_scale_clear_layout (scale);
|
||||
}
|
||||
|
||||
#define add_slider_binding(binding_set, keyval, mask, scroll) \
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, mask, \
|
||||
I_("move-slider"), 1, \
|
||||
@ -536,6 +518,7 @@ gtk_scale_init (GtkScale *scale)
|
||||
gtk_widget_set_can_focus (GTK_WIDGET (scale), TRUE);
|
||||
|
||||
gtk_range_set_slider_size_fixed (range, TRUE);
|
||||
gtk_range_set_slider_use_min_size (range, TRUE);
|
||||
|
||||
_gtk_range_set_has_origin (range, TRUE);
|
||||
|
||||
@ -545,8 +528,6 @@ gtk_scale_init (GtkScale *scale)
|
||||
gtk_range_set_round_digits (range, priv->digits);
|
||||
|
||||
gtk_range_set_flippable (range, TRUE);
|
||||
|
||||
gtk_scale_update_style (scale);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1071,7 +1052,7 @@ gtk_scale_get_mark_label_size (GtkScale *scale,
|
||||
static void
|
||||
gtk_scale_style_updated (GtkWidget *widget)
|
||||
{
|
||||
gtk_scale_update_style (GTK_SCALE (widget));
|
||||
gtk_scale_clear_layout (GTK_SCALE (widget));
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_scale_parent_class)->style_updated (widget);
|
||||
}
|
||||
@ -1093,10 +1074,15 @@ gtk_scale_get_preferred_width (GtkWidget *widget,
|
||||
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (widget)) == GTK_ORIENTATION_HORIZONTAL)
|
||||
{
|
||||
gint n1, w1, h1, n2, w2, h2;
|
||||
GtkCssGadget *slider_gadget;
|
||||
gint slider_length;
|
||||
gint w;
|
||||
|
||||
slider_length = gtk_range_get_min_slider_size (GTK_RANGE (widget));
|
||||
slider_gadget = gtk_range_get_slider_gadget (GTK_RANGE (widget));
|
||||
gtk_css_gadget_get_preferred_size (slider_gadget,
|
||||
GTK_ORIENTATION_HORIZONTAL, -1,
|
||||
&slider_length, NULL,
|
||||
NULL, NULL);
|
||||
|
||||
gtk_scale_get_mark_label_size (GTK_SCALE (widget), GTK_POS_TOP, &n1, &w1, &h1, &n2, &w2, &h2);
|
||||
|
||||
@ -1120,10 +1106,15 @@ gtk_scale_get_preferred_height (GtkWidget *widget,
|
||||
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (widget)) == GTK_ORIENTATION_VERTICAL)
|
||||
{
|
||||
gint n1, w1, h1, n2, w2, h2;
|
||||
GtkCssGadget *slider_gadget;
|
||||
gint slider_length;
|
||||
gint h;
|
||||
|
||||
slider_length = gtk_range_get_min_slider_size (GTK_RANGE (widget));
|
||||
slider_gadget = gtk_range_get_slider_gadget (GTK_RANGE (widget));
|
||||
gtk_css_gadget_get_preferred_size (slider_gadget,
|
||||
GTK_ORIENTATION_VERTICAL, -1,
|
||||
&slider_length, NULL,
|
||||
NULL, NULL);
|
||||
|
||||
gtk_scale_get_mark_label_size (GTK_SCALE (widget), GTK_POS_TOP, &n1, &w1, &h1, &n2, &w2, &h2);
|
||||
h1 = (n1 - 1) * h1 + MAX (h1, slider_length);
|
||||
|
@ -152,17 +152,10 @@ gtk_scrollbar_class_init (GtkScrollbarClass *class)
|
||||
static void
|
||||
gtk_scrollbar_update_style (GtkScrollbar *scrollbar)
|
||||
{
|
||||
gint slider_length;
|
||||
gboolean fixed_size;
|
||||
gboolean has_a, has_b, has_c, has_d;
|
||||
GtkRange *range = GTK_RANGE (scrollbar);
|
||||
GtkWidget *widget = GTK_WIDGET (scrollbar);
|
||||
GtkCssGadget *slider_gadget = gtk_range_get_slider_gadget (range);
|
||||
|
||||
gtk_css_gadget_get_preferred_size (slider_gadget,
|
||||
gtk_orientable_get_orientation (GTK_ORIENTABLE (scrollbar)), -1,
|
||||
&slider_length, NULL,
|
||||
NULL, NULL);
|
||||
|
||||
gtk_widget_style_get (widget,
|
||||
"fixed-slider-length", &fixed_size,
|
||||
@ -172,7 +165,6 @@ gtk_scrollbar_update_style (GtkScrollbar *scrollbar)
|
||||
"has-forward-stepper", &has_d,
|
||||
NULL);
|
||||
|
||||
gtk_range_set_min_slider_size (range, slider_length);
|
||||
gtk_range_set_slider_size_fixed (range, fixed_size);
|
||||
_gtk_range_set_steppers (range, has_a, has_b, has_c, has_d);
|
||||
}
|
||||
@ -181,6 +173,7 @@ static void
|
||||
gtk_scrollbar_init (GtkScrollbar *scrollbar)
|
||||
{
|
||||
gtk_scrollbar_update_style (scrollbar);
|
||||
gtk_range_set_slider_use_min_size (GTK_RANGE (scrollbar), TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user