[gtk+/wip/cosimoc/range-gadget: 21/21] wip



commit b45309dc9310d0cbf4dad10bc92332adbf83feaa
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sun Feb 21 19:33:51 2016 -0800

    wip

 gtk/gtkrange.c |  150 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 80 insertions(+), 70 deletions(-)
---
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 97a45e4..58c6bab 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -1164,10 +1164,10 @@ gtk_range_get_min_slider_size (GtkRange *range)
 
 /* Returns the gadget rect in widget coordinates */
 static void
-measure_one_gadget_rect (GtkRange      *range,
-                         GtkCssGadget  *gadget,
-                         gboolean       use_content,
-                         GtkAllocation *allocation_out)
+measure_one_gadget_alloc (GtkRange      *range,
+                          GtkCssGadget  *gadget,
+                          gboolean       use_content,
+                          GtkAllocation *allocation_out)
 {
   GtkAllocation widget_alloc;
 
@@ -1186,6 +1186,24 @@ measure_one_gadget_rect (GtkRange      *range,
   allocation_out->y -= widget_alloc.y;
 }
 
+static void
+measure_one_gadget (GtkCssGadget *gadget,
+                    int          *width_out,
+                    int          *height_out)
+{
+  if (gadget)
+    {
+      gtk_css_gadget_get_preferred_size (gadget,
+                                         GTK_ORIENTATION_HORIZONTAL, -1,
+                                         width_out, NULL,
+                                         NULL, NULL);
+      gtk_css_gadget_get_preferred_size (gadget,
+                                         GTK_ORIENTATION_VERTICAL, -1,
+                                         height_out, NULL,
+                                         NULL, NULL);
+    }
+}
+
 /**
  * gtk_range_get_range_rect:
  * @range: a #GtkRange
@@ -1219,33 +1237,33 @@ gtk_range_get_range_rect (GtkRange     *range,
   range_rect->width = 0;
   range_rect->height = 0;
 
-  measure_one_gadget_rect (range, priv->trough_gadget, FALSE, &allocation);
+  measure_one_gadget_alloc (range, priv->trough_gadget, FALSE, &allocation);
   gdk_rectangle_union (range_rect, &allocation, range_rect);
 
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &allocation);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &allocation);
   gdk_rectangle_union (range_rect, &allocation, range_rect);
 
   if (priv->stepper_a_gadget)
     {
-      measure_one_gadget_rect (range, priv->stepper_a_gadget, FALSE, &allocation);
+      measure_one_gadget_alloc (range, priv->stepper_a_gadget, FALSE, &allocation);
       gdk_rectangle_union (range_rect, &allocation, range_rect);
     }
 
   if (priv->stepper_b_gadget)
     {
-      measure_one_gadget_rect (range, priv->stepper_b_gadget, FALSE, &allocation);
+      measure_one_gadget_alloc (range, priv->stepper_b_gadget, FALSE, &allocation);
       gdk_rectangle_union (range_rect, &allocation, range_rect);
     }
 
   if (priv->stepper_c_gadget)
     {
-      measure_one_gadget_rect (range, priv->stepper_c_gadget, FALSE, &allocation);
+      measure_one_gadget_alloc (range, priv->stepper_c_gadget, FALSE, &allocation);
       gdk_rectangle_union (range_rect, &allocation, range_rect);
     }
 
   if (priv->stepper_d_gadget)
     {
-      measure_one_gadget_rect (range, priv->stepper_d_gadget, FALSE, &allocation);
+      measure_one_gadget_alloc (range, priv->stepper_d_gadget, FALSE, &allocation);
       gdk_rectangle_union (range_rect, &allocation, range_rect);
     }
 }
@@ -1277,7 +1295,7 @@ gtk_range_get_slider_range (GtkRange *range,
 
   priv = range->priv;
 
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &slider_alloc);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &slider_alloc);
 
   if (priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
@@ -2011,7 +2029,8 @@ gtk_range_allocate_trough (GtkCssGadget        *gadget,
 static void
 gtk_range_allocate_one_stepper (GtkRange      *range,
                                 GtkCssGadget  *gadget,
-                                gint           size,
+                                gint           width,
+                                gint           height,
                                 GtkAllocation *allocation,
                                 gint           baseline,
                                 GtkAllocation *out_clip)
@@ -2019,10 +2038,8 @@ gtk_range_allocate_one_stepper (GtkRange      *range,
   GtkRangePrivate *priv = range->priv;
   GtkAllocation gadget_clip;
 
-  if (priv->orientation == GTK_ORIENTATION_VERTICAL)
-    allocation->height = size;
-  else
-    allocation->width = size;
+  allocation->height = height;
+  allocation->width = width;
 
   if (gadget)
     {
@@ -2031,9 +2048,9 @@ gtk_range_allocate_one_stepper (GtkRange      *range,
     }
 
   if (priv->orientation == GTK_ORIENTATION_VERTICAL)
-    allocation->y += size;
+    allocation->y += height;
   else
-    allocation->x += size;
+    allocation->x += width;
 }
 
 static void
@@ -2047,8 +2064,11 @@ gtk_range_size_allocate (GtkWidget     *widget,
   GtkAllocation gadget_alloc, gadget_clip;
   GtkAllocation slider_clip, slider_alloc, highlight_clip;
   GtkBorder border = { 0 };
-  gint stepper_a_size = 0, stepper_b_size = 0;
-  gint stepper_c_size = 0, stepper_d_size = 0;
+  gint stepper_a_width = 0, stepper_a_height = 0;
+  gint stepper_b_width = 0, stepper_b_height = 0;
+  gint stepper_c_width = 0, stepper_c_height = 0;
+  gint stepper_d_width = 0, stepper_d_height = 0;
+  gint trough_width = 0, trough_height = 0;
 
   gtk_widget_set_allocation (widget, allocation);
   baseline = gtk_widget_get_allocated_baseline (widget);
@@ -2064,50 +2084,32 @@ gtk_range_size_allocate (GtkWidget     *widget,
   gadget_alloc.x = allocation->x + border.left;
   gadget_alloc.y = allocation->y + border.top;
 
-  /* Determine the size of the steppers */
-  if (priv->stepper_a_gadget)
-    gtk_css_gadget_get_preferred_size (priv->stepper_a_gadget,
-                                       priv->orientation,
-                                       -1,
-                                       &stepper_a_size, NULL,
-                                       NULL, NULL);
-  if (priv->stepper_b_gadget)
-    gtk_css_gadget_get_preferred_size (priv->stepper_b_gadget,
-                                       priv->orientation,
-                                       -1,
-                                       &stepper_b_size, NULL,
-                                       NULL, NULL);
-  if (priv->stepper_c_gadget)
-    gtk_css_gadget_get_preferred_size (priv->stepper_c_gadget,
-                                       priv->orientation,
-                                       -1,
-                                       &stepper_c_size, NULL,
-                                       NULL, NULL);
-  if (priv->stepper_d_gadget)
-    gtk_css_gadget_get_preferred_size (priv->stepper_d_gadget,
-                                       priv->orientation,
-                                       -1,
-                                       &stepper_d_size, NULL,
-                                       NULL, NULL);
-
-  /* Gadgets are always allocated the full opposite orientation; walk down the
-   * available size along the orientation and allocate them in visible order.
+  /* Determine the minimum size of the gadgets */
+  measure_one_gadget (priv->stepper_a_gadget,
+                      &stepper_a_width, &stepper_a_height);
+  measure_one_gadget (priv->stepper_a_gadget,
+                      &stepper_b_width, &stepper_b_height);
+  measure_one_gadget (priv->stepper_a_gadget,
+                      &stepper_c_width, &stepper_c_height);
+  measure_one_gadget (priv->stepper_a_gadget,
+                      &stepper_d_width, &stepper_d_height);
+  measure_one_gadget (priv->trough_gadget,
+                      &trough_width, &trough_height);
+
+  /* Walk down the available size along the orientation and allocate
+   * the gadgets in visible order.
    */
-  if (priv->orientation == GTK_ORIENTATION_VERTICAL)
-    gadget_alloc.width = allocation->width;
-  else
-    gadget_alloc.height = allocation->height;    
 
   /* Steppers A+B */
   gtk_range_allocate_one_stepper (range,
                                   priv->stepper_a_gadget,
-                                  stepper_a_size,
+                                  stepper_a_width, stepper_a_height,
                                   &gadget_alloc,
                                   baseline,
                                   &clip);
   gtk_range_allocate_one_stepper (range,
                                   priv->stepper_b_gadget,
-                                  stepper_b_size,
+                                  stepper_b_width, stepper_b_height,
                                   &gadget_alloc,
                                   baseline,
                                   &clip);
@@ -2115,8 +2117,11 @@ gtk_range_size_allocate (GtkWidget     *widget,
   /* Trough */
   if (priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
-      gadget_alloc.height = allocation->height - stepper_a_size -
-        stepper_b_size - stepper_c_size - stepper_d_size;
+      gadget_alloc.height =
+        MAX (trough_height, allocation->height - stepper_a_height -
+             stepper_b_height - stepper_c_height - stepper_d_height);
+      gadget_alloc.width = trough_width;
+
       gtk_css_gadget_allocate (priv->trough_gadget,
                                &gadget_alloc,
                                baseline,
@@ -2126,8 +2131,11 @@ gtk_range_size_allocate (GtkWidget     *widget,
     }
   else
     {
-      gadget_alloc.width = allocation->width - stepper_a_size -
-        stepper_b_size - stepper_c_size - stepper_d_size;
+      gadget_alloc.height = trough_height;
+      gadget_alloc.width =
+        MAX (trough_width, allocation->width - stepper_a_width -
+             stepper_b_width - stepper_c_width - stepper_d_width);
+
       gtk_css_gadget_allocate (priv->trough_gadget,
                                &gadget_alloc,
                                baseline,
@@ -2139,13 +2147,13 @@ gtk_range_size_allocate (GtkWidget     *widget,
   /* Steppers C+D */
   gtk_range_allocate_one_stepper (range,
                                   priv->stepper_c_gadget,
-                                  stepper_c_size,
+                                  stepper_c_width, stepper_c_height,
                                   &gadget_alloc,
                                   baseline,
                                   &clip);
   gtk_range_allocate_one_stepper (range,
                                   priv->stepper_d_gadget,
-                                  stepper_d_size,
+                                  stepper_d_width, stepper_d_height,
                                   &gadget_alloc,
                                   baseline,
                                   &clip);
@@ -2172,7 +2180,7 @@ gtk_range_size_allocate (GtkWidget     *widget,
       gdk_rectangle_union (&clip, &highlight_clip, &clip);
     }
 
-  gtk_widget_set_clip (widget, &clip);
+  //gtk_widget_set_clip (widget, &clip);
 }
 
 static void
@@ -2512,8 +2520,8 @@ coord_to_value (GtkRange *range,
   gint    slider_length;
   GtkAllocation slider_alloc, trough_alloc;
 
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &slider_alloc);
-  measure_one_gadget_rect (range, priv->trough_gadget, TRUE, &trough_alloc);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &slider_alloc);
+  measure_one_gadget_alloc (range, priv->trough_gadget, TRUE, &trough_alloc);
 
   if (priv->orientation == GTK_ORIENTATION_VERTICAL)
     {
@@ -2555,7 +2563,7 @@ gtk_range_key_press (GtkWidget   *widget,
   device = gdk_event_get_device ((GdkEvent *) event);
   device = gdk_device_get_associated_device (device);
 
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &slider_alloc);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &slider_alloc);
 
   if (gtk_gesture_is_active (priv->drag_gesture) &&
       device == gtk_gesture_get_device (priv->drag_gesture) &&
@@ -2592,7 +2600,7 @@ gtk_range_long_press_gesture_pressed (GtkGestureLongPress *gesture,
   GtkAllocation slider_alloc;
 
   gtk_range_update_mouse_location (range);
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &slider_alloc);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &slider_alloc);
 
   if (priv->mouse_location == MOUSE_SLIDER && !priv->zoom)
     {
@@ -2646,7 +2654,7 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
   priv->mouse_y = y;
 
   gtk_range_update_mouse_location (range);
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &slider_alloc);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &slider_alloc);
 
   g_object_get (gtk_widget_get_settings (widget),
                 "gtk-primary-button-warps-slider", &primary_warps,
@@ -2823,8 +2831,8 @@ update_slider_position (GtkRange *range,
   gint i;
   GtkAllocation slider_alloc, trough_alloc;
 
-  measure_one_gadget_rect (range, priv->slider_gadget, FALSE, &slider_alloc);
-  measure_one_gadget_rect (range, priv->trough_gadget, FALSE, &trough_alloc);
+  measure_one_gadget_alloc (range, priv->slider_gadget, FALSE, &slider_alloc);
+  measure_one_gadget_alloc (range, priv->trough_gadget, FALSE, &trough_alloc);
 
   if (priv->zoom)
     {
@@ -3477,9 +3485,11 @@ gtk_range_compute_slider_position (GtkRange     *range,
 {
   GtkRangePrivate *priv = range->priv;
   GtkAllocation trough_margin_alloc, trough_content_alloc;
+  int slider_width, slider_height;
 
-  measure_one_gadget_rect (range, priv->trough_gadget, FALSE, &trough_margin_alloc);
-  measure_one_gadget_rect (range, priv->trough_gadget, TRUE, &trough_content_alloc);
+  measure_one_gadget (priv->slider_gadget, &slider_width, &slider_height);
+  measure_one_gadget_alloc (range, priv->trough_gadget, FALSE, &trough_margin_alloc);
+  measure_one_gadget_alloc (range, priv->trough_gadget, TRUE, &trough_content_alloc);
 
   if (priv->orientation == GTK_ORIENTATION_VERTICAL)
     {


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