mirror of https://github.com/GNOME/gimp.git
app: don't remove all tags when toggling style buttons and then inserting
Instead, keep a list of tags to explicitely remove around (the list of unchecked toggles), and remove only these tags, so the tags that have no widget in the UI are not affected by the insert_tags logic.
This commit is contained in:
parent
b61dfff04c
commit
b19db0dea9
|
@ -674,13 +674,17 @@ gimp_text_buffer_name_to_tag (GimpTextBuffer *buffer,
|
|||
|
||||
void
|
||||
gimp_text_buffer_set_insert_tags (GimpTextBuffer *buffer,
|
||||
GList *style)
|
||||
GList *insert_tags,
|
||||
GList *remove_tags)
|
||||
{
|
||||
g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer));
|
||||
|
||||
g_list_free (buffer->insert_tags);
|
||||
buffer->insert_tags = style;
|
||||
buffer->insert_tags_set = TRUE;
|
||||
|
||||
g_list_free (buffer->insert_tags);
|
||||
g_list_free (buffer->remove_tags);
|
||||
buffer->insert_tags = insert_tags;
|
||||
buffer->remove_tags = remove_tags;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -688,9 +692,12 @@ gimp_text_buffer_clear_insert_tags (GimpTextBuffer *buffer)
|
|||
{
|
||||
g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer));
|
||||
|
||||
g_list_free (buffer->insert_tags);
|
||||
buffer->insert_tags = NULL;
|
||||
buffer->insert_tags_set = FALSE;
|
||||
|
||||
g_list_free (buffer->insert_tags);
|
||||
g_list_free (buffer->remove_tags);
|
||||
buffer->insert_tags = NULL;
|
||||
buffer->remove_tags = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -699,8 +706,9 @@ gimp_text_buffer_insert (GimpTextBuffer *buffer,
|
|||
{
|
||||
GtkTextIter iter, start;
|
||||
gint start_offset;
|
||||
GList *insert_tags;
|
||||
gboolean insert_tags_set;
|
||||
GList *insert_tags;
|
||||
GList *remove_tags;
|
||||
GSList *tags_off = NULL;
|
||||
|
||||
g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer));
|
||||
|
@ -710,13 +718,15 @@ gimp_text_buffer_insert (GimpTextBuffer *buffer,
|
|||
|
||||
start_offset = gtk_text_iter_get_offset (&iter);
|
||||
|
||||
insert_tags = buffer->insert_tags;
|
||||
insert_tags_set = buffer->insert_tags_set;
|
||||
buffer->insert_tags = NULL;
|
||||
buffer->insert_tags_set = FALSE;
|
||||
insert_tags = buffer->insert_tags;
|
||||
remove_tags = buffer->remove_tags;
|
||||
|
||||
if (! insert_tags_set)
|
||||
tags_off = gtk_text_iter_get_toggled_tags (&iter, FALSE);
|
||||
buffer->insert_tags_set = FALSE;
|
||||
buffer->insert_tags = NULL;
|
||||
buffer->remove_tags = NULL;
|
||||
|
||||
tags_off = gtk_text_iter_get_toggled_tags (&iter, FALSE);
|
||||
|
||||
gtk_text_buffer_begin_user_action (GTK_TEXT_BUFFER (buffer));
|
||||
|
||||
|
@ -729,30 +739,45 @@ gimp_text_buffer_insert (GimpTextBuffer *buffer,
|
|||
{
|
||||
GList *list;
|
||||
|
||||
gtk_text_buffer_remove_all_tags (GTK_TEXT_BUFFER (buffer),
|
||||
&start, &iter);
|
||||
for (list = remove_tags; list; list = g_list_next (list))
|
||||
{
|
||||
GtkTextTag *tag = list->data;
|
||||
|
||||
gtk_text_buffer_remove_tag (GTK_TEXT_BUFFER (buffer), tag,
|
||||
&start, &iter);
|
||||
}
|
||||
|
||||
for (list = insert_tags; list; list = g_list_next (list))
|
||||
{
|
||||
gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), list->data,
|
||||
GtkTextTag *tag = list->data;
|
||||
|
||||
gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), tag,
|
||||
&start, &iter);
|
||||
}
|
||||
|
||||
g_list_free (insert_tags);
|
||||
}
|
||||
else
|
||||
{
|
||||
GSList *list;
|
||||
|
||||
for (list = tags_off; list; list = g_slist_next (list))
|
||||
if (tags_off)
|
||||
{
|
||||
GSList *slist;
|
||||
|
||||
for (slist = tags_off; slist; slist = g_slist_next (slist))
|
||||
{
|
||||
gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), list->data,
|
||||
&start, &iter);
|
||||
GtkTextTag *tag = slist->data;
|
||||
|
||||
if (! g_list_find (remove_tags, tag) &&
|
||||
! g_list_find (buffer->spacing_tags, tag))
|
||||
{
|
||||
gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), tag,
|
||||
&start, &iter);
|
||||
}
|
||||
}
|
||||
|
||||
g_slist_free (tags_off);
|
||||
}
|
||||
|
||||
g_list_free (remove_tags);
|
||||
g_list_free (insert_tags);
|
||||
|
||||
gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
|
||||
}
|
||||
|
||||
|
|
|
@ -43,8 +43,9 @@ struct _GimpTextBuffer
|
|||
GList *baseline_tags;
|
||||
GList *spacing_tags;
|
||||
|
||||
GList *insert_tags;
|
||||
gboolean insert_tags_set;
|
||||
GList *insert_tags;
|
||||
GList *remove_tags;
|
||||
|
||||
GdkAtom markup_atom;
|
||||
};
|
||||
|
@ -86,7 +87,8 @@ GtkTextTag * gimp_text_buffer_name_to_tag (GimpTextBuffer *buffer,
|
|||
const gchar *value);
|
||||
|
||||
void gimp_text_buffer_set_insert_tags (GimpTextBuffer *buffer,
|
||||
GList *style);
|
||||
GList *insert_tags,
|
||||
GList *remove_tags);
|
||||
void gimp_text_buffer_clear_insert_tags (GimpTextBuffer *buffer);
|
||||
void gimp_text_buffer_insert (GimpTextBuffer *buffer,
|
||||
const gchar *text);
|
||||
|
|
|
@ -278,22 +278,33 @@ gimp_text_style_editor_new (GimpTextBuffer *buffer,
|
|||
}
|
||||
|
||||
GList *
|
||||
gimp_text_style_editor_list_tags (GimpTextStyleEditor *editor)
|
||||
gimp_text_style_editor_list_tags (GimpTextStyleEditor *editor,
|
||||
GList **remove_tags)
|
||||
{
|
||||
GList *toggles;
|
||||
GList *tags = NULL;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_TEXT_STYLE_EDITOR (editor), NULL);
|
||||
g_return_val_if_fail (remove_tags != NULL, NULL);
|
||||
|
||||
*remove_tags = NULL;
|
||||
|
||||
for (toggles = editor->toggles; toggles; toggles = g_list_next (toggles))
|
||||
{
|
||||
GtkTextTag *tag = g_object_get_data (toggles->data, "tag");
|
||||
|
||||
if (gtk_toggle_button_get_active (toggles->data))
|
||||
{
|
||||
tags = g_list_prepend (tags,
|
||||
g_object_get_data (toggles->data, "tag"));
|
||||
tags = g_list_prepend (tags, tag);
|
||||
}
|
||||
else
|
||||
{
|
||||
*remove_tags = g_list_prepend (*remove_tags, tag);
|
||||
}
|
||||
}
|
||||
|
||||
*remove_tags = g_list_reverse (*remove_tags);
|
||||
|
||||
return g_list_reverse (tags);
|
||||
}
|
||||
|
||||
|
@ -353,7 +364,8 @@ gimp_text_style_editor_tag_toggled (GtkToggleButton *toggle,
|
|||
{
|
||||
GtkTextBuffer *buffer = GTK_TEXT_BUFFER (editor->buffer);
|
||||
GtkTextTag *tag = g_object_get_data (G_OBJECT (toggle), "tag");
|
||||
GList *list;
|
||||
GList *insert_tags;
|
||||
GList *remove_tags;
|
||||
|
||||
if (gtk_text_buffer_get_has_selection (buffer))
|
||||
{
|
||||
|
@ -375,8 +387,8 @@ gimp_text_style_editor_tag_toggled (GtkToggleButton *toggle,
|
|||
gtk_text_buffer_end_user_action (buffer);
|
||||
}
|
||||
|
||||
list = gimp_text_style_editor_list_tags (editor);
|
||||
gimp_text_buffer_set_insert_tags (editor->buffer, list);
|
||||
insert_tags = gimp_text_style_editor_list_tags (editor, &remove_tags);
|
||||
gimp_text_buffer_set_insert_tags (editor->buffer, insert_tags, remove_tags);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -60,11 +60,12 @@ struct _GimpTextStyleEditorClass
|
|||
|
||||
GType gimp_text_style_editor_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkWidget * gimp_text_style_editor_new (GimpTextBuffer *buffer,
|
||||
gdouble resolution_x,
|
||||
gdouble resolution_y);
|
||||
GtkWidget * gimp_text_style_editor_new (GimpTextBuffer *buffer,
|
||||
gdouble resolution_x,
|
||||
gdouble resolution_y);
|
||||
|
||||
GList * gimp_text_style_editor_list_tags (GimpTextStyleEditor *editor);
|
||||
GList * gimp_text_style_editor_list_tags (GimpTextStyleEditor *editor,
|
||||
GList **remove_tags);
|
||||
|
||||
|
||||
#endif /* __GIMP_TEXT_STYLE_EDITOR_H__ */
|
||||
|
|
Loading…
Reference in New Issue