gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, gpointer data) { GList *path = data; GList *keywords = NULL; 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); if (!!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords) != !!value) { if (value) { keyword_tree_set(GTK_TREE_MODEL(keyword_tree), &iter, &keywords); } else { keyword_tree_reset(GTK_TREE_MODEL(keyword_tree), &iter, &keywords); } metadata_write_list(fd, KEYWORD_KEY, keywords); } string_list_free(keywords); return TRUE; }
static void bar_pane_keywords_update(PaneKeywordsData *pkd) { GList *keywords = NULL; GList *orig_keywords = NULL; GList *work1, *work2; GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); keywords = metadata_read_list(pkd->fd, KEYWORD_KEY, METADATA_PLAIN); orig_keywords = keyword_list_pull(pkd->keyword_view); /* compare the lists */ work1 = keywords; work2 = orig_keywords; while (work1 && work2) { if (strcmp(work1->data, work2->data) != 0) break; work1 = work1->next; work2 = work2->next; } if (work1 || work2) /* lists differs */ { g_signal_handlers_block_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); keyword_list_push(pkd->keyword_view, keywords); bar_keyword_tree_sync(pkd); g_signal_handlers_unblock_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); } string_list_free(keywords); string_list_free(orig_keywords); }
gchar *metadata_read_string(FileData *fd, const gchar *key, MetadataFormat format) { GList *string_list = metadata_read_list(fd, key, format); if (string_list) { gchar *str = string_list->data; string_list->data = NULL; string_list_free(string_list); return str; } return NULL; }
static void bar_pane_keywords_update(PaneKeywordsData *pkd) { GList *keywords = NULL; GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); g_signal_handlers_block_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); keywords = metadata_read_list(pkd->fd, KEYWORD_KEY, METADATA_PLAIN); keyword_list_push(pkd->keyword_view, keywords); bar_keyword_tree_sync(pkd); string_list_free(keywords); g_signal_handlers_unblock_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); }
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) { 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; } return found; }
gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *values) { GList *list = metadata_read_list(fd, key, METADATA_PLAIN); if (!list) { return metadata_write_list(fd, key, values); } else { gboolean ret; list = g_list_concat(list, string_list_copy(values)); list = remove_duplicate_strings_from_list(list); ret = metadata_write_list(fd, key, list); string_list_free(list); return ret; } }