Mercurial > geeqie.yaz
diff src/metadata.c @ 1392:d1b32a69b40a
dnd in keywords tree
improved dnd in advanced exif
author | nadvornik |
---|---|
date | Sun, 08 Mar 2009 09:56:40 +0000 |
parents | 9e0df7903581 |
children | 58f0b4586c8c |
line wrap: on
line diff
--- a/src/metadata.c Sat Mar 07 17:02:59 2009 +0000 +++ b/src/metadata.c Sun Mar 08 09:56:40 2009 +0000 @@ -729,6 +729,93 @@ g_free(casefold); } +void keyword_copy(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from) +{ + + gchar *mark, *name, *casefold; + gboolean is_keyword; + + gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), from, KEYWORD_COLUMN_MARK, &mark, + KEYWORD_COLUMN_NAME, &name, + KEYWORD_COLUMN_CASEFOLD, &casefold, + KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1); + + gtk_tree_store_set(keyword_tree, to, KEYWORD_COLUMN_MARK, mark, + KEYWORD_COLUMN_NAME, name, + KEYWORD_COLUMN_CASEFOLD, casefold, + KEYWORD_COLUMN_IS_KEYWORD, is_keyword, -1); + g_free(mark); + g_free(name); + g_free(casefold); +} + +void keyword_copy_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from) +{ + GtkTreeIter from_child; + + keyword_copy(keyword_tree, to, from); + + if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &from_child, from)) return; + + while (TRUE) + { + GtkTreeIter to_child; + gtk_tree_store_append(keyword_tree, &to_child, to); + keyword_copy_recursive(keyword_tree, &to_child, &from_child); + if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(keyword_tree), &from_child)) return; + } +} + +void keyword_move_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from) +{ + keyword_copy_recursive(keyword_tree, to, from); + gtk_tree_store_remove(keyword_tree, from); +} + +GList *keyword_tree_get_path(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr) +{ + GList *path = NULL; + GtkTreeIter iter = *iter_ptr; + + while (TRUE) + { + GtkTreeIter parent; + path = g_list_prepend(path, keyword_get_name(keyword_tree, &iter)); + if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) break; + iter = parent; + } + return path; +} + +gboolean keyword_tree_get_iter(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList *path) +{ + GtkTreeIter iter; + + if (!gtk_tree_model_get_iter_first(keyword_tree, &iter)) return FALSE; + + while (TRUE) + { + GtkTreeIter children; + while (TRUE) + { + gchar *name = keyword_get_name(keyword_tree, &iter); + if (strcmp(name, path->data) == 0) break; + g_free(name); + if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return FALSE; + } + path = path->next; + if (!path) + { + *iter_ptr = iter; + return TRUE; + } + + if (!gtk_tree_model_iter_children(keyword_tree, &children, &iter)) return FALSE; + iter = children; + } +} + + static gboolean keyword_tree_is_set_casefold(GtkTreeModel *keyword_tree, GtkTreeIter iter, GList *casefold_list) { if (!casefold_list) return FALSE; @@ -798,7 +885,6 @@ if (!find_string_in_list_utf8nocase(*kw_list, name)) { *kw_list = g_list_append(*kw_list, name); - printf("set %s\n", name); } else { @@ -823,7 +909,6 @@ if (found) { *kw_list = g_list_remove(*kw_list, found); - printf("remove %s\n", found); g_free(found); } g_free(name);