Yasumichi Akahoshi
yasum****@users*****
2005年 9月 26日 (月) 22:03:04 JST
Index: cxplorer/src/cxp-dir-view.c diff -u cxplorer/src/cxp-dir-view.c:1.27 cxplorer/src/cxp-dir-view.c:1.28 --- cxplorer/src/cxp-dir-view.c:1.27 Mon Sep 26 15:46:59 2005 +++ cxplorer/src/cxp-dir-view.c Mon Sep 26 22:03:04 2005 @@ -1,4 +1,4 @@ -/* $Id: cxp-dir-view.c,v 1.27 2005/09/26 06:46:59 yasumichi Exp $ */ +/* $Id: cxp-dir-view.c,v 1.28 2005/09/26 13:03:04 yasumichi Exp $ */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -162,7 +162,8 @@ priv->dirview = cxp_dir_view_tree_view_new (self); gtk_container_add (GTK_CONTAINER (self), priv->dirview); priv->dispose_has_run = FALSE; - gtk_drag_dest_set (priv->dirview, GTK_DEST_DEFAULT_ALL, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); + //gtk_drag_dest_set (priv->dirview, GTK_DEST_DEFAULT_ALL, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(priv->dirview), cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); /* signal connect */ g_signal_connect (priv->dirview, "row_expanded", @@ -773,6 +774,10 @@ } g_free (dest_dir); g_strfreev (move_file); + gtk_drag_finish (dc, TRUE, TRUE, t); + return; } } + + gtk_drag_finish (dc, FALSE, FALSE, t); } Index: cxplorer/src/cxp-right-pane.c diff -u cxplorer/src/cxp-right-pane.c:1.74 cxplorer/src/cxp-right-pane.c:1.75 --- cxplorer/src/cxp-right-pane.c:1.74 Mon Sep 26 18:56:15 2005 +++ cxplorer/src/cxp-right-pane.c Mon Sep 26 22:03:04 2005 @@ -136,6 +136,7 @@ void cxp_right_pane_drag_data_get(GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *selection_data, guint info, guint t, gpointer data); void cxp_right_pane_drag_data_delete (GtkWidget *widget, GdkDragContext *dc, gpointer data); void cxp_right_pane_drag_data_received (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, gpointer data); +gboolean cxp_right_pane_drag_drop (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint t, gpointer data); GType cxp_right_pane_get_type (void) { @@ -222,7 +223,9 @@ gtk_container_add (GTK_CONTAINER (scrolled_window), priv->file_list); gtk_widget_show (priv->file_list); gtk_drag_source_set(priv->file_list, GDK_BUTTON1_MASK, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); - gtk_drag_dest_set (priv->file_list, GTK_DEST_DEFAULT_ALL, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); + //gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW(priv->file_list), GDK_BUTTON1_MASK, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); + //gtk_drag_dest_set (priv->file_list, GTK_DEST_DEFAULT_ALL, cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(priv->file_list), cxp_target_types, G_N_ELEMENTS(cxp_target_types), GDK_ACTION_MOVE); priv->expander = gtk_expander_new (_("<b>Preview</b>")); gtk_expander_set_use_markup (GTK_EXPANDER (priv->expander), TRUE); @@ -255,6 +258,8 @@ G_CALLBACK (cxp_right_pane_drag_data_get), self); g_signal_connect (priv->file_list, "drag_data_delete", G_CALLBACK (cxp_right_pane_drag_data_delete), self); + g_signal_connect (priv->file_list, "drag_drop", + G_CALLBACK (cxp_right_pane_drag_drop), self); g_signal_connect (priv->file_list, "drag_data_received", G_CALLBACK (cxp_right_pane_drag_data_received), self); g_signal_connect (priv->file_list, "key-press-event", @@ -1437,7 +1442,9 @@ GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; + gchar *cur_dir; + g_print("called\n"); model = gtk_tree_view_get_model (GTK_TREE_VIEW(priv->file_list)); if(gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(priv->file_list), x, y, &path, &pos)) { @@ -1465,7 +1472,71 @@ } g_free (dest_dir); g_strfreev (move_file); + cur_dir = g_strdup (priv->cur_dir); + cxp_right_pane_change_directory (CXP_RIGHT_PANE(data), + cur_dir); + g_free (cur_dir); + gtk_drag_finish (dc, TRUE, TRUE, t); + } + } + } +} + +gboolean cxp_right_pane_drag_drop (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint t, gpointer data) +{ + CxpRightPanePrivate *priv = CXP_RIGHT_PANE_GET_PRIVATE (data); + GtkTreeViewDropPosition pos; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + gchar *cur_dir; + gchar *dest_dir; + gchar *src_path; + gchar *src_base; + gchar *dest_path; + + GtkTreeSelection *selection; + GList *list, *cur; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW(priv->file_list)); + if(gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(priv->file_list), x, y, &path, &pos)) + { + if (gtk_tree_model_get_iter(model, &iter, path)) + { + gtk_tree_model_get (model, &iter, FILE_LIST_COL_FULLPATH, &dest_dir, -1); + if(g_file_test(dest_dir, G_FILE_TEST_IS_DIR)) + { + selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->file_list)); + + list = gtk_tree_selection_get_selected_rows (selection, &model); + cur = list; + while (cur != NULL) + { + gtk_tree_model_get_iter (model, &iter, cur->data); + gtk_tree_model_get (model, &iter, FILE_LIST_COL_FULLPATH, + &src_path, -1); + src_base = g_path_get_basename (src_path); + dest_path = g_build_filename (dest_dir, src_base, NULL); + errno = 0; + if(rename(src_path, dest_path) == -1) + { + cxp_error_dialog_run_about_file (src_base); + } + g_free (dest_path); + g_free (src_base); + g_free (src_path); + cur = g_list_next (cur); + } + gtk_drag_finish (dc, TRUE, TRUE, t); + + return TRUE; } } } + + gtk_drag_finish (dc, FALSE, FALSE, t); + g_signal_stop_emission_by_name (priv->file_list, "drag_drop"); + + return FALSE; }