From: Klaus Ethgen Date: Sat, 11 Apr 2009 19:51:03 +0000 (+0000) Subject: Allow to configure case handling of keywords X-Git-Tag: v1.0.0~263 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=1a73f69002e383830604ccc14c925f2967ede8df Allow to configure case handling of keywords Sometimes I use just different case for keywords. This should be chooseable. --- diff --git a/src/metadata.c b/src/metadata.c index 5552371e..cbd9a243 100644 --- a/src/metadata.c +++ b/src/metadata.c @@ -854,9 +854,18 @@ gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, Gtk { if (!(exclude_sibling && sibling && keyword_compare(keyword_tree, &iter, sibling) == 0)) { - gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter); - ret = strcmp(casefold, iter_casefold) == 0; - g_free(iter_casefold); + if (options->metadata.tags_case_sensitive) + { + gchar *iter_name = keyword_get_name(keyword_tree, &iter); + ret = strcmp(name, iter_name) == 0; + g_free(iter_name); + } + else + { + gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter); + ret = strcmp(casefold, iter_casefold) == 0; + g_free(iter_casefold); + } // if (options->metadata.tags_cas... } if (ret) { @@ -1005,24 +1014,79 @@ static gboolean keyword_tree_is_set_casefold(GtkTreeModel *keyword_tree, GtkTree } } +static gboolean keyword_tree_is_set_casefull(GtkTreeModel *keyword_tree, GtkTreeIter iter, GList *kw_list) +{ + if (!kw_list) return FALSE; + + if (!keyword_get_is_keyword(keyword_tree, &iter)) + { + /* for the purpose of expanding and hiding, a helper is set if it has any children set */ + GtkTreeIter child; + if (!gtk_tree_model_iter_children(keyword_tree, &child, &iter)) + return FALSE; /* this should happen only on empty helpers */ + + while (TRUE) + { + if (keyword_tree_is_set_casefull(keyword_tree, child, kw_list)) return TRUE; + if (!gtk_tree_model_iter_next(keyword_tree, &child)) return FALSE; + } + } + + while (TRUE) + { + GtkTreeIter parent; + + if (keyword_get_is_keyword(keyword_tree, &iter)) + { + GList *work = kw_list; + gboolean found = FALSE; + gchar *iter_name = keyword_get_name(keyword_tree, &iter); + while (work) + { + const gchar *name = work->data; + work = work->next; + + if (strcmp(iter_name, name) == 0) + { + found = TRUE; + break; + } + } + g_free(iter_name); + if (!found) return FALSE; + } + + if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return TRUE; + iter = parent; + } +} + gboolean keyword_tree_is_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GList *kw_list) { gboolean ret; GList *casefold_list = NULL; GList *work; - work = kw_list; - while (work) + if (options->metadata.tags_case_sensitive) { - const gchar *kw = work->data; - work = work->next; + ret = keyword_tree_is_set_casefull(keyword_tree, *iter, kw_list); + } + else + { + work = kw_list; + while (work) + { + const gchar *kw = work->data; + work = work->next; + + casefold_list = g_list_prepend(casefold_list, g_utf8_casefold(kw, -1)); + } + + ret = keyword_tree_is_set_casefold(keyword_tree, *iter, casefold_list); - casefold_list = g_list_prepend(casefold_list, g_utf8_casefold(kw, -1)); + string_list_free(casefold_list); } - - ret = keyword_tree_is_set_casefold(keyword_tree, *iter, casefold_list); - - string_list_free(casefold_list); + return ret; } diff --git a/src/options.c b/src/options.c index a6c72dfd..9705e5c6 100644 --- a/src/options.c +++ b/src/options.c @@ -103,6 +103,7 @@ ConfOptions *init_options(ConfOptions *options) options->metadata.confirm_timeout = 10; options->metadata.confirm_on_image_change = FALSE; options->metadata.confirm_on_dir_change = TRUE; + options->metadata.tags_case_sensitive = FALSE; options->show_icon_names = TRUE; diff --git a/src/options.h b/src/options.h index 09773188..2fceb1ec 100644 --- a/src/options.h +++ b/src/options.h @@ -177,6 +177,7 @@ struct _ConfOptions gboolean confirm_after_timeout; gboolean confirm_on_image_change; gboolean confirm_on_dir_change; + gboolean tags_case_sensitive; } metadata; }; diff --git a/src/preferences.c b/src/preferences.c index f5d5fb6f..f7c738d8 100644 --- a/src/preferences.c +++ b/src/preferences.c @@ -324,6 +324,7 @@ static void config_window_apply(void) options->metadata.confirm_after_timeout = c_options->metadata.confirm_after_timeout; options->metadata.confirm_on_image_change = c_options->metadata.confirm_on_image_change; options->metadata.confirm_on_dir_change = c_options->metadata.confirm_on_dir_change; + options->metadata.tags_case_sensitive = c_options->metadata.tags_case_sensitive; #ifdef DEBUG set_debug_level(debug_c); @@ -1364,6 +1365,9 @@ static void config_tab_metadata(GtkWidget *notebook) pref_checkbox_new_int(group, _("Write metadata on directory change"), options->metadata.confirm_on_dir_change, &c_options->metadata.confirm_on_dir_change); + + pref_checkbox_new_int(group, _("Allow keywords to differ only in case"), + options->metadata.tags_case_sensitive, &c_options->metadata.tags_case_sensitive); } /* metadata tab */ diff --git a/src/rcfile.c b/src/rcfile.c index e0f9b632..c7f6d686 100644 --- a/src/rcfile.c +++ b/src/rcfile.c @@ -437,6 +437,7 @@ static void write_global_attributes(GString *outstr, gint indent) WRITE_NL(); WRITE_BOOL(*options, metadata.confirm_after_timeout); WRITE_NL(); WRITE_BOOL(*options, metadata.confirm_on_image_change); WRITE_NL(); WRITE_BOOL(*options, metadata.confirm_on_dir_change); + WRITE_NL(); WRITE_BOOL(*options, metadata.tags_case_sensitive); } @@ -695,6 +696,7 @@ static gboolean load_global_params(const gchar **attribute_names, const gchar ** if (READ_INT(*options, metadata.confirm_timeout)) continue; if (READ_BOOL(*options, metadata.confirm_on_image_change)) continue; if (READ_BOOL(*options, metadata.confirm_on_dir_change)) continue; + if (READ_BOOL(*options, metadata.tags_case_sensitive)) continue; log_printf("unknown attribute %s = %s\n", option, value); }