Avoid resizing GtkStatusbar if the text of the label changes (#90955, He

2004-11-09  Matthias Clasen  <mclasen@redhat.com>

	Avoid resizing GtkStatusbar if the text of the label
	changes  (#90955, He Qiangqiang, fix proposed by
	Owen Taylor, patch by Christian Persch)

	* gtk/gtklabel.[hc]: Add a boolean single-line-mode property
	which causes the label height not to depend on the actual
	text, but only on the font.

	* gtk/gtkstatusbar.c (gtk_statusbar_init): Turn on
	single-line-mode for the label.
This commit is contained in:
Matthias Clasen 2004-11-09 05:04:41 +00:00 committed by Matthias Clasen
parent c4183ed568
commit b87307b918
9 changed files with 163 additions and 3 deletions

View File

@ -1,3 +1,16 @@
2004-11-09 Matthias Clasen <mclasen@redhat.com>
Avoid resizing GtkStatusbar if the text of the label
changes (#90955, He Qiangqiang, fix proposed by
Owen Taylor, patch by Christian Persch)
* gtk/gtklabel.[hc]: Add a boolean single-line-mode property
which causes the label height not to depend on the actual
text, but only on the font.
* gtk/gtkstatusbar.c (gtk_statusbar_init): Turn on
single-line-mode for the label.
2004-11-08 Matthias Clasen <mclasen@redhat.com> 2004-11-08 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkfilefilter.c (gtk_file_filter_filter): Use * gtk/gtkfilefilter.c (gtk_file_filter_filter): Use

View File

@ -1,3 +1,16 @@
2004-11-09 Matthias Clasen <mclasen@redhat.com>
Avoid resizing GtkStatusbar if the text of the label
changes (#90955, He Qiangqiang, fix proposed by
Owen Taylor, patch by Christian Persch)
* gtk/gtklabel.[hc]: Add a boolean single-line-mode property
which causes the label height not to depend on the actual
text, but only on the font.
* gtk/gtkstatusbar.c (gtk_statusbar_init): Turn on
single-line-mode for the label.
2004-11-08 Matthias Clasen <mclasen@redhat.com> 2004-11-08 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkfilefilter.c (gtk_file_filter_filter): Use * gtk/gtkfilefilter.c (gtk_file_filter_filter): Use

View File

@ -1,3 +1,16 @@
2004-11-09 Matthias Clasen <mclasen@redhat.com>
Avoid resizing GtkStatusbar if the text of the label
changes (#90955, He Qiangqiang, fix proposed by
Owen Taylor, patch by Christian Persch)
* gtk/gtklabel.[hc]: Add a boolean single-line-mode property
which causes the label height not to depend on the actual
text, but only on the font.
* gtk/gtkstatusbar.c (gtk_statusbar_init): Turn on
single-line-mode for the label.
2004-11-08 Matthias Clasen <mclasen@redhat.com> 2004-11-08 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkfilefilter.c (gtk_file_filter_filter): Use * gtk/gtkfilefilter.c (gtk_file_filter_filter): Use

View File

@ -1,3 +1,16 @@
2004-11-09 Matthias Clasen <mclasen@redhat.com>
Avoid resizing GtkStatusbar if the text of the label
changes (#90955, He Qiangqiang, fix proposed by
Owen Taylor, patch by Christian Persch)
* gtk/gtklabel.[hc]: Add a boolean single-line-mode property
which causes the label height not to depend on the actual
text, but only on the font.
* gtk/gtkstatusbar.c (gtk_statusbar_init): Turn on
single-line-mode for the label.
2004-11-08 Matthias Clasen <mclasen@redhat.com> 2004-11-08 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkfilefilter.c (gtk_file_filter_filter): Use * gtk/gtkfilefilter.c (gtk_file_filter_filter): Use

View File

@ -1,3 +1,7 @@
2004-11-09 Matthias Clasen <mclasen@redhat.com>
* gtk/gtk-sections.txt: Add gtk_label_[gs]et_single_line_mode.
2004-11-07 Matthias Clasen <mclasen@redhat.com> 2004-11-07 Matthias Clasen <mclasen@redhat.com>
* gtk/gtk-sections.txt: Add gtk_file_filter_add_pixbuf_formats. * gtk/gtk-sections.txt: Add gtk_file_filter_add_pixbuf_formats.

View File

@ -1932,9 +1932,11 @@ gtk_label_get_mnemonic_widget
gtk_label_get_selection_bounds gtk_label_get_selection_bounds
gtk_label_get_use_markup gtk_label_get_use_markup
gtk_label_get_use_underline gtk_label_get_use_underline
gtk_label_get_single_line_mode
gtk_label_set_label gtk_label_set_label
gtk_label_set_use_markup gtk_label_set_use_markup
gtk_label_set_use_underline gtk_label_set_use_underline
gtk_label_set_single_line_mode
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_LABEL GTK_LABEL
GTK_IS_LABEL GTK_IS_LABEL

View File

@ -47,6 +47,7 @@
typedef struct typedef struct
{ {
gint width_chars; gint width_chars;
guint single_line_mode : 1;
} }
GtkLabelPrivate; GtkLabelPrivate;
@ -80,7 +81,8 @@ enum {
PROP_CURSOR_POSITION, PROP_CURSOR_POSITION,
PROP_SELECTION_BOUND, PROP_SELECTION_BOUND,
PROP_ELLIPSIZE, PROP_ELLIPSIZE,
PROP_WIDTH_CHARS PROP_WIDTH_CHARS,
PROP_SINGLE_LINE_MODE
}; };
static guint signals[LAST_SIGNAL] = { 0 }; static guint signals[LAST_SIGNAL] = { 0 };
@ -420,7 +422,7 @@ gtk_label_class_init (GtkLabelClass *class)
* GtkLabel:width-chars: * GtkLabel:width-chars:
* *
* The desired width of the label, in characters. If this property is set to * The desired width of the label, in characters. If this property is set to
* %-1, the width will be calculated automatically, otherwise the label will * -1, the width will be calculated automatically, otherwise the label will
* request either 3 characters or the property value, whichever is greater. * request either 3 characters or the property value, whichever is greater.
* *
* Since: 2.6 * Since: 2.6
@ -435,6 +437,24 @@ gtk_label_class_init (GtkLabelClass *class)
-1, -1,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
/**
* GtkLabel:single-line-mode:
*
* Whether the label is in single line mode. In single line mode,
* the height of the label does not depend on the actual text, it
* is always set to ascent + descent of the font. This can be an
* advantage in situations where resizing the label because of text
* changes would be distracting, e.g. in a statusbar.
*
* Since: 2.6
**/
g_object_class_install_property (gobject_class,
PROP_SINGLE_LINE_MODE,
g_param_spec_boolean ("single-line-mode",
P_("Single Line Mode"),
P_("Whether the label is in single line mode"),
FALSE,
G_PARAM_READWRITE));
/* /*
* Key bindings * Key bindings
*/ */
@ -560,6 +580,9 @@ gtk_label_set_property (GObject *object,
case PROP_WIDTH_CHARS: case PROP_WIDTH_CHARS:
gtk_label_set_width_chars (label, g_value_get_int (value)); gtk_label_set_width_chars (label, g_value_get_int (value));
break; break;
case PROP_SINGLE_LINE_MODE:
gtk_label_set_single_line_mode (label, g_value_get_boolean (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -631,6 +654,9 @@ gtk_label_get_property (GObject *object,
case PROP_WIDTH_CHARS: case PROP_WIDTH_CHARS:
g_value_set_enum (value, gtk_label_get_width_chars (label)); g_value_set_enum (value, gtk_label_get_width_chars (label));
break; break;
case PROP_SINGLE_LINE_MODE:
g_value_set_boolean (value, gtk_label_get_single_line_mode (label));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1605,6 +1631,7 @@ gtk_label_ensure_layout (GtkLabel *label)
if (!label->layout) if (!label->layout)
{ {
PangoAlignment align = PANGO_ALIGN_LEFT; /* Quiet gcc */ PangoAlignment align = PANGO_ALIGN_LEFT; /* Quiet gcc */
GtkLabelPrivate *priv = GTK_LABEL_GET_PRIVATE (label);
label->layout = gtk_widget_create_pango_layout (widget, label->text); label->layout = gtk_widget_create_pango_layout (widget, label->text);
@ -1633,6 +1660,7 @@ gtk_label_ensure_layout (GtkLabel *label)
pango_layout_set_alignment (label->layout, align); pango_layout_set_alignment (label->layout, align);
pango_layout_set_ellipsize (label->layout, label->ellipsize); pango_layout_set_ellipsize (label->layout, label->ellipsize);
pango_layout_set_single_paragraph_mode (label->layout, priv->single_line_mode);
if (label->ellipsize) if (label->ellipsize)
pango_layout_set_width (label->layout, pango_layout_set_width (label->layout,
@ -1772,7 +1800,24 @@ gtk_label_size_request (GtkWidget *widget,
width += PANGO_PIXELS (logical_rect.width); width += PANGO_PIXELS (logical_rect.width);
} }
height += PANGO_PIXELS (logical_rect.height); if (priv->single_line_mode)
{
PangoContext *context;
PangoFontMetrics *metrics;
gint ascent, descent;
context = pango_layout_get_context (label->layout);
metrics = pango_context_get_metrics (context, widget->style->font_desc,
pango_context_get_language (context));
ascent = pango_font_metrics_get_ascent (metrics);
descent = pango_font_metrics_get_descent (metrics);
pango_font_metrics_unref (metrics);
height += PANGO_PIXELS (ascent + descent);
}
else
height += PANGO_PIXELS (logical_rect.height);
requisition->width = width; requisition->width = width;
requisition->height = height; requisition->height = height;
@ -3034,6 +3079,59 @@ gtk_label_get_use_underline (GtkLabel *label)
return label->use_underline; return label->use_underline;
} }
/**
* gtk_label_set_single_line_mode:
* @label: a #GtkLabel
* @single_line_mode: %TRUE if the label should be in single line mode
*
* Sets whether the label is in single line mode.
*
* Since: 2.6
*/
void
gtk_label_set_single_line_mode (GtkLabel *label,
gboolean single_line_mode)
{
GtkLabelPrivate *priv;
g_return_if_fail (GTK_IS_LABEL (label));
single_line_mode = single_line_mode != FALSE;
priv = GTK_LABEL_GET_PRIVATE (label);
if (priv->single_line_mode != single_line_mode)
{
priv->single_line_mode = single_line_mode;
gtk_label_clear_layout (label);
gtk_widget_queue_resize (GTK_WIDGET (label));
g_object_notify (G_OBJECT (label), "single-line-mode");
}
}
/**
* gtk_label_get_single_line_mode:
* @label: a #GtkLabel
*
* Returns whether the label is in single line mode.
*
* Return value: %TRUE when the label is in single line mode.
*
* Since: 2.6
**/
gboolean
gtk_label_get_single_line_mode (GtkLabel *label)
{
GtkLabelPrivate *priv;
g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
priv = GTK_LABEL_GET_PRIVATE (label);
return priv->single_line_mode;
}
/* Compute the X position for an offset that corresponds to the "more important /* Compute the X position for an offset that corresponds to the "more important
* cursor position for that offset. We use this when trying to guess to which * cursor position for that offset. We use this when trying to guess to which
* end of the selection we should go to when the user hits the left or * end of the selection we should go to when the user hits the left or

View File

@ -155,6 +155,9 @@ void gtk_label_get_layout_offsets (GtkLabel *label,
gint *x, gint *x,
gint *y); gint *y);
void gtk_label_set_single_line_mode (GtkLabel *label,
gboolean single_line_mode);
gboolean gtk_label_get_single_line_mode (GtkLabel *label);
#ifndef GTK_DISABLE_DEPRECATED #ifndef GTK_DISABLE_DEPRECATED

View File

@ -226,6 +226,7 @@ gtk_statusbar_init (GtkStatusbar *statusbar)
gtk_widget_show (statusbar->frame); gtk_widget_show (statusbar->frame);
statusbar->label = gtk_label_new (""); statusbar->label = gtk_label_new ("");
gtk_label_set_single_line_mode (GTK_LABEL (statusbar->label), TRUE);
gtk_misc_set_alignment (GTK_MISC (statusbar->label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (statusbar->label), 0.0, 0.5);
/* don't expand the size request for the label; if we /* don't expand the size request for the label; if we
* do that then toplevels weirdly resize * do that then toplevels weirdly resize