Mercurial > geeqie
diff src/metadata.c @ 1425:80462be81410
fixed keyword to mark connection
author | nadvornik |
---|---|
date | Fri, 13 Mar 2009 09:03:06 +0000 |
parents | 6ce1f7171d48 |
children | 3019f5d3a3c7 |
line wrap: on
line diff
--- a/src/metadata.c Thu Mar 12 22:44:21 2009 +0000 +++ b/src/metadata.c Fri Mar 13 09:03:06 2009 +0000 @@ -627,68 +627,93 @@ gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data) { + /* FIXME: do not use global keyword_tree */ + GList *path = data; GList *keywords; gboolean found = FALSE; keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN); if (keywords) { - GList *work = keywords; + GtkTreeIter iter; + if (keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path) && + keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords)) + found = TRUE; - while (work) - { - gchar *kw = work->data; - work = work->next; - - if (strcmp(kw, data) == 0) - { - found = TRUE; - break; - } - } - string_list_free(keywords); } return found; } gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, gpointer data) { + GList *path = data; GList *keywords = NULL; - gboolean found = FALSE; - gboolean changed = FALSE; - GList *work; + GtkTreeIter iter; + + if (!keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path)) return FALSE; + keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN); - work = keywords; - - while (work) + if (!!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords) != !!value) { - gchar *kw = work->data; - - if (strcmp(kw, data) == 0) + if (value) { - found = TRUE; - if (!value) - { - changed = TRUE; - keywords = g_list_delete_link(keywords, work); - g_free(kw); - } - break; + keyword_tree_set(GTK_TREE_MODEL(keyword_tree), &iter, &keywords); } - work = work->next; + else + { + keyword_tree_reset(GTK_TREE_MODEL(keyword_tree), &iter, &keywords); + } + metadata_write_list(fd, KEYWORD_KEY, keywords); } - if (value && !found) - { - changed = TRUE; - keywords = g_list_append(keywords, g_strdup(data)); - } - - if (changed) metadata_write_list(fd, KEYWORD_KEY, keywords); string_list_free(keywords); return TRUE; } + + +void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *kw_iter, gint mark) +{ + + FileDataGetMarkFunc get_mark_func; + FileDataSetMarkFunc set_mark_func; + gpointer mark_func_data; + + gint i; + + for (i = 0; i < FILEDATA_MARKS_SIZE; i++) + { + file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data); + if (get_mark_func == meta_data_get_keyword_mark) + { + GtkTreeIter old_kw_iter; + GList *old_path = mark_func_data; + + if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, old_path) && + (i == mark || /* release any previous connection of given mark */ + keyword_compare(keyword_tree, &old_kw_iter, kw_iter) == 0)) /* or given keyword */ + { + file_data_register_mark_func(i, NULL, NULL, NULL, NULL); + gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), &old_kw_iter, KEYWORD_COLUMN_MARK, "", -1); + } + } + } + + + if (mark >= 0 && mark < FILEDATA_MARKS_SIZE) + { + GList *path; + gchar *mark_str; + path = keyword_tree_get_path(keyword_tree, kw_iter); + file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free); + + mark_str = g_strdup_printf("%d", mark + 1); + gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, KEYWORD_COLUMN_MARK, mark_str, -1); + g_free(mark_str); + } +} + + /* *------------------------------------------------------------------- * keyword tree