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; }
void bar_pane_keywords_filter_modify(GtkTreeModel *model, GtkTreeIter *iter, GValue *value, gint column, gpointer data) { PaneKeywordsData *pkd = data; GtkTreeModel *keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); GtkTreeIter child_iter; gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, iter); memset(value, 0, sizeof (GValue)); switch (column) { case FILTER_KEYWORD_COLUMN_TOGGLE: { GList *keywords = keyword_list_pull(pkd->keyword_view); gboolean set = keyword_tree_is_set(keyword_tree, &child_iter, keywords); string_list_free(keywords); g_value_init(value, G_TYPE_BOOLEAN); g_value_set_boolean(value, set); break; } case FILTER_KEYWORD_COLUMN_MARK: gtk_tree_model_get_value(keyword_tree, &child_iter, KEYWORD_COLUMN_MARK, value); break; case FILTER_KEYWORD_COLUMN_NAME: gtk_tree_model_get_value(keyword_tree, &child_iter, KEYWORD_COLUMN_NAME, value); break; case FILTER_KEYWORD_COLUMN_IS_KEYWORD: gtk_tree_model_get_value(keyword_tree, &child_iter, KEYWORD_COLUMN_IS_KEYWORD, value); break; } return; }
static gboolean keyword_tree_check_empty_children(GtkTreeModel *keyword_tree, GtkTreeIter *parent, GList *kw_list) { GtkTreeIter iter; if (!gtk_tree_model_iter_children(keyword_tree, &iter, parent)) return TRUE; /* this should happen only on empty helpers */ while (TRUE) { if (keyword_tree_is_set(keyword_tree, &iter, kw_list)) return FALSE; if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return TRUE; } }
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; }
static gboolean keyword_show_set_in_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter_ptr, gpointer data) { GtkTreeIter iter = *iter_ptr; GList *keywords = data; gpointer id = keywords->data; keywords = keywords->next; /* hack */ if (keyword_tree_is_set(model, &iter, keywords)) { while (TRUE) { GtkTreeIter parent; keyword_show_in(GTK_TREE_STORE(model), &iter, id); if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(keyword_tree), &parent, &iter)) break; iter = parent; } } return FALSE; }
static void keyword_hide_unset_in_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr, gpointer id, GList *keywords) { GtkTreeIter iter = *iter_ptr; while (TRUE) { if (!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords)) { keyword_hide_in(keyword_tree, &iter, id); /* no need to check children of hidden node */ } else { GtkTreeIter child; if (gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &child, &iter)) { keyword_hide_unset_in_recursive(keyword_tree, &child, id, keywords); } } if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(keyword_tree), &iter)) return; } }