mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 19:00:08 +00:00
grid: Implement support for CSS border-spacing
This commit is contained in:
parent
404cdd5d02
commit
0eecc6f686
@ -28,6 +28,8 @@
|
|||||||
#include "gtkwidgetprivate.h"
|
#include "gtkwidgetprivate.h"
|
||||||
#include "gtkcontainerprivate.h"
|
#include "gtkcontainerprivate.h"
|
||||||
#include "gtkcsscustomgadgetprivate.h"
|
#include "gtkcsscustomgadgetprivate.h"
|
||||||
|
#include "gtkcsspositionvalueprivate.h"
|
||||||
|
#include "gtkstylecontextprivate.h"
|
||||||
#include "gtkprivate.h"
|
#include "gtkprivate.h"
|
||||||
#include "gtkintl.h"
|
#include "gtkintl.h"
|
||||||
|
|
||||||
@ -549,6 +551,23 @@ gtk_grid_child_type (GtkContainer *container)
|
|||||||
return GTK_TYPE_WIDGET;
|
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.
|
/* Calculates the min and max numbers for both orientations.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
@ -626,19 +645,16 @@ compute_allocation_for_child (GtkGridRequest *request,
|
|||||||
GtkGridChild *child,
|
GtkGridChild *child,
|
||||||
GtkOrientation orientation)
|
GtkOrientation orientation)
|
||||||
{
|
{
|
||||||
GtkGridPrivate *priv = request->grid->priv;
|
|
||||||
GtkGridLineData *linedata;
|
|
||||||
GtkGridLines *lines;
|
GtkGridLines *lines;
|
||||||
GtkGridLine *line;
|
GtkGridLine *line;
|
||||||
GtkGridChildAttach *attach;
|
GtkGridChildAttach *attach;
|
||||||
gint size;
|
gint size;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
linedata = &priv->linedata[orientation];
|
|
||||||
lines = &request->lines[orientation];
|
lines = &request->lines[orientation];
|
||||||
attach = &child->attach[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++)
|
for (i = 0; i < attach->span; i++)
|
||||||
{
|
{
|
||||||
line = &lines->lines[attach->pos - lines->min + i];
|
line = &lines->lines[attach->pos - lines->min + i];
|
||||||
@ -831,6 +847,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
|
|||||||
gint span_natural;
|
gint span_natural;
|
||||||
gint span_expand;
|
gint span_expand;
|
||||||
gboolean force_expand;
|
gboolean force_expand;
|
||||||
|
gint spacing;
|
||||||
gint extra;
|
gint extra;
|
||||||
gint expand;
|
gint expand;
|
||||||
gint line_extra;
|
gint line_extra;
|
||||||
@ -838,6 +855,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
|
|||||||
|
|
||||||
linedata = &priv->linedata[orientation];
|
linedata = &priv->linedata[orientation];
|
||||||
lines = &request->lines[orientation];
|
lines = &request->lines[orientation];
|
||||||
|
spacing = get_spacing (request->grid, orientation);
|
||||||
|
|
||||||
for (list = priv->children; list; list = list->next)
|
for (list = priv->children; list; list = list->next)
|
||||||
{
|
{
|
||||||
@ -853,8 +871,8 @@ gtk_grid_request_spanning (GtkGridRequest *request,
|
|||||||
/* We ignore baselines for spanning children */
|
/* We ignore baselines for spanning children */
|
||||||
compute_request_for_child (request, child, orientation, contextual, &minimum, &natural, NULL, NULL);
|
compute_request_for_child (request, child, orientation, contextual, &minimum, &natural, NULL, NULL);
|
||||||
|
|
||||||
span_minimum = (attach->span - 1) * linedata->spacing;
|
span_minimum = (attach->span - 1) * spacing;
|
||||||
span_natural = (attach->span - 1) * linedata->spacing;
|
span_natural = (attach->span - 1) * spacing;
|
||||||
span_expand = 0;
|
span_expand = 0;
|
||||||
force_expand = FALSE;
|
force_expand = FALSE;
|
||||||
for (i = 0; i < attach->span; i++)
|
for (i = 0; i < attach->span; i++)
|
||||||
@ -886,7 +904,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
|
|||||||
{
|
{
|
||||||
gint total, m;
|
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);
|
m = total / attach->span + (total % attach->span ? 1 : 0);
|
||||||
for (i = 0; i < attach->span; i++)
|
for (i = 0; i < attach->span; i++)
|
||||||
{
|
{
|
||||||
@ -918,7 +936,7 @@ gtk_grid_request_spanning (GtkGridRequest *request,
|
|||||||
{
|
{
|
||||||
gint total, n;
|
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);
|
n = total / attach->span + (total % attach->span ? 1 : 0);
|
||||||
for (i = 0; i < attach->span; i++)
|
for (i = 0; i < attach->span; i++)
|
||||||
{
|
{
|
||||||
@ -1071,16 +1089,16 @@ gtk_grid_request_sum (GtkGridRequest *request,
|
|||||||
gint *natural_baseline)
|
gint *natural_baseline)
|
||||||
{
|
{
|
||||||
GtkGridPrivate *priv = request->grid->priv;
|
GtkGridPrivate *priv = request->grid->priv;
|
||||||
GtkGridLineData *linedata;
|
|
||||||
GtkGridLines *lines;
|
GtkGridLines *lines;
|
||||||
gint i;
|
gint i;
|
||||||
gint min, nat;
|
gint min, nat;
|
||||||
gint nonempty;
|
gint nonempty;
|
||||||
|
gint spacing;
|
||||||
|
|
||||||
gtk_grid_request_compute_expand (request, orientation, G_MININT, G_MAXINT, &nonempty, NULL);
|
gtk_grid_request_compute_expand (request, orientation, G_MININT, G_MAXINT, &nonempty, NULL);
|
||||||
|
|
||||||
linedata = &priv->linedata[orientation];
|
|
||||||
lines = &request->lines[orientation];
|
lines = &request->lines[orientation];
|
||||||
|
spacing = get_spacing (request->grid, orientation);
|
||||||
|
|
||||||
min = 0;
|
min = 0;
|
||||||
nat = 0;
|
nat = 0;
|
||||||
@ -1101,16 +1119,16 @@ gtk_grid_request_sum (GtkGridRequest *request,
|
|||||||
|
|
||||||
if (!lines->lines[i].empty)
|
if (!lines->lines[i].empty)
|
||||||
{
|
{
|
||||||
min += linedata->spacing;
|
min += spacing;
|
||||||
nat += linedata->spacing;
|
nat += spacing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove last spacing, if any was applied */
|
/* Remove last spacing, if any was applied */
|
||||||
if (nonempty > 0)
|
if (nonempty > 0)
|
||||||
{
|
{
|
||||||
min -= linedata->spacing;
|
min -= spacing;
|
||||||
nat -= linedata->spacing;
|
nat -= spacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
*minimum = min;
|
*minimum = min;
|
||||||
@ -1226,9 +1244,11 @@ gtk_grid_request_allocate (GtkGridRequest *request,
|
|||||||
gint rest;
|
gint rest;
|
||||||
gint size1, size2;
|
gint size1, size2;
|
||||||
gint split, split_pos;
|
gint split, split_pos;
|
||||||
|
gint spacing;
|
||||||
|
|
||||||
linedata = &priv->linedata[orientation];
|
linedata = &priv->linedata[orientation];
|
||||||
lines = &request->lines[orientation];
|
lines = &request->lines[orientation];
|
||||||
|
spacing = get_spacing (request->grid, orientation);
|
||||||
|
|
||||||
baseline = gtk_widget_get_allocated_baseline (GTK_WIDGET (request->grid));
|
baseline = gtk_widget_get_allocated_baseline (GTK_WIDGET (request->grid));
|
||||||
|
|
||||||
@ -1243,12 +1263,12 @@ gtk_grid_request_allocate (GtkGridRequest *request,
|
|||||||
|
|
||||||
if (nonempty2 > 0)
|
if (nonempty2 > 0)
|
||||||
{
|
{
|
||||||
size1 = split_pos - (nonempty1) * linedata->spacing;
|
size1 = split_pos - (nonempty1) * spacing;
|
||||||
size2 = (total_size - split_pos) - (nonempty2 - 1) * linedata->spacing;
|
size2 = (total_size - split_pos) - (nonempty2 - 1) * spacing;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size1 = total_size - (nonempty1 - 1) * linedata->spacing;
|
size1 = total_size - (nonempty1 - 1) * spacing;
|
||||||
size2 = 0;
|
size2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1258,7 +1278,7 @@ gtk_grid_request_allocate (GtkGridRequest *request,
|
|||||||
nonempty2 = expand2 = 0;
|
nonempty2 = expand2 = 0;
|
||||||
split = lines->max;
|
split = lines->max;
|
||||||
|
|
||||||
size1 = total_size - (nonempty1 - 1) * linedata->spacing;
|
size1 = total_size - (nonempty1 - 1) * spacing;
|
||||||
size2 = 0;
|
size2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1357,15 +1377,15 @@ gtk_grid_request_position (GtkGridRequest *request,
|
|||||||
GtkOrientation orientation)
|
GtkOrientation orientation)
|
||||||
{
|
{
|
||||||
GtkGridPrivate *priv = request->grid->priv;
|
GtkGridPrivate *priv = request->grid->priv;
|
||||||
GtkGridLineData *linedata;
|
|
||||||
GtkGridLines *lines;
|
GtkGridLines *lines;
|
||||||
GtkGridLine *line;
|
GtkGridLine *line;
|
||||||
gint position, old_position;
|
gint position, old_position;
|
||||||
int allocated_baseline;
|
int allocated_baseline;
|
||||||
|
gint spacing;
|
||||||
gint i, j;
|
gint i, j;
|
||||||
|
|
||||||
linedata = &priv->linedata[orientation];
|
|
||||||
lines = &request->lines[orientation];
|
lines = &request->lines[orientation];
|
||||||
|
spacing = get_spacing (request->grid, orientation);
|
||||||
|
|
||||||
allocated_baseline = gtk_widget_get_allocated_baseline (GTK_WIDGET(request->grid));
|
allocated_baseline = gtk_widget_get_allocated_baseline (GTK_WIDGET(request->grid));
|
||||||
|
|
||||||
@ -1393,7 +1413,7 @@ gtk_grid_request_position (GtkGridRequest *request,
|
|||||||
if (!line->empty)
|
if (!line->empty)
|
||||||
{
|
{
|
||||||
line->position = position;
|
line->position = position;
|
||||||
position += line->allocation + linedata->spacing;
|
position += line->allocation + spacing;
|
||||||
|
|
||||||
if (orientation == GTK_ORIENTATION_VERTICAL &&
|
if (orientation == GTK_ORIENTATION_VERTICAL &&
|
||||||
i + lines->min == priv->baseline_row &&
|
i + lines->min == priv->baseline_row &&
|
||||||
@ -1529,14 +1549,11 @@ allocate_child (GtkGridRequest *request,
|
|||||||
gint *size,
|
gint *size,
|
||||||
gint *baseline)
|
gint *baseline)
|
||||||
{
|
{
|
||||||
GtkGridPrivate *priv = request->grid->priv;
|
|
||||||
GtkGridLineData *linedata;
|
|
||||||
GtkGridLines *lines;
|
GtkGridLines *lines;
|
||||||
GtkGridLine *line;
|
GtkGridLine *line;
|
||||||
GtkGridChildAttach *attach;
|
GtkGridChildAttach *attach;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
linedata = &priv->linedata[orientation];
|
|
||||||
lines = &request->lines[orientation];
|
lines = &request->lines[orientation];
|
||||||
attach = &child->attach[orientation];
|
attach = &child->attach[orientation];
|
||||||
|
|
||||||
@ -1546,7 +1563,7 @@ allocate_child (GtkGridRequest *request,
|
|||||||
else
|
else
|
||||||
*baseline = -1;
|
*baseline = -1;
|
||||||
|
|
||||||
*size = (attach->span - 1) * linedata->spacing;
|
*size = (attach->span - 1) * get_spacing (request->grid, orientation);
|
||||||
for (i = 0; i < attach->span; i++)
|
for (i = 0; i < attach->span; i++)
|
||||||
{
|
{
|
||||||
line = &lines->lines[attach->pos - lines->min + i];
|
line = &lines->lines[attach->pos - lines->min + i];
|
||||||
|
Loading…
Reference in New Issue
Block a user