label: Move ellipsized layout width computation

... from size_allocate() to update_layout_width().
This commit is contained in:
Benjamin Otte
2011-03-29 13:21:48 +02:00
parent bd3e947485
commit c94dca36ca

View File

@@ -3214,7 +3214,78 @@ gtk_label_update_layout_width (GtkLabel *label)
gtk_widget_get_allocation (widget, &allocation);
if (priv->ellipsize)
pango_layout_set_width (priv->layout, allocation.width * PANGO_SCALE);
{
PangoRectangle logical;
PangoRectangle bounds;
gint xpad, ypad;
gtk_misc_get_padding (GTK_MISC (label), &xpad, &ypad);
bounds.x = bounds.y = 0;
bounds.width = allocation.width - xpad * 2;
bounds.height = allocation.height - ypad * 2;
pango_layout_set_width (priv->layout, -1);
pango_layout_get_pixel_extents (priv->layout, NULL, &logical);
if (priv->have_transform)
{
PangoContext *context = gtk_widget_get_pango_context (widget);
const PangoMatrix *matrix = pango_context_get_matrix (context);
const gdouble dx = matrix->xx; /* cos (M_PI * angle / 180) */
const gdouble dy = matrix->xy; /* sin (M_PI * angle / 180) */
if (fabs (dy) < 0.01)
{
if (logical.width > bounds.width)
pango_layout_set_width (priv->layout, bounds.width * PANGO_SCALE);
}
else if (fabs (dx) < 0.01)
{
if (logical.width > bounds.height)
pango_layout_set_width (priv->layout, bounds.height * PANGO_SCALE);
}
else
{
gdouble x0, y0, x1, y1, length;
gboolean vertical;
gint cy;
x0 = bounds.width / 2;
y0 = dx ? x0 * dy / dx : G_MAXDOUBLE;
vertical = fabs (y0) > bounds.height / 2;
if (vertical)
{
y0 = bounds.height/2;
x0 = dy ? y0 * dx / dy : G_MAXDOUBLE;
}
length = 2 * sqrt (x0 * x0 + y0 * y0);
pango_layout_set_width (priv->layout, rint (length * PANGO_SCALE));
pango_layout_get_pixel_size (priv->layout, NULL, &cy);
x1 = +dy * cy/2;
y1 = -dx * cy/2;
if (vertical)
{
y0 = bounds.height/2 + y1 - y0;
x0 = -y0 * dx/dy;
}
else
{
x0 = bounds.width/2 + x1 - x0;
y0 = -x0 * dy/dx;
}
length = length - sqrt (x0 * x0 + y0 * y0) * 2;
pango_layout_set_width (priv->layout, rint (length * PANGO_SCALE));
}
}
else if (logical.width > bounds.width)
pango_layout_set_width (priv->layout, bounds.width * PANGO_SCALE);
}
else if (priv->wrap)
{
GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (widget, FALSE);
@@ -3740,83 +3811,6 @@ gtk_label_size_allocate (GtkWidget *widget,
gtk_label_ensure_layout (label);
if (priv->ellipsize)
{
if (priv->layout)
{
PangoRectangle logical;
PangoRectangle bounds;
gint xpad, ypad;
gtk_misc_get_padding (GTK_MISC (label), &xpad, &ypad);
bounds.x = bounds.y = 0;
bounds.width = allocation->width - xpad * 2;
bounds.height = allocation->height - ypad * 2;
pango_layout_set_width (priv->layout, -1);
pango_layout_get_pixel_extents (priv->layout, NULL, &logical);
if (priv->have_transform)
{
PangoContext *context = gtk_widget_get_pango_context (widget);
const PangoMatrix *matrix = pango_context_get_matrix (context);
const gdouble dx = matrix->xx; /* cos (M_PI * angle / 180) */
const gdouble dy = matrix->xy; /* sin (M_PI * angle / 180) */
if (fabs (dy) < 0.01)
{
if (logical.width > bounds.width)
pango_layout_set_width (priv->layout, bounds.width * PANGO_SCALE);
}
else if (fabs (dx) < 0.01)
{
if (logical.width > bounds.height)
pango_layout_set_width (priv->layout, bounds.height * PANGO_SCALE);
}
else
{
gdouble x0, y0, x1, y1, length;
gboolean vertical;
gint cy;
x0 = bounds.width / 2;
y0 = dx ? x0 * dy / dx : G_MAXDOUBLE;
vertical = fabs (y0) > bounds.height / 2;
if (vertical)
{
y0 = bounds.height/2;
x0 = dy ? y0 * dx / dy : G_MAXDOUBLE;
}
length = 2 * sqrt (x0 * x0 + y0 * y0);
pango_layout_set_width (priv->layout, rint (length * PANGO_SCALE));
pango_layout_get_pixel_size (priv->layout, NULL, &cy);
x1 = +dy * cy/2;
y1 = -dx * cy/2;
if (vertical)
{
y0 = bounds.height/2 + y1 - y0;
x0 = -y0 * dx/dy;
}
else
{
x0 = bounds.width/2 + x1 - x0;
y0 = -x0 * dy/dx;
}
length = length - sqrt (x0 * x0 + y0 * y0) * 2;
pango_layout_set_width (priv->layout, rint (length * PANGO_SCALE));
}
}
else if (logical.width > bounds.width)
pango_layout_set_width (priv->layout, bounds.width * PANGO_SCALE);
}
}
if (priv->select_info && priv->select_info->window)
{
gdk_window_move_resize (priv->select_info->window,