[gtk+/wip/matthiasc/gadget] checkbutton: Redo the split personality
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/gadget] checkbutton: Redo the split personality
- Date: Mon, 7 Dec 2015 15:50:59 +0000 (UTC)
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]