mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-25 13:11:13 +00:00
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:
parent
c4183ed568
commit
b87307b918
13
ChangeLog
13
ChangeLog
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
102
gtk/gtklabel.c
102
gtk/gtklabel.c
@ -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,6 +1800,23 @@ gtk_label_size_request (GtkWidget *widget,
|
|||||||
width += PANGO_PIXELS (logical_rect.width);
|
width += PANGO_PIXELS (logical_rect.width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
height += PANGO_PIXELS (logical_rect.height);
|
||||||
|
|
||||||
requisition->width = width;
|
requisition->width = width;
|
||||||
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user