Support wrapping in GtkCellRendererText (#163608):

2005-01-20  Matthias Clasen  <mclasen@redhat.com>

	Support wrapping in GtkCellRendererText  (#163608):

	* gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_class_init):
	Add wrap-mode and wrap-width properties which cause a
	text cell to break to a specified width when set.

	* gtk/gtkcellrenderertext.c (get_layout): Use wrap-mode
	and wrap-width when they are set.
This commit is contained in:
Matthias Clasen 2005-01-20 18:47:58 +00:00 committed by Matthias Clasen
parent 886053fa2f
commit 889e66decd
4 changed files with 137 additions and 10 deletions

View File

@ -1,3 +1,14 @@
2005-01-20 Matthias Clasen <mclasen@redhat.com>
Support wrapping in GtkCellRendererText (#163608):
* gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_class_init):
Add wrap-mode and wrap-width properties which cause a
text cell to break to a specified width when set.
* gtk/gtkcellrenderertext.c (get_layout): Use wrap-mode
and wrap-width when they are set.
2005-01-20 Matthias Clasen <mclasen@redhat.com> 2005-01-20 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkmodules.c (load_module): Don't reverse the order * gtk/gtkmodules.c (load_module): Don't reverse the order

View File

@ -1,3 +1,14 @@
2005-01-20 Matthias Clasen <mclasen@redhat.com>
Support wrapping in GtkCellRendererText (#163608):
* gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_class_init):
Add wrap-mode and wrap-width properties which cause a
text cell to break to a specified width when set.
* gtk/gtkcellrenderertext.c (get_layout): Use wrap-mode
and wrap-width when they are set.
2005-01-20 Matthias Clasen <mclasen@redhat.com> 2005-01-20 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkmodules.c (load_module): Don't reverse the order * gtk/gtkmodules.c (load_module): Don't reverse the order

View File

@ -1,3 +1,14 @@
2005-01-20 Matthias Clasen <mclasen@redhat.com>
Support wrapping in GtkCellRendererText (#163608):
* gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_class_init):
Add wrap-mode and wrap-width properties which cause a
text cell to break to a specified width when set.
* gtk/gtkcellrenderertext.c (get_layout): Use wrap-mode
and wrap-width when they are set.
2005-01-20 Matthias Clasen <mclasen@redhat.com> 2005-01-20 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkmodules.c (load_module): Don't reverse the order * gtk/gtkmodules.c (load_module): Don't reverse the order

View File

@ -75,6 +75,7 @@ enum {
PROP_ATTRIBUTES, PROP_ATTRIBUTES,
PROP_SINGLE_PARAGRAPH_MODE, PROP_SINGLE_PARAGRAPH_MODE,
PROP_WIDTH_CHARS, PROP_WIDTH_CHARS,
PROP_WRAP_WIDTH,
/* Style args */ /* Style args */
PROP_BACKGROUND, PROP_BACKGROUND,
@ -97,6 +98,7 @@ enum {
PROP_RISE, PROP_RISE,
PROP_LANGUAGE, PROP_LANGUAGE,
PROP_ELLIPSIZE, PROP_ELLIPSIZE,
PROP_WRAP_MODE,
/* Whether-a-style-arg-is-set args */ /* Whether-a-style-arg-is-set args */
PROP_BACKGROUND_SET, PROP_BACKGROUND_SET,
@ -134,12 +136,14 @@ struct _GtkCellRendererTextPrivate
gulong focus_out_id; gulong focus_out_id;
PangoLanguage *language; PangoLanguage *language;
PangoEllipsizeMode ellipsize; PangoEllipsizeMode ellipsize;
PangoWrapMode wrap_mode;
gulong populate_popup_id; gulong populate_popup_id;
gulong entry_menu_popdown_timeout; gulong entry_menu_popdown_timeout;
gboolean in_entry_menu; gboolean in_entry_menu;
gint width_chars; gint width_chars;
gint wrap_width;
GtkWidget *entry; GtkWidget *entry;
}; };
@ -188,6 +192,7 @@ gtk_cell_renderer_text_init (GtkCellRendererText *celltext)
celltext->font = pango_font_description_new (); celltext->font = pango_font_description_new ();
priv->width_chars = -1; priv->width_chars = -1;
priv->wrap_width = -1;
} }
static void static void
@ -377,7 +382,8 @@ gtk_cell_renderer_text_class_init (GtkCellRendererTextClass *class)
PROP_RISE, PROP_RISE,
g_param_spec_int ("rise", g_param_spec_int ("rise",
P_("Rise"), P_("Rise"),
P_("Offset of text above the baseline (below the baseline if rise is negative)"), P_("Offset of text above the baseline "
"(below the baseline if rise is negative)"),
-G_MAXINT, -G_MAXINT,
G_MAXINT, G_MAXINT,
0, 0,
@ -405,16 +411,30 @@ gtk_cell_renderer_text_class_init (GtkCellRendererTextClass *class)
PROP_LANGUAGE, PROP_LANGUAGE,
g_param_spec_string ("language", g_param_spec_string ("language",
P_("Language"), P_("Language"),
P_("The language this text is in, as an ISO code. Pango can use this as a hint when rendering the text. If you don't understand this parameter, you probably don't need it"), P_("The language this text is in, as an ISO code. "
"Pango can use this as a hint when rendering the text. "
"If you don't understand this parameter, you probably don't need it"),
NULL, NULL,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
/**
* GtkCellRendererText:ellipsize:
*
* Specifies the preferred place to ellipsize the string, if the cell renderer
* does not have enough room to display the entire string. Setting it to
* %PANGO_ELLIPSIZE_NONE turns off ellipsizing. See the wrap-width property
* for another way of making the text fit into a given width.
*
* Since: 2.6
*/
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_ELLIPSIZE, PROP_ELLIPSIZE,
g_param_spec_enum ("ellipsize", g_param_spec_enum ("ellipsize",
P_("Ellipsize"), P_("Ellipsize"),
P_("The preferred place to ellipsize the string, if the cell renderer does not have enough room to display the entire string, if at all"), P_("The preferred place to ellipsize the string, "
"if the cell renderer does not have enough room "
"to display the entire string, if at all"),
PANGO_TYPE_ELLIPSIZE_MODE, PANGO_TYPE_ELLIPSIZE_MODE,
PANGO_ELLIPSIZE_NONE, PANGO_ELLIPSIZE_NONE,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
@ -438,6 +458,45 @@ gtk_cell_renderer_text_class_init (GtkCellRendererTextClass *class)
-1, -1,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
/**
* GtkCellRendererText:wrap-mode:
*
* Specifies how to break the string into multiple lines, if the cell renderer
* does not have enough room to display the entire string. This property has no
* effect unless the wrap-width property is set.
*
* Since: 2.8
*/
g_object_class_install_property (object_class,
PROP_WRAP_MODE,
g_param_spec_enum ("wrap_mode",
P_("Wrap mode"),
P_("How to break the string into multiple lines, "
"if the cell renderer does not have enough room "
"to display the entire string"),
PANGO_TYPE_WRAP_MODE,
PANGO_WRAP_CHAR,
G_PARAM_READWRITE));
/**
* GtkCellRendererText:wrap-width:
*
* Specifies the width at which the text is wrapped. The wrap-mode property can
* be used to influence at what character positions the line breaks can be placed.
* Setting wrap-width to -1 turns wrapping off.
*
* Since: 2.8
*/
g_object_class_install_property (object_class,
PROP_WRAP_WIDTH,
g_param_spec_int ("wrap_width",
P_("Wrap width"),
P_("The width at which the text is wrapped"),
-1,
G_MAXINT,
-1,
G_PARAM_READWRITE));
/* Style props are set or not */ /* Style props are set or not */
@ -502,7 +561,7 @@ gtk_cell_renderer_text_class_init (GtkCellRendererTextClass *class)
ADD_SET_PROP ("ellipsize_set", PROP_ELLIPSIZE_SET, ADD_SET_PROP ("ellipsize_set", PROP_ELLIPSIZE_SET,
P_("Ellipsize set"), P_("Ellipsize set"),
P_("Whether this tag affects the ellipsize mode")); P_("Whether this tag affects the ellipsize mode"));
text_cell_renderer_signals [EDITED] = text_cell_renderer_signals [EDITED] =
g_signal_new ("edited", g_signal_new ("edited",
G_OBJECT_CLASS_TYPE (object_class), G_OBJECT_CLASS_TYPE (object_class),
@ -681,6 +740,14 @@ gtk_cell_renderer_text_get_property (GObject *object,
g_value_set_enum (value, priv->ellipsize); g_value_set_enum (value, priv->ellipsize);
break; break;
case PROP_WRAP_MODE:
g_value_set_enum (value, priv->wrap_mode);
break;
case PROP_WRAP_WIDTH:
g_value_set_int (value, priv->wrap_width);
break;
case PROP_BACKGROUND_SET: case PROP_BACKGROUND_SET:
g_value_set_boolean (value, celltext->background_set); g_value_set_boolean (value, celltext->background_set);
break; break;
@ -1169,10 +1236,18 @@ gtk_cell_renderer_text_set_property (GObject *object,
g_object_notify (object, "ellipsize_set"); g_object_notify (object, "ellipsize_set");
break; break;
case PROP_WRAP_MODE:
priv->wrap_mode = g_value_get_enum (value);
break;
case PROP_WRAP_WIDTH:
priv->wrap_width = g_value_get_int (value);
break;
case PROP_WIDTH_CHARS: case PROP_WIDTH_CHARS:
priv->width_chars = g_value_get_int (value); priv->width_chars = g_value_get_int (value);
g_object_notify (object, "width_chars");
break; break;
case PROP_BACKGROUND_SET: case PROP_BACKGROUND_SET:
celltext->background_set = g_value_get_boolean (value); celltext->background_set = g_value_get_boolean (value);
break; break;
@ -1352,9 +1427,25 @@ get_layout (GtkCellRendererText *celltext,
pango_layout_set_ellipsize (layout, priv->ellipsize); pango_layout_set_ellipsize (layout, priv->ellipsize);
else else
pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_NONE); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_NONE);
if (priv->wrap_width != -1)
{
pango_layout_set_width (layout, priv->wrap_width * PANGO_SCALE);
pango_layout_set_wrap (layout, priv->wrap_mode);
if (pango_layout_get_line_count (layout) == 1)
{
pango_layout_set_width (layout, -1);
pango_layout_set_wrap (layout, PANGO_WRAP_CHAR);
}
}
else
{
pango_layout_set_width (layout, -1);
pango_layout_set_wrap (layout, PANGO_WRAP_CHAR);
}
pango_layout_set_attributes (layout, attr_list); pango_layout_set_attributes (layout, attr_list);
pango_layout_set_width (layout, -1);
pango_attr_list_unref (attr_list); pango_attr_list_unref (attr_list);
@ -1422,7 +1513,7 @@ get_size (GtkCellRenderer *cell,
layout = get_layout (celltext, widget, FALSE, 0); layout = get_layout (celltext, widget, FALSE, 0);
pango_layout_get_pixel_extents (layout, NULL, &rect); pango_layout_get_pixel_extents (layout, NULL, &rect);
if (height) if (height)
*height = GTK_CELL_RENDERER (celltext)->ypad * 2 + rect.height; *height = GTK_CELL_RENDERER (celltext)->ypad * 2 + rect.height;
@ -1458,7 +1549,7 @@ get_size (GtkCellRenderer *cell,
else else
*x_offset = cell->xalign * (cell_area->width - rect.width - (2 * cell->xpad)); *x_offset = cell->xalign * (cell_area->width - rect.width - (2 * cell->xpad));
if (priv->ellipsize) if (priv->ellipsize_set || priv->wrap_width != -1)
*x_offset = MAX(*x_offset, 0); *x_offset = MAX(*x_offset, 0);
} }
if (y_offset) if (y_offset)
@ -1559,9 +1650,12 @@ gtk_cell_renderer_text_render (GtkCellRenderer *cell,
g_object_unref (gc); g_object_unref (gc);
} }
if (priv->ellipsize) if (priv->ellipsize_set)
pango_layout_set_width (layout, pango_layout_set_width (layout,
(cell_area->width - x_offset - 2 * cell->xpad) * PANGO_SCALE); (cell_area->width - x_offset - 2 * cell->xpad) * PANGO_SCALE);
else if (priv->wrap_width != -1)
pango_layout_set_width (layout,
priv->wrap_width * PANGO_SCALE);
else else
pango_layout_set_width (layout, -1); pango_layout_set_width (layout, -1);