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; }
void keyword_tree_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList **kw_list) { GtkTreeIter iter = *iter_ptr; while (TRUE) { GtkTreeIter parent; if (keyword_get_is_keyword(keyword_tree, &iter)) { gchar *name = keyword_get_name(keyword_tree, &iter); if (!find_string_in_list(*kw_list, name)) { *kw_list = g_list_append(*kw_list, name); } else { g_free(name); } } if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return; iter = parent; } }
static void bar_pane_keywords_dnd_get(GtkWidget *tree_view, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; GtkTreeIter child_iter; GtkTreeModel *keyword_tree; GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); if (!gtk_tree_selection_get_selected(sel, &model, &iter)) 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); switch (info) { case TARGET_APP_KEYWORD_PATH: { GList *path = keyword_tree_get_path(keyword_tree, &child_iter); gtk_selection_data_set(selection_data, gtk_selection_data_get_target(selection_data), 8, (gpointer) &path, sizeof(path)); break; } case TARGET_TEXT_PLAIN: default: { gchar *name = keyword_get_name(keyword_tree, &child_iter); gtk_selection_data_set_text(selection_data, name, -1); g_free(name); } break; } }