[gtk+] grid: Implement support for CSS border-spacing
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] grid: Implement support for CSS border-spacing
- Date: Sat, 10 Dec 2016 03:33:34 +0000 (UTC)
commit 0eecc6f686f6c4a23549d2185e842d0fafa9b17b
Author: Benjamin Otte <otte redhat com>
Date: Sat Dec 10 04:32:19 2016 +0100
grid: Implement support for CSS border-spacing
gtk/gtkgrid.c | 67 +++++++++++++++++++++++++++++++++++---------------------
1 files changed, 42 insertions(+), 25 deletions(-)
---
diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c
index f74d67a..cfe25cf 100644
--- a/gtk/gtkgrid.c
+++ b/gtk/gtkgrid.c
@@ -28,6 +28,8 @@
#include "gtkwidgetprivate.h"
#include "gtkcontainerprivate.h"
#include "gtkcsscustomgadgetprivate.h"
+#include "gtkcsspositionvalueprivate.h"
+#include "gtkstylecontextprivate.h"
#include "gtkprivate.h"
#include "gtkintl.h"
@@ -549,6 +551,23 @@ gtk_grid_child_type (GtkContainer *container)
return GTK_TYPE_WIDGET;
}
+static int
+get_spacing (GtkGrid *grid,
+ GtkOrientation orientation)
+{
+ GtkGridPrivate *priv = grid->priv;
+ GtkCssValue *border_spacing;
+ gint css_spacing;
+
+ border_spacing = _gtk_style_context_peek_property (gtk_widget_get_style_context (GTK_WIDGET (grid)),
GTK_CSS_PROPERTY_BORDER_SPACING);
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ css_spacing = _gtk_css_position_value_get_x (border_spacing, 100);
+ else
+ css_spacing = _gtk_css_position_value_get_y (border_spacing, 100);
+
+ return css_spacing + priv->linedata[orientation].spacing;
+}
+
/* Calculates the min and max numbers for both orientations.
*/
static void
@@ -626,19 +645,16 @@ compute_allocation_for_child (GtkGridRequest *request,
GtkGridChild *child,
GtkOrientation orientation)
{
- GtkGridPrivate *priv = request->grid->priv;
- GtkGridLineData *linedata;
GtkGridLines *lines;
GtkGridLine *line;
GtkGridChildAttach *attach;
gint size;
gint i;
- linedata = &priv->linedata[orientation];
lines = &request->lines[orientation];
attach = &child->attach[orientation];
- size = (attach->span - 1) * linedata->spacing;
+ size = (attach->span - 1) * get_spacing (request->grid, orientation);
for (i = 0; i < attach->span; i++)
{
line = &lines->lines[attach->pos - lines->min + i];
@@ -831,6 +847,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
gint span_natural;
gint span_expand;
gboolean force_expand;
+ gint spacing;
gint extra;
gint expand;
gint line_extra;
@@ -838,6 +855,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
linedata = &priv->linedata[orientation];
lines = &request->lines[orientation];
+ spacing = get_spacing (request->grid, orientation);
for (list = priv->children; list; list = list->next)
{
@@ -853,8 +871,8 @@ gtk_grid_request_spanning (GtkGridRequest *request,
/* We ignore baselines for spanning children */
compute_request_for_child (request, child, orientation, contextual, &minimum, &natural, NULL, NULL);
- span_minimum = (attach->span - 1) * linedata->spacing;
- span_natural = (attach->span - 1) * linedata->spacing;
+ span_minimum = (attach->span - 1) * spacing;
+ span_natural = (attach->span - 1) * spacing;
span_expand = 0;
force_expand = FALSE;
for (i = 0; i < attach->span; i++)
@@ -886,7 +904,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
{
gint total, m;
- total = minimum - (attach->span - 1) * linedata->spacing;
+ total = minimum - (attach->span - 1) * spacing;
m = total / attach->span + (total % attach->span ? 1 : 0);
for (i = 0; i < attach->span; i++)
{
@@ -918,7 +936,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
{
gint total, n;
- total = natural - (attach->span - 1) * linedata->spacing;
+ total = natural - (attach->span - 1) * spacing;
n = total / attach->span + (total % attach->span ? 1 : 0);
for (i = 0; i < attach->span; i++)
{
@@ -1071,16 +1089,16 @@ gtk_grid_request_sum (GtkGridRequest *request,
gint *natural_baseline)
{
GtkGridPrivate *priv = request->grid->priv;
- GtkGridLineData *linedata;
GtkGridLines *lines;
gint i;
gint min, nat;
gint nonempty;
+ gint spacing;
gtk_grid_request_compute_expand (request, orientation, G_MININT, G_MAXINT, &nonempty, NULL);
- linedata = &priv->linedata[orientation];
lines = &request->lines[orientation];
+ spacing = get_spacing (request->grid, orientation);
min = 0;
nat = 0;
@@ -1101,16 +1119,16 @@ gtk_grid_request_sum (GtkGridRequest *request,
if (!lines->lines[i].empty)
{
- min += linedata->spacing;
- nat += linedata->spacing;
+ min += spacing;
+ nat += spacing;
}
}
/* Remove last spacing, if any was applied */
if (nonempty > 0)
{
- min -= linedata->spacing;
- nat -= linedata->spacing;
+ min -= spacing;
+ nat -= spacing;
}
*minimum = min;
@@ -1226,9 +1244,11 @@ gtk_grid_request_allocate (GtkGridRequest *request,
gint rest;
gint size1, size2;
gint split, split_pos;
+ gint spacing;
linedata = &priv->linedata[orientation];
lines = &request->lines[orientation];
+ spacing = get_spacing (request->grid, orientation);
baseline = gtk_widget_get_allocated_baseline (GTK_WIDGET (request->grid));
@@ -1243,12 +1263,12 @@ gtk_grid_request_allocate (GtkGridRequest *request,
if (nonempty2 > 0)
{
- size1 = split_pos - (nonempty1) * linedata->spacing;
- size2 = (total_size - split_pos) - (nonempty2 - 1) * linedata->spacing;
+ size1 = split_pos - (nonempty1) * spacing;
+ size2 = (total_size - split_pos) - (nonempty2 - 1) * spacing;
}
else
{
- size1 = total_size - (nonempty1 - 1) * linedata->spacing;
+ size1 = total_size - (nonempty1 - 1) * spacing;
size2 = 0;
}
}
@@ -1258,7 +1278,7 @@ gtk_grid_request_allocate (GtkGridRequest *request,
nonempty2 = expand2 = 0;
split = lines->max;
- size1 = total_size - (nonempty1 - 1) * linedata->spacing;
+ size1 = total_size - (nonempty1 - 1) * spacing;
size2 = 0;
}
@@ -1357,15 +1377,15 @@ gtk_grid_request_position (GtkGridRequest *request,
GtkOrientation orientation)
{
GtkGridPrivate *priv = request->grid->priv;
- GtkGridLineData *linedata;
GtkGridLines *lines;
GtkGridLine *line;
gint position, old_position;
int allocated_baseline;
+ gint spacing;
gint i, j;
- linedata = &priv->linedata[orientation];
lines = &request->lines[orientation];
+ spacing = get_spacing (request->grid, orientation);
allocated_baseline = gtk_widget_get_allocated_baseline (GTK_WIDGET(request->grid));
@@ -1393,7 +1413,7 @@ gtk_grid_request_position (GtkGridRequest *request,
if (!line->empty)
{
line->position = position;
- position += line->allocation + linedata->spacing;
+ position += line->allocation + spacing;
if (orientation == GTK_ORIENTATION_VERTICAL &&
i + lines->min == priv->baseline_row &&
@@ -1529,14 +1549,11 @@ allocate_child (GtkGridRequest *request,
gint *size,
gint *baseline)
{
- GtkGridPrivate *priv = request->grid->priv;
- GtkGridLineData *linedata;
GtkGridLines *lines;
GtkGridLine *line;
GtkGridChildAttach *attach;
gint i;
- linedata = &priv->linedata[orientation];
lines = &request->lines[orientation];
attach = &child->attach[orientation];
@@ -1546,7 +1563,7 @@ allocate_child (GtkGridRequest *request,
else
*baseline = -1;
- *size = (attach->span - 1) * linedata->spacing;
+ *size = (attach->span - 1) * get_spacing (request->grid, orientation);
for (i = 0; i < attach->span; i++)
{
line = &lines->lines[attach->pos - lines->min + i];
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]