[gtk+] boxgadget: Implement CSS border-spacing
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] boxgadget: Implement CSS border-spacing
- Date: Sat, 10 Dec 2016 03:33:29 +0000 (UTC)
commit 404cdd5d02f9f81420e64341724dace5c7d0782e
Author: Benjamin Otte <otte redhat com>
Date: Sat Dec 10 04:19:04 2016 +0100
boxgadget: Implement CSS border-spacing
gtk/gtkboxgadget.c | 48 ++++++++++++++++++++++++++++++++++++++----------
1 files changed, 38 insertions(+), 10 deletions(-)
---
diff --git a/gtk/gtkboxgadget.c b/gtk/gtkboxgadget.c
index 40e7aa9..d7d57f8 100644
--- a/gtk/gtkboxgadget.c
+++ b/gtk/gtkboxgadget.c
@@ -22,6 +22,7 @@
#include "gtkboxgadgetprivate.h"
#include "gtkcssnodeprivate.h"
+#include "gtkcsspositionvalueprivate.h"
#include "gtkmain.h"
#include "gtkprivate.h"
#include "gtksizerequest.h"
@@ -116,6 +117,18 @@ effective_align (GtkAlign align,
}
}
+static int
+get_spacing (GtkCssGadget *gadget)
+{
+ GtkBoxGadgetPrivate *priv = gtk_box_gadget_get_instance_private (GTK_BOX_GADGET (gadget));
+ GtkCssValue *spacing = gtk_css_style_get_value (gtk_css_gadget_get_style (gadget),
GTK_CSS_PROPERTY_BORDER_SPACING);
+
+ if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+ return _gtk_css_position_value_get_x (spacing, 100);
+ else
+ return _gtk_css_position_value_get_y (spacing, 100);
+}
+
static void
gtk_box_gadget_measure_child (GObject *child,
GtkOrientation orientation,
@@ -151,8 +164,11 @@ gtk_box_gadget_distribute (GtkBoxGadget *gadget,
{
GtkBoxGadgetPrivate *priv = gtk_box_gadget_get_instance_private (GTK_BOX_GADGET (gadget));
guint i, n_expand;
+ gint spacing;
n_expand = 0;
+ spacing = get_spacing (GTK_CSS_GADGET (gadget));
+ size += spacing;
for (i = 0 ; i < priv->children->len; i++)
{
@@ -163,9 +179,12 @@ gtk_box_gadget_distribute (GtkBoxGadget *gadget,
for_size,
&sizes[i].minimum_size, &sizes[i].natural_size,
NULL, NULL);
- if (gtk_box_gadget_child_is_visible (child->object) &&
- gtk_box_gadget_child_compute_expand (gadget, child))
- n_expand++;
+ if (gtk_box_gadget_child_is_visible (child->object))
+ {
+ size -= spacing;
+ if (gtk_box_gadget_child_compute_expand (gadget, child))
+ n_expand++;
+ }
size -= sizes[i].minimum_size;
}
@@ -193,7 +212,6 @@ gtk_box_gadget_distribute (GtkBoxGadget *gadget,
size -= size / n_expand;
n_expand--;
}
-
}
static void
@@ -206,11 +224,13 @@ gtk_box_gadget_measure_orientation (GtkCssGadget *gadget,
gint *natural_baseline)
{
GtkBoxGadgetPrivate *priv = gtk_box_gadget_get_instance_private (GTK_BOX_GADGET (gadget));
- gint child_min, child_nat;
- guint i;
+ gint child_min, child_nat, spacing;
+ guint i, n_visible;
*minimum = 0;
*natural = 0;
+ spacing = get_spacing (gadget);
+ n_visible = 0;
for (i = 0 ; i < priv->children->len; i++)
{
@@ -224,7 +244,13 @@ gtk_box_gadget_measure_orientation (GtkCssGadget *gadget,
*minimum += child_min;
*natural += child_nat;
+
+ if (gtk_box_gadget_child_is_visible (child->object))
+ n_visible++;
}
+
+ *minimum += (MAX (n_visible, 1) - 1) * spacing;
+ *natural += (MAX (n_visible, 1) - 1) * spacing;
}
static void
@@ -415,10 +441,12 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget,
GtkRequestedSize *sizes;
GtkAllocation child_allocation, child_clip;
GtkAlign child_align;
+ gint spacing;
guint i;
child_allocation = *allocation;
sizes = g_newa (GtkRequestedSize, priv->children->len);
+ spacing = get_spacing (gadget);
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
@@ -435,7 +463,7 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget,
child_allocation.height = allocation->height;
child_allocation.y = allocation->y;
if (priv->allocate_reverse)
- child_allocation.x -= child_allocation.width;
+ child_allocation.x -= child_allocation.width + spacing;
child_align = gtk_box_gadget_child_get_align (GTK_BOX_GADGET (gadget), child);
gtk_box_gadget_allocate_child (child->object,
@@ -451,7 +479,7 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget,
gdk_rectangle_union (out_clip, &child_clip, out_clip);
if (!priv->allocate_reverse)
- child_allocation.x += sizes[idx].minimum_size;
+ child_allocation.x += sizes[idx].minimum_size + spacing;
}
}
else
@@ -469,7 +497,7 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget,
child_allocation.width = allocation->width;
child_allocation.x = allocation->x;
if (priv->allocate_reverse)
- child_allocation.y -= child_allocation.height;
+ child_allocation.y -= child_allocation.height + spacing;
child_align = gtk_box_gadget_child_get_align (GTK_BOX_GADGET (gadget), child);
gtk_box_gadget_allocate_child (child->object,
@@ -485,7 +513,7 @@ gtk_box_gadget_allocate (GtkCssGadget *gadget,
gdk_rectangle_union (out_clip, &child_clip, out_clip);
if (!priv->allocate_reverse)
- child_allocation.y += sizes[idx].minimum_size;
+ child_allocation.y += sizes[idx].minimum_size + spacing;
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]