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); }
/** * \brief Callback for adding selected keyword to all selected images. */ static void bar_pane_keywords_add_to_selected_cb(GtkWidget *menu_widget, gpointer data) { PaneKeywordsData *pkd = data; GtkTreeIter iter; /* This is the iter which initial holds the current keyword */ GtkTreeIter child_iter; GtkTreeModel *model; GtkTreeModel *keyword_tree; GList *list, *work; GList *keywords = NULL; GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); /* Aquire selected keyword */ if (pkd->click_tpath) { gboolean is_keyword = TRUE; model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); if (!gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) return; gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1); if (!is_keyword) return; } else return; keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); list = keyword_list_pull(pkd->keyword_view); /* Get the left keyword view */ /* Now set the current image */ keyword_tree_set(keyword_tree, &child_iter, &list); keyword_list_push(pkd->keyword_view, list); /* Set the left keyword view */ string_list_free(list); bar_pane_keywords_changed(keyword_buffer, pkd); /* Get list of all keywords in the hierarchy */ gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); keywords = keyword_tree_get(keyword_tree, &child_iter); list = layout_selection_list(pkd->pane.lw); work = list; while (work) { FileData *fd = work->data; work = work->next; metadata_append_list(fd, KEYWORD_KEY, keywords); } filelist_free(list); string_list_free(keywords); }
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); }
static void bar_pane_keywords_keyword_toggle(GtkCellRendererToggle *toggle, const gchar *path, gpointer data) { PaneKeywordsData *pkd = data; GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *tpath; gboolean active; GList *list; GtkTreeIter child_iter; GtkTreeModel *keyword_tree; GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); tpath = gtk_tree_path_new_from_string(path); gtk_tree_model_get_iter(model, &iter, tpath); gtk_tree_path_free(tpath); gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_TOGGLE, &active, -1); active = (!active); keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); list = keyword_list_pull(pkd->keyword_view); if (active) keyword_tree_set(keyword_tree, &child_iter, &list); else keyword_tree_reset(keyword_tree, &child_iter, &list); g_signal_handlers_block_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); keyword_list_push(pkd->keyword_view, list); string_list_free(list); g_signal_handlers_unblock_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); /* call this just once in the end */ bar_pane_keywords_changed(keyword_buffer, pkd); /* bar_pane_keywords_change calls bar_keyword_tree_sync, no need to do it again bar_keyword_tree_sync(pkd); */ }