[gtk+/wip/cosimoc/range-gadget: 51/62] range: don't use gtk_range_set_min_slider_size()



commit f921b22752522d30338bcace6f4dca312ef5cc41
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Feb 27 13:31:26 2016 -0800

    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.

 gtk/gtkrange.c        |   44 +++++++++++++++++++++++++++++++++-----------
 gtk/gtkrangeprivate.h |    4 +++-
 gtk/gtkscale.c        |   37 ++++++++++++++-----------------------
 gtk/gtkscrollbar.c    |    9 +--------
 4 files changed, 51 insertions(+), 43 deletions(-)
---
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index d712346..edb9ba4 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -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);
 
diff --git a/gtk/gtkrangeprivate.h b/gtk/gtkrangeprivate.h
index 4376b03..055c5ac 100644
--- a/gtk/gtkrangeprivate.h
+++ b/gtk/gtkrangeprivate.h
@@ -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
 
diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c
index 523bccb..eee0708 100644
--- a/gtk/gtkscale.c
+++ b/gtk/gtkscale.c
@@ -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);
diff --git a/gtk/gtkscrollbar.c b/gtk/gtkscrollbar.c
index 1656415..0f4ca11 100644
--- a/gtk/gtkscrollbar.c
+++ b/gtk/gtkscrollbar.c
@@ -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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]