diff --git a/app/core/gimptag.c b/app/core/gimptag.c index 8d0639aa59..2682169362 100644 --- a/app/core/gimptag.c +++ b/app/core/gimptag.c @@ -246,7 +246,7 @@ gimp_tag_compare_func (const void *p1, /** * gimp_tag_compare_with_string: * @tag: a #GimpTag object. - * @tag_string: pointer to right-hand #GimpTag object. + * @tag_string: the string to compare to. * * Compares tag and a string according to tag comparison rules. Similar to * gimp_tag_compare_func(), but can be used without creating temporary tag @@ -276,6 +276,42 @@ gimp_tag_compare_with_string (GimpTag *tag, return result; } +/** + * gimp_tag_has_prefix: + * @tag: a #GimpTag object. + * @prefix_string: the prefix to compare to. + * + * Compares tag and a prefix according to tag comparison rules. Similar to + * gimp_tag_compare_with_string(), but does not work on the collate key + * because that can't be matched partially. + * + * Return value: wheher #tag starts with @prefix_string. + **/ +gboolean +gimp_tag_has_prefix (GimpTag *tag, + const gchar *prefix_string) +{ + gchar *case_folded1; + gchar *case_folded2; + gboolean has_prefix; + + g_return_val_if_fail (GIMP_IS_TAG (tag), FALSE); + g_return_val_if_fail (prefix_string != NULL, FALSE); + + case_folded1 = g_utf8_casefold (g_quark_to_string (tag->tag), -1); + case_folded2 = g_utf8_casefold (prefix_string, -1); + + has_prefix = g_str_has_prefix (case_folded1, case_folded2); + + g_free (case_folded1); + g_free (case_folded2); + + g_printerr ("'%s' has prefix '%s': %d\n", + g_quark_to_string (tag->tag), prefix_string, has_prefix); + + return has_prefix; +} + /** * gimp_tag_string_make_valid: * @tag_string: a text string. diff --git a/app/core/gimptag.h b/app/core/gimptag.h index fc168f1d06..af564823ef 100644 --- a/app/core/gimptag.h +++ b/app/core/gimptag.h @@ -68,6 +68,8 @@ gint gimp_tag_compare_func (const void *p1, const void *p2); gint gimp_tag_compare_with_string (GimpTag *tag, const gchar *tag_string); +gboolean gimp_tag_has_prefix (GimpTag *tag, + const gchar *prefix_string); gchar * gimp_tag_string_make_valid (const gchar *tag_string); gboolean gimp_tag_is_tag_separator (gunichar c); diff --git a/app/widgets/gimptagentry.c b/app/widgets/gimptagentry.c index 2e9bc5b2fe..3e38447622 100644 --- a/app/widgets/gimptagentry.c +++ b/app/widgets/gimptagentry.c @@ -1044,13 +1044,11 @@ gimp_tag_entry_get_completion_candidates (GimpTagEntry *tag_entry, gchar **used_tags, gchar *src_prefix) { - GList *candidates = NULL; - GList *all_tags; - GList *list; - const gchar *tag_name; - gint i; - gint length; - gchar *prefix; + GList *candidates = NULL; + GList *all_tags; + GList *list; + gint length; + gchar *prefix; if (! src_prefix || strlen (src_prefix) < 1) return NULL; @@ -1066,10 +1064,10 @@ gimp_tag_entry_get_completion_candidates (GimpTagEntry *tag_entry, { GimpTag *tag = list->data; - tag_name = gimp_tag_get_name (tag); - - if (g_str_has_prefix (tag_name, prefix)) + if (gimp_tag_has_prefix (tag, prefix)) { + gint i; + /* check if tag is not already entered */ for (i = 0; i < length; i++) { diff --git a/app/widgets/gimptagpopup.c b/app/widgets/gimptagpopup.c index a00789aeb0..738e86153c 100644 --- a/app/widgets/gimptagpopup.c +++ b/app/widgets/gimptagpopup.c @@ -210,12 +210,10 @@ gimp_tag_popup_constructed (GObject *object) GList *tag_list; GList *tag_iterator; gint i; - gint j; gint max_height; gint screen_height; gchar **current_tags; gint current_count; - const gchar *list_tag; GdkRectangle popup_rects[2]; /* variants of popup placement */ GdkRectangle popup_rect; /* best popup rect in screen coordinates */ @@ -255,15 +253,14 @@ gimp_tag_popup_constructed (GObject *object) i++, tag_iterator = g_list_next (tag_iterator)) { PopupTagData *tag_data = &popup->tag_data[i]; + gint j; tag_data->tag = tag_iterator->data; tag_data->state = GTK_STATE_NORMAL; - list_tag = gimp_tag_get_name (tag_data->tag); - for (j = 0; j < current_count; j++) { - if (! strcmp (current_tags[j], list_tag)) + if (! gimp_tag_compare_with_string (tag_data->tag, current_tags[j])) { tag_data->state = GTK_STATE_SELECTED; break; @@ -966,12 +963,11 @@ static void gimp_tag_popup_toggle_tag (GimpTagPopup *popup, PopupTagData *tag_data) { - gchar **current_tags; - GString *tag_str; - const gchar *tag; - gint length; - gint i; - gboolean tag_toggled_off = FALSE; + gchar **current_tags; + GString *tag_str; + gint length; + gint i; + gboolean tag_toggled_off = FALSE; if (tag_data->state == GTK_STATE_NORMAL) { @@ -986,13 +982,12 @@ gimp_tag_popup_toggle_tag (GimpTagPopup *popup, return; } - tag = gimp_tag_get_name (tag_data->tag); current_tags = gimp_tag_entry_parse_tags (GIMP_TAG_ENTRY (popup->combo_entry)); tag_str = g_string_new (""); length = g_strv_length (current_tags); for (i = 0; i < length; i++) { - if (! strcmp (current_tags[i], tag)) + if (! gimp_tag_compare_with_string (tag_data->tag, current_tags[i])) { tag_toggled_off = TRUE; } @@ -1018,7 +1013,7 @@ gimp_tag_popup_toggle_tag (GimpTagPopup *popup, g_string_append_c (tag_str, ' '); } - g_string_append (tag_str, tag); + g_string_append (tag_str, gimp_tag_get_name (tag_data->tag)); } gimp_tag_entry_set_tag_string (GIMP_TAG_ENTRY (popup->combo_entry),