[gtk+/wip/matthiasc/gadget] checkbutton: Redo the split personality



commit 286d009e5c2ecba745b1ea8d0d0a5a89d8de8de1
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Dec 7 10:48:17 2015 -0500

    checkbutton: Redo the split personality
    
    Check button can either render as plain buttons, or they
    can render the check and label. We need to cleanly separate
    these two, otherwise things get confused. In particular,
    Radio buttons rendered as plain buttons were getting CSS
    margins and padding applied twice. Fix this by either using
    our own main gadget or the button gadget for everything, and
    never chain up to widget vfuncs from the gadget side.

 gtk/gtkcheckbutton.c |  217 +++++++++++++++++++++++++++-----------------------
 1 files changed, 119 insertions(+), 98 deletions(-)
---
diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c
index 1b119f7..3cdebf8 100644
--- a/gtk/gtkcheckbutton.c
+++ b/gtk/gtkcheckbutton.c
@@ -440,94 +440,82 @@ gtk_check_button_get_content_size (GtkCssGadget   *gadget,
 
   if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
-      if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+      GtkWidget *child;
+      gint check_min, check_nat;
+
+      gtk_css_gadget_get_preferred_size (priv->indicator_gadget,
+                                         GTK_ORIENTATION_HORIZONTAL,
+                                         for_size,
+                                         &check_min, &check_nat,
+                                         NULL, NULL);
+
+      child = gtk_bin_get_child (GTK_BIN (widget));
+      if (child && gtk_widget_get_visible (child))
         {
-          GtkWidget *child;
-          gint check_min, check_nat;
-
-          gtk_css_gadget_get_preferred_size (priv->indicator_gadget,
-                                             GTK_ORIENTATION_HORIZONTAL,
-                                             for_size,
-                                             &check_min, &check_nat,
-                                             NULL, NULL);
-
-          child = gtk_bin_get_child (GTK_BIN (widget));
-          if (child && gtk_widget_get_visible (child))
-            {
-              gint child_min, child_nat;
-              gint spacing;
-
-              gtk_widget_style_get (widget,
-                                    "indicator-spacing", &spacing,
-                                    NULL);
-
-              _gtk_widget_get_preferred_size_for_size (child,
-                                                       GTK_ORIENTATION_HORIZONTAL,
-                                                       for_size,
-                                                       &child_min, &child_nat,
-                                                       NULL, NULL);
-              *minimum = check_min + 2 * spacing + child_min;
-              *natural = check_nat + 2 * spacing + child_nat;
-            }
-          else
-            {
-              *minimum = check_min;
-              *natural = check_nat;
-            }
+          gint child_min, child_nat;
+          gint spacing;
+
+          gtk_widget_style_get (widget,
+                                "indicator-spacing", &spacing,
+                                NULL);
+
+          _gtk_widget_get_preferred_size_for_size (child,
+                                                   GTK_ORIENTATION_HORIZONTAL,
+                                                   for_size,
+                                                   &child_min, &child_nat,
+                                                   NULL, NULL);
+          *minimum = check_min + 2 * spacing + child_min;
+          *natural = check_nat + 2 * spacing + child_nat;
         }
       else
-        GTK_WIDGET_CLASS (gtk_check_button_parent_class)->get_preferred_width (widget, minimum, natural);
+        {
+          *minimum = check_min;
+          *natural = check_nat;
+        }
     }
   else
     {
-      if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+      GtkWidget *child;
+      gint check_min, check_nat;
+      gint check_min_width, check_nat_width;
+
+      gtk_css_gadget_get_preferred_size (priv->indicator_gadget,
+                                         GTK_ORIENTATION_HORIZONTAL,
+                                         -1,
+                                         &check_min_width, &check_nat_width,
+                                         NULL, NULL);
+      gtk_css_gadget_get_preferred_size (priv->indicator_gadget,
+                                         GTK_ORIENTATION_VERTICAL,
+                                         -1,
+                                         &check_min, &check_nat,
+                                         NULL, NULL);
+
+      child = gtk_bin_get_child (GTK_BIN (widget));
+      if (child && gtk_widget_get_visible (child))
         {
-          GtkWidget *child;
-          gint check_min, check_nat;
-          gint check_min_width, check_nat_width;
-
-          gtk_css_gadget_get_preferred_size (priv->indicator_gadget,
-                                             GTK_ORIENTATION_HORIZONTAL,
-                                             -1,
-                                             &check_min_width, &check_nat_width,
-                                             NULL, NULL);
-          gtk_css_gadget_get_preferred_size (priv->indicator_gadget,
-                                             GTK_ORIENTATION_VERTICAL,
-                                             -1,
-                                             &check_min, &check_nat,
-                                             NULL, NULL);
-
-          child = gtk_bin_get_child (GTK_BIN (widget));
-          if (child && gtk_widget_get_visible (child))
-            {
-              gint child_min, child_nat;
-             gint child_min_baseline = -1, child_nat_baseline = -1;
-
-              if (for_size > -1)
-                for_size -= check_nat_width;
-
-              gtk_widget_get_preferred_height_and_baseline_for_width (child, for_size,
-                                                                      &child_min, &child_nat,
-                                                                      &child_min_baseline, 
&child_nat_baseline);
-
-              *minimum = MAX (check_min, child_min);
-              *natural = MAX (check_nat, child_nat);
-
-              if (minimum_baseline && child_min_baseline >= 0)
-                *minimum_baseline = child_min_baseline + (*minimum - child_min) / 2;
-              if (natural_baseline && child_nat_baseline >= 0)
-                *natural_baseline = child_nat_baseline + (*natural - child_nat) / 2;
-            }
-          else
-            {
-              *minimum = check_min;
-              *natural = check_nat;
-            }
+          gint child_min, child_nat;
+         gint child_min_baseline = -1, child_nat_baseline = -1;
+
+          if (for_size > -1)
+            for_size -= check_nat_width;
+
+          gtk_widget_get_preferred_height_and_baseline_for_width (child, for_size,
+                                                                  &child_min, &child_nat,
+                                                                  &child_min_baseline, &child_nat_baseline);
+
+          *minimum = MAX (check_min, child_min);
+          *natural = MAX (check_nat, child_nat);
+
+          if (minimum_baseline && child_min_baseline >= 0)
+            *minimum_baseline = child_min_baseline + (*minimum - child_min) / 2;
+          if (natural_baseline && child_nat_baseline >= 0)
+            *natural_baseline = child_nat_baseline + (*natural - child_nat) / 2;
         }
       else
-        GTK_WIDGET_CLASS (gtk_check_button_parent_class)->get_preferred_height_and_baseline_for_width 
(widget, for_size,
-                                                                                                       
minimum, natural,
-                                                                                                       
minimum_baseline, natural_baseline);
+        {
+          *minimum = check_min;
+          *natural = check_nat;
+        }
     }
 }
 
@@ -559,8 +547,14 @@ gtk_check_button_get_preferred_width_for_height (GtkWidget *widget,
                                                  gint      *natural)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
+
+  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
 
-  gtk_css_gadget_get_preferred_size (priv->gadget,
+  gtk_css_gadget_get_preferred_size (gadget,
                                      GTK_ORIENTATION_HORIZONTAL,
                                      height,
                                      minimum, natural,
@@ -573,8 +567,14 @@ gtk_check_button_get_preferred_width (GtkWidget *widget,
                                       gint      *natural)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
 
-  gtk_css_gadget_get_preferred_size (priv->gadget,
+  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
+
+  gtk_css_gadget_get_preferred_size (gadget,
                                      GTK_ORIENTATION_HORIZONTAL,
                                      -1,
                                      minimum, natural,
@@ -590,8 +590,14 @@ gtk_check_button_get_preferred_height_and_baseline_for_width (GtkWidget *widget,
                                                              gint      *natural_baseline)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
 
-  gtk_css_gadget_get_preferred_size (priv->gadget,
+  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
+
+  gtk_css_gadget_get_preferred_size (gadget,
                                      GTK_ORIENTATION_VERTICAL,
                                      width,
                                      minimum, natural,
@@ -605,8 +611,14 @@ gtk_check_button_get_preferred_height_for_width (GtkWidget *widget,
                                                  gint      *natural)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
+
+  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
 
-  gtk_css_gadget_get_preferred_size (priv->gadget,
+  gtk_css_gadget_get_preferred_size (gadget,
                                      GTK_ORIENTATION_VERTICAL,
                                      width,
                                      minimum, natural,
@@ -619,8 +631,14 @@ gtk_check_button_get_preferred_height (GtkWidget *widget,
                                        gint      *natural)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
+
+  if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
 
-  gtk_css_gadget_get_preferred_size (priv->gadget,
+  gtk_css_gadget_get_preferred_size (gadget,
                                      GTK_ORIENTATION_VERTICAL,
                                      -1,
                                      minimum, natural,
@@ -632,22 +650,22 @@ gtk_check_button_size_allocate (GtkWidget     *widget,
                                GtkAllocation *allocation)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
+  GdkRectangle clip;
 
   if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
-    {
-      GdkRectangle clip;
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
 
-      gtk_widget_set_allocation (widget, allocation);
+  gtk_widget_set_allocation (widget, allocation);
 
-      gtk_css_gadget_allocate (priv->gadget,
-                               allocation,
-                               gtk_widget_get_allocated_baseline (widget),
-                               &clip);
+  gtk_css_gadget_allocate (gadget,
+                           allocation,
+                           gtk_widget_get_allocated_baseline (widget),
+                           &clip);
 
-      gtk_widget_set_clip (widget, &clip);
-    }
-  else
-    GTK_WIDGET_CLASS (gtk_check_button_parent_class)->size_allocate (widget, allocation);
+  gtk_widget_set_clip (widget, &clip);
 }
 
 static void
@@ -746,11 +764,14 @@ gtk_check_button_draw (GtkWidget *widget,
                        cairo_t   *cr)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
+  GtkCssGadget *gadget;
 
   if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
-    gtk_css_gadget_draw (priv->gadget, cr);
-  else if (GTK_WIDGET_CLASS (gtk_check_button_parent_class)->draw)
-    GTK_WIDGET_CLASS (gtk_check_button_parent_class)->draw (widget, cr);
+    gadget = priv->gadget;
+  else
+    gadget = GTK_BUTTON (widget)->priv->gadget;
+
+  gtk_css_gadget_draw (gadget, cr);
 
   return FALSE;
 }


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