Commit e34589dd authored by Paolo Borelli's avatar Paolo Borelli

Factor out _gtk_misc_get_padding_and_border

The new semi-private function will allow to implement support for css
padding and border in widgets inheriting from GtkMisc.
Use the new function for GtkLabel, GtkArrow and GtkImage.
parent bf7779bf
......@@ -207,15 +207,15 @@ gtk_arrow_get_preferred_width (GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
gint xpad;
GtkBorder border;
gtk_misc_get_padding (GTK_MISC (widget), &xpad, NULL);
_gtk_misc_get_padding_and_border (GTK_MISC (widget), &border);
if (minimum_size)
*minimum_size = MIN_ARROW_SIZE + xpad * 2;
*minimum_size = MIN_ARROW_SIZE + border.left + border.right;
if (natural_size)
*natural_size = MIN_ARROW_SIZE + xpad * 2;
*natural_size = MIN_ARROW_SIZE + border.left + border.right;
}
static void
......@@ -223,18 +223,17 @@ gtk_arrow_get_preferred_height (GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
gint ypad;
GtkBorder border;
gtk_misc_get_padding (GTK_MISC (widget), NULL, &ypad);
_gtk_misc_get_padding_and_border (GTK_MISC (widget), &border);
if (minimum_size)
*minimum_size = MIN_ARROW_SIZE + ypad * 2;
*minimum_size = MIN_ARROW_SIZE + border.top + border.bottom;
if (natural_size)
*natural_size = MIN_ARROW_SIZE + ypad * 2;
*natural_size = MIN_ARROW_SIZE + border.top + border.bottom;
}
/**
* gtk_arrow_new:
* @arrow_type: a valid #GtkArrowType.
......@@ -306,19 +305,17 @@ gtk_arrow_set (GtkArrow *arrow,
}
}
static gboolean
gtk_arrow_draw (GtkWidget *widget,
cairo_t *cr)
{
GtkArrow *arrow = GTK_ARROW (widget);
GtkArrowPrivate *priv = arrow->priv;
GtkMisc *misc = GTK_MISC (widget);
GtkStyleContext *context;
gdouble x, y;
gint width, height;
gint extent;
gint xpad, ypad;
GtkBorder border;
gfloat xalign, yalign;
GtkArrowType effective_arrow_type;
gfloat arrow_scaling;
......@@ -330,11 +327,11 @@ gtk_arrow_draw (GtkWidget *widget,
context = gtk_widget_get_style_context (widget);
gtk_widget_style_get (widget, "arrow-scaling", &arrow_scaling, NULL);
gtk_misc_get_padding (misc, &xpad, &ypad);
gtk_misc_get_alignment (misc, &xalign, &yalign);
_gtk_misc_get_padding_and_border (GTK_MISC (widget), &border);
gtk_misc_get_alignment (GTK_MISC (widget), &xalign, &yalign);
width = gtk_widget_get_allocated_width (widget) - 2 * xpad;
height = gtk_widget_get_allocated_height (widget) - 2 * ypad;
width = gtk_widget_get_allocated_width (widget) - border.left - border.right;
height = gtk_widget_get_allocated_height (widget) - border.top - border.bottom;
extent = MIN (width, height) * arrow_scaling;
effective_arrow_type = priv->arrow_type;
......@@ -348,8 +345,8 @@ gtk_arrow_draw (GtkWidget *widget,
effective_arrow_type = GTK_ARROW_LEFT;
}
x = xpad + ((width - extent) * xalign);
y = ypad + ((height - extent) * yalign);
x = border.left + ((width - extent) * xalign);
y = border.top + ((height - extent) * yalign);
switch (effective_arrow_type)
{
......
......@@ -1349,15 +1349,16 @@ gtk_image_get_preferred_size (GtkImage *image,
gint *height_out)
{
GtkImagePrivate *priv = image->priv;
gint xpad, ypad, width, height;
gint width, height;
GtkBorder border;
GtkStyleContext *context;
context = gtk_widget_get_style_context (GTK_WIDGET (image));
gtk_misc_get_padding (GTK_MISC (image), &xpad, &ypad);
_gtk_icon_helper_get_size (priv->icon_helper, context, &width, &height);
_gtk_misc_get_padding_and_border (GTK_MISC (image), &border);
width += 2 * xpad;
height += 2 * ypad;
width += border.left + border.right;
height += border.top + border.bottom;
if (width_out)
*width_out = width;
......@@ -1374,8 +1375,8 @@ gtk_image_draw (GtkWidget *widget,
GtkMisc *misc;
GtkStyleContext *context;
gint x, y, width, height;
gint xpad, ypad;
gfloat xalign, yalign;
GtkBorder border;
g_return_val_if_fail (GTK_IS_IMAGE (widget), FALSE);
......@@ -1386,14 +1387,19 @@ gtk_image_draw (GtkWidget *widget,
context = gtk_widget_get_style_context (widget);
gtk_misc_get_alignment (misc, &xalign, &yalign);
gtk_misc_get_padding (misc, &xpad, &ypad);
gtk_image_get_preferred_size (image, &width, &height);
_gtk_misc_get_padding_and_border (misc, &border);
if (gtk_widget_get_direction (widget) != GTK_TEXT_DIR_LTR)
xalign = 1.0 - xalign;
x = floor (xpad + ((gtk_widget_get_allocated_width (widget) - width) * xalign));
y = floor (ypad + ((gtk_widget_get_allocated_height (widget) - height) * yalign));
x = floor ((gtk_widget_get_allocated_width (widget) - width) * xalign);
y = floor ((gtk_widget_get_allocated_height (widget) - height) * yalign);
gtk_render_frame (context, cr, x, y, width, height);
x += border.left;
y += border.top;
if (gtk_image_get_storage_type (image) == GTK_IMAGE_ANIMATION)
{
......
......@@ -3239,14 +3239,14 @@ gtk_label_update_layout_width (GtkLabel *label)
if (priv->ellipsize || priv->wrap)
{
GtkBorder border;
PangoRectangle logical;
gint xpad, ypad;
gint width, height;
gtk_misc_get_padding (GTK_MISC (label), &xpad, &ypad);
_gtk_misc_get_padding_and_border (GTK_MISC (label), &border);
width = gtk_widget_get_allocated_width (GTK_WIDGET (label)) - xpad * 2;
height = gtk_widget_get_allocated_height (GTK_WIDGET (label)) - ypad * 2;
width = gtk_widget_get_allocated_width (GTK_WIDGET (label)) - border.left - border.right;
height = gtk_widget_get_allocated_height (GTK_WIDGET (label)) - border.top - border.bottom;
if (priv->have_transform)
{
......@@ -3606,7 +3606,7 @@ gtk_label_get_preferred_size (GtkWidget *widget,
GtkLabelPrivate *priv = label->priv;
PangoRectangle required_rect;
PangoRectangle natural_rect;
gint xpad, ypad;
GtkBorder border;
gtk_label_get_preferred_layout_size (label, &required_rect, &natural_rect);
......@@ -3652,7 +3652,7 @@ gtk_label_get_preferred_size (GtkWidget *widget,
natural_rect.width = PANGO_PIXELS_CEIL (natural_rect.width);
natural_rect.height = PANGO_PIXELS_CEIL (natural_rect.height);
gtk_misc_get_padding (GTK_MISC (label), &xpad, &ypad);
_gtk_misc_get_padding_and_border (GTK_MISC (label), &border);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
......@@ -3678,8 +3678,8 @@ gtk_label_get_preferred_size (GtkWidget *widget,
*natural_size = natural_rect.width;
}
*minimum_size += xpad * 2;
*natural_size += xpad * 2;
*minimum_size += border.left + border.right;
*natural_size += border.left + border.right;
}
else /* GTK_ORIENTATION_VERTICAL */
{
......@@ -3706,12 +3706,11 @@ gtk_label_get_preferred_size (GtkWidget *widget,
*natural_size = natural_rect.height;
}
*minimum_size += ypad * 2;
*natural_size += ypad * 2;
*minimum_size += border.top + border.bottom;
*natural_size += border.top + border.bottom;
}
}
static void
gtk_label_get_preferred_width (GtkWidget *widget,
gint *minimum_size,
......@@ -3739,22 +3738,22 @@ gtk_label_get_preferred_width_for_height (GtkWidget *widget,
if (priv->wrap && (priv->angle == 90 || priv->angle == 270))
{
gint xpad, ypad;
GtkBorder border;
gtk_misc_get_padding (GTK_MISC (label), &xpad, &ypad);
_gtk_misc_get_padding_and_border (GTK_MISC (label), &border);
if (priv->wrap)
gtk_label_clear_layout (label);
get_size_for_allocation (label, GTK_ORIENTATION_VERTICAL,
MAX (1, height - (ypad * 2)),
MAX (1, height - border.top - border.bottom),
minimum_width, natural_width);
if (minimum_width)
*minimum_width += xpad * 2;
*minimum_width += border.right + border.left;
if (natural_width)
*natural_width += xpad * 2;
*natural_width += border.right + border.left;
}
else
GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, minimum_width, natural_width);
......@@ -3771,22 +3770,22 @@ gtk_label_get_preferred_height_for_width (GtkWidget *widget,
if (priv->wrap && (priv->angle == 0 || priv->angle == 180 || priv->angle == 360))
{
gint xpad, ypad;
GtkBorder border;
gtk_misc_get_padding (GTK_MISC (label), &xpad, &ypad);
_gtk_misc_get_padding_and_border (GTK_MISC (label), &border);
if (priv->wrap)
gtk_label_clear_layout (label);
get_size_for_allocation (label, GTK_ORIENTATION_HORIZONTAL,
MAX (1, width - xpad * 2),
MAX (1, width - border.left - border.right),
minimum_height, natural_height);
if (minimum_height)
*minimum_height += ypad * 2;
*minimum_height += border.top + border.bottom;
if (natural_height)
*natural_height += ypad * 2;
*natural_height += border.top + border.bottom;
}
else
GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, minimum_height, natural_height);
......@@ -3906,9 +3905,9 @@ get_layout_location (GtkLabel *label,
GtkMisc *misc;
GtkWidget *widget;
GtkLabelPrivate *priv;
GtkBorder border;
gint req_width, x, y;
gint req_height;
gint xpad, ypad;
gfloat xalign, yalign;
PangoRectangle logical;
......@@ -3917,7 +3916,7 @@ get_layout_location (GtkLabel *label,
priv = label->priv;
gtk_misc_get_alignment (misc, &xalign, &yalign);
gtk_misc_get_padding (misc, &xpad, &ypad);
_gtk_misc_get_padding_and_border (GTK_MISC (label), &border);
if (gtk_widget_get_direction (widget) != GTK_TEXT_DIR_LTR)
xalign = 1.0 - xalign;
......@@ -3936,13 +3935,12 @@ get_layout_location (GtkLabel *label,
req_width = logical.width;
req_height = logical.height;
req_width += 2 * xpad;
req_height += 2 * ypad;
req_width += border.left + border.right;
req_height += border.top + border.bottom;
gtk_widget_get_allocation (widget, &allocation);
x = floor (allocation.x + xpad + xalign * (allocation.width - req_width) - logical.x);
x = floor (allocation.x + border.left + xalign * (allocation.width - req_width) - logical.x);
/* bgo#315462 - For single-line labels, *do* align the requisition with
* respect to the allocation, even if we are under-allocated. For multi-line
......@@ -3958,9 +3956,9 @@ get_layout_location (GtkLabel *label,
* middle". You want to read the first line, at least, to get some context.
*/
if (pango_layout_get_line_count (priv->layout) == 1)
y = floor (allocation.y + ypad + (allocation.height - req_height) * yalign) - logical.y;
y = floor (allocation.y + border.top + (allocation.height - req_height) * yalign) - logical.y;
else
y = floor (allocation.y + ypad + MAX ((allocation.height - req_height) * yalign, 0)) - logical.y;
y = floor (allocation.y + border.top + MAX ((allocation.height - req_height) * yalign, 0)) - logical.y;
if (xp)
*xp = x;
......
......@@ -403,3 +403,36 @@ gtk_misc_realize (GtkWidget *widget)
gdk_window_set_background_pattern (window, NULL);
}
}
/* Semi-private function used by gtk widgets inheriting from
* GtkMisc that takes into account both css padding and border
* and the padding specified with the GtkMisc properties.
*/
void
_gtk_misc_get_padding_and_border (GtkMisc *misc,
GtkBorder *border)
{
GtkStyleContext *context;
GtkStateFlags state;
GtkBorder tmp;
gint xpad, ypad;
g_return_if_fail (GTK_IS_MISC (misc));
context = gtk_widget_get_style_context (GTK_WIDGET (misc));
state = gtk_widget_get_state_flags (GTK_WIDGET (misc));
gtk_style_context_get_padding (context, state, border);
gtk_misc_get_padding (misc, &xpad, &ypad);
border->right = border->left = xpad;
border->top = border->bottom = xpad;
gtk_style_context_get_border (context, state, &tmp);
border->top += tmp.top;
border->right += tmp.right;
border->bottom += tmp.bottom;
border->left += tmp.left;
}
......@@ -83,6 +83,8 @@ void gtk_misc_get_padding (GtkMisc *misc,
gint *xpad,
gint *ypad);
void _gtk_misc_get_padding_and_border (GtkMisc *misc,
GtkBorder *border);
G_END_DECLS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment