GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values) { gchar *name = NULL; gboolean is_kw = TRUE; while (*attribute_names) { const gchar *option = *attribute_names++; const gchar *value = *attribute_values++; if (READ_CHAR_FULL("name", name)) continue; if (READ_BOOL_FULL("kw", is_kw)) continue; log_printf("unknown attribute %s = %s\n", option, value); } if (name && name[0]) { GtkTreeIter iter; /* re-use existing keyword if any */ if (!keyword_exists(GTK_TREE_MODEL(keyword_tree), parent, NULL, name, FALSE, &iter)) { gtk_tree_store_append(keyword_tree, &iter, parent); } keyword_set(keyword_tree, &iter, name, is_kw); g_free(name); return gtk_tree_iter_copy(&iter); } g_free(name); return NULL; }
static gboolean bar_pane_keywords_dnd_skip_existing(GtkTreeModel *keyword_tree, GtkTreeIter *dest_kw_iter, GList **keywords) { /* we have to find at least one keyword that does not already exist as a sibling of dest_kw_iter */ GList *work = *keywords; while (work) { gchar *keyword = work->data; if (keyword_exists(keyword_tree, NULL, dest_kw_iter, keyword, FALSE, NULL)) { GList *next = work->next; g_free(keyword); *keywords = g_list_delete_link(*keywords, work); work = next; } else { work = work->next; } } return !!*keywords; }
static gboolean bar_pane_keywords_dnd_can_move(GtkTreeModel *keyword_tree, GtkTreeIter *src_kw_iter, GtkTreeIter *dest_kw_iter) { gchar *src_name; GtkTreeIter parent; if (dest_kw_iter && keyword_same_parent(keyword_tree, src_kw_iter, dest_kw_iter)) { return TRUE; /* reordering of siblings is ok */ } if (!dest_kw_iter && !gtk_tree_model_iter_parent(keyword_tree, &parent, src_kw_iter)) { return TRUE; /* reordering of top-level siblings is ok */ } src_name = keyword_get_name(keyword_tree, src_kw_iter); if (keyword_exists(keyword_tree, NULL, dest_kw_iter, src_name, FALSE, NULL)) { g_free(src_name); return FALSE; } g_free(src_name); return TRUE; }
static void bar_pane_keywords_edit_ok_cb(GenericDialog *gd, gpointer data) { ConfDialogData *cdd = data; PaneKeywordsData *pkd = cdd->pkd; GtkTreeModel *model; GtkTreeModel *keyword_tree; GtkTreeIter kw_iter; gboolean have_dest = FALSE; GList *keywords; model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); if (cdd->click_tpath) { GtkTreeIter iter; if (gtk_tree_model_get_iter(model, &iter, cdd->click_tpath)) { gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); have_dest = TRUE; } } if (cdd->edit_existing && !have_dest) return; keywords = keyword_list_pull(cdd->edit_widget); if (cdd->edit_existing) { if (keywords && keywords->data && /* there should be one keyword */ !keyword_exists(keyword_tree, NULL, &kw_iter, keywords->data, TRUE, NULL)) { keyword_set(GTK_TREE_STORE(keyword_tree), &kw_iter, keywords->data, cdd->is_keyword); } } else { GList *work = keywords; gboolean append_to = FALSE; while (work) { GtkTreeIter add; if (keyword_exists(keyword_tree, NULL, (have_dest || append_to) ? &kw_iter : NULL, work->data, FALSE, NULL)) { work = work->next; continue; } if (have_dest) { gtk_tree_store_append(GTK_TREE_STORE(keyword_tree), &add, &kw_iter); } else if (append_to) { gtk_tree_store_insert_after(GTK_TREE_STORE(keyword_tree), &add, NULL, &kw_iter); } else { gtk_tree_store_append(GTK_TREE_STORE(keyword_tree), &add, NULL); append_to = TRUE; kw_iter = add; } keyword_set(GTK_TREE_STORE(keyword_tree), &add, work->data, cdd->is_keyword); work = work->next; } } string_list_free(keywords); }