Fixed GtkCellLayout to parse <cell-packing> property text accumulatively.
This commit is contained in:
@@ -693,6 +693,7 @@ typedef struct {
|
||||
GtkBuilder *builder;
|
||||
GtkCellLayout *cell_layout;
|
||||
GtkCellRenderer *renderer;
|
||||
GString *string;
|
||||
gchar *cell_prop_name;
|
||||
gchar *context;
|
||||
gboolean translatable;
|
||||
@@ -743,53 +744,65 @@ cell_packing_text_element (GMarkupParseContext *context,
|
||||
GError **error)
|
||||
{
|
||||
CellPackingSubParserData *parser_data = (CellPackingSubParserData*)user_data;
|
||||
|
||||
if (parser_data->cell_prop_name)
|
||||
g_string_append_len (parser_data->string, text, text_len);
|
||||
}
|
||||
|
||||
static void
|
||||
cell_packing_end_element (GMarkupParseContext *context,
|
||||
const gchar *element_name,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
CellPackingSubParserData *parser_data = (CellPackingSubParserData*)user_data;
|
||||
GtkCellArea *area;
|
||||
gchar* value;
|
||||
|
||||
if (!parser_data->cell_prop_name)
|
||||
return;
|
||||
|
||||
if (parser_data->translatable && text_len)
|
||||
/* Append the translated strings */
|
||||
if (parser_data->string->len)
|
||||
{
|
||||
const gchar* domain;
|
||||
domain = gtk_builder_get_translation_domain (parser_data->builder);
|
||||
area = gtk_cell_layout_get_area (parser_data->cell_layout);
|
||||
|
||||
value = _gtk_builder_parser_translate (domain,
|
||||
parser_data->context,
|
||||
text);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = g_strdup (text);
|
||||
if (area)
|
||||
{
|
||||
if (parser_data->translatable)
|
||||
{
|
||||
gchar *translated;
|
||||
const gchar* domain;
|
||||
|
||||
domain = gtk_builder_get_translation_domain (parser_data->builder);
|
||||
|
||||
translated = _gtk_builder_parser_translate (domain,
|
||||
parser_data->context,
|
||||
parser_data->string->str);
|
||||
g_string_set_size (parser_data->string, 0);
|
||||
g_string_append (parser_data->string, translated);
|
||||
}
|
||||
|
||||
gtk_cell_layout_buildable_set_cell_property (area,
|
||||
parser_data->builder,
|
||||
parser_data->renderer,
|
||||
parser_data->cell_prop_name,
|
||||
parser_data->string->str);
|
||||
}
|
||||
else
|
||||
g_warning ("%s does not have an internal GtkCellArea class and cannot apply child cell properties",
|
||||
g_type_name (G_OBJECT_TYPE (parser_data->cell_layout)));
|
||||
}
|
||||
|
||||
area = gtk_cell_layout_get_area (parser_data->cell_layout);
|
||||
|
||||
if (!area)
|
||||
{
|
||||
g_warning ("%s does not have an internal GtkCellArea class and cannot apply child cell properties",
|
||||
g_type_name (G_OBJECT_TYPE (parser_data->cell_layout)));
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_cell_layout_buildable_set_cell_property (area,
|
||||
parser_data->builder,
|
||||
parser_data->renderer,
|
||||
parser_data->cell_prop_name,
|
||||
value);
|
||||
|
||||
g_string_set_size (parser_data->string, 0);
|
||||
g_free (parser_data->cell_prop_name);
|
||||
g_free (parser_data->context);
|
||||
g_free (value);
|
||||
parser_data->cell_prop_name = NULL;
|
||||
parser_data->context = NULL;
|
||||
parser_data->translatable = FALSE;
|
||||
}
|
||||
|
||||
|
||||
static const GMarkupParser cell_packing_parser =
|
||||
{
|
||||
cell_packing_start_element,
|
||||
NULL,
|
||||
cell_packing_end_element,
|
||||
cell_packing_text_element,
|
||||
};
|
||||
|
||||
@@ -821,6 +834,7 @@ _gtk_cell_layout_buildable_custom_tag_start (GtkBuildable *buildable,
|
||||
else if (strcmp (tagname, "cell-packing") == 0)
|
||||
{
|
||||
packing_data = g_slice_new0 (CellPackingSubParserData);
|
||||
packing_data->string = g_string_new ("");
|
||||
packing_data->builder = builder;
|
||||
packing_data->cell_layout = GTK_CELL_LAYOUT (buildable);
|
||||
packing_data->renderer = GTK_CELL_RENDERER (child);
|
||||
@@ -841,6 +855,7 @@ _gtk_cell_layout_buildable_custom_tag_end (GtkBuildable *buildable,
|
||||
gpointer *data)
|
||||
{
|
||||
AttributesSubParserData *attr_data;
|
||||
CellPackingSubParserData *packing_data;
|
||||
|
||||
if (strcmp (tagname, "attributes") == 0)
|
||||
{
|
||||
@@ -851,7 +866,9 @@ _gtk_cell_layout_buildable_custom_tag_end (GtkBuildable *buildable,
|
||||
}
|
||||
else if (strcmp (tagname, "cell-packing") == 0)
|
||||
{
|
||||
g_slice_free (CellPackingSubParserData, (gpointer)data);
|
||||
packing_data = (CellPackingSubParserData *)data;
|
||||
g_string_free (packing_data->string, TRUE);
|
||||
g_slice_free (CellPackingSubParserData, packing_data);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
Reference in New Issue
Block a user