Commit bacfb449 authored by Paolo Bacchilega's avatar Paolo Bacchilega
Browse files

started work on dnd support

parent 7d592e99
......@@ -2294,6 +2294,42 @@ gth_file_view_item_activated_cb (GtkIconView *iconview,
}
static void
gth_file_list_drag_data_get (GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *selection_data,
guint info,
guint time,
gpointer extra_data)
{
GthBrowser *browser = extra_data;
GList *items;
GList *file_list;
int n_uris;
char **uris;
int i;
GList *scan;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
n_uris = g_list_length (file_list);
uris = g_new (char *, n_uris + 1);
for (i = 0, scan = file_list; scan; scan = scan->next, i++) {
GthFileData *file_data = scan->data;
uris[i] = g_file_get_uri (file_data->file);
g_print ("==> %s\n", uris[i]);
}
uris[i] = NULL;
gtk_selection_data_set_uris (selection_data, uris);
g_strfreev (uris);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
static void
add_browser_toolbar_menu_buttons (GthBrowser *browser)
{
......@@ -2545,12 +2581,12 @@ _gth_browser_unrealize (GtkWidget *browser,
static void
_gth_browser_construct (GthBrowser *browser)
{
GError *error = NULL;
GtkWidget *vbox;
GtkWidget *scrolled_window;
GtkWidget *menubar;
char *general_filter;
int i;
GError *error = NULL;
GtkWidget *vbox;
GtkWidget *scrolled_window;
GtkWidget *menubar;
char *general_filter;
int i;
gtk_window_set_default_size (GTK_WINDOW (browser),
eel_gconf_get_integer (PREF_UI_WINDOW_WIDTH, DEFAULT_UI_WINDOW_WIDTH),
......@@ -2763,8 +2799,6 @@ _gth_browser_construct (GthBrowser *browser)
gtk_widget_show (browser->priv->file_list);
gtk_box_pack_start (GTK_BOX (vbox), browser->priv->file_list, TRUE, TRUE, 0);
browser->priv->file_list_popup = gtk_ui_manager_get_widget (browser->priv->ui, "/FileListPopup");
g_signal_connect (G_OBJECT (browser->priv->file_list),
"button_press_event",
G_CALLBACK (gth_file_list_button_press_cb),
......@@ -2778,6 +2812,13 @@ _gth_browser_construct (GthBrowser *browser)
G_CALLBACK (gth_file_view_item_activated_cb),
browser);
g_signal_connect (gth_file_list_get_view (GTH_FILE_LIST (browser->priv->file_list)),
"drag_data_get",
G_CALLBACK (gth_file_list_drag_data_get),
browser);
browser->priv->file_list_popup = gtk_ui_manager_get_widget (browser->priv->ui, "/FileListPopup");
/* the filter bar */
general_filter = eel_gconf_get_string (PREF_GENERAL_FILTER, DEFAULT_GENERAL_FILTER);
......@@ -4064,10 +4105,7 @@ _gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
gtk_target_list_add (target_list, GNOME_COPIED_FILES, 0, 0);
gtk_target_list_add_uri_targets (target_list, 0);
gtk_target_list_add_text_targets (target_list, 0);
targets = gtk_target_table_new_from_list (target_list, &n_targets);
gtk_target_list_unref (target_list);
gtk_clipboard_set_with_data (gtk_clipboard_get_for_display (gtk_widget_get_display (GTK_WIDGET (browser)), GDK_SELECTION_CLIPBOARD),
targets,
n_targets,
......@@ -4075,6 +4113,7 @@ _gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
clipboard_clear_cb,
data);
gtk_target_list_unref (target_list);
gtk_target_table_free (targets, n_targets);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
......
......@@ -327,6 +327,40 @@ vadj_changed_cb (GtkAdjustment *adjustment,
}
static void
file_view_drag_data_get_cb (GtkWidget *widget,
GdkDragContext *drag_context,
GtkSelectionData *data,
guint info,
guint time,
gpointer user_data)
{
GthFileList *file_list = user_data;
GList *items;
GList *files;
GList *scan;
int n_uris;
char **uris;
int i;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (file_list->priv->view));
files = gth_file_list_get_files (file_list, items);
n_uris = g_list_length (files);
uris = g_new (char *, n_uris + 1);
for (scan = files, i = 0; scan; scan = scan->next, i++) {
GthFileData *file_data = scan->data;
uris[i] = g_file_get_uri (file_data->file);
}
uris[i] = NULL;
gtk_selection_data_set_uris (data, uris);
g_strfreev (uris);
_g_object_list_unref (files);
_gtk_tree_path_list_free (items);
}
static void
gth_file_list_construct (GthFileList *file_list)
{
......@@ -335,6 +369,9 @@ gth_file_list_construct (GthFileList *file_list)
GtkWidget *viewport;
GtkCellRenderer *renderer;
GthFileStore *model;
GtkTargetList *target_list;
GtkTargetEntry *targets;
int n_targets;
/* thumbnail loader */
......@@ -383,6 +420,24 @@ gth_file_list_construct (GthFileList *file_list)
file_list->priv->view = gth_icon_view_new_with_model (GTK_TREE_MODEL (model));
g_object_unref (model);
target_list = gtk_target_list_new (NULL, 0);
gtk_target_list_add_uri_targets (target_list, 0);
gtk_target_list_add_text_targets (target_list, 0);
targets = gtk_target_table_new_from_list (target_list, &n_targets);
gth_file_view_enable_drag_source (GTH_FILE_VIEW (file_list->priv->view),
GDK_BUTTON1_MASK,
targets,
n_targets,
GDK_ACTION_MOVE | GDK_ACTION_COPY);
gtk_target_list_unref (target_list);
gtk_target_table_free (targets, n_targets);
g_signal_connect (G_OBJECT (file_list->priv->view),
"drag-data-get",
G_CALLBACK (file_view_drag_data_get_cb),
file_list);
/* thumbnail */
file_list->priv->thumbnail_renderer = renderer = gth_cell_renderer_thumbnail_new ();
......
......@@ -19,7 +19,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
*/
#include "gth-file-view.h"
......@@ -38,122 +38,157 @@ gth_file_view_get_model (GthFileView *self)
}
void
gth_file_view_set_view_mode (GthFileView *self,
GthViewMode mode)
void
gth_file_view_set_view_mode (GthFileView *self,
GthViewMode mode)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->set_view_mode (self, mode);
}
GthViewMode
gth_file_view_get_view_mode (GthFileView *self)
GthViewMode
gth_file_view_get_view_mode (GthFileView *self)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_view_mode (self);
}
void
gth_file_view_scroll_to (GthFileView *self,
int pos,
double yalign)
void
gth_file_view_scroll_to (GthFileView *self,
int pos,
double yalign)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->scroll_to (self, pos, yalign);
}
GthVisibility
gth_file_view_get_visibility (GthFileView *self,
int pos)
GthVisibility
gth_file_view_get_visibility (GthFileView *self,
int pos)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_visibility (self, pos);
}
int
gth_file_view_get_at_position (GthFileView *self,
int x,
int y)
gth_file_view_get_at_position (GthFileView *self,
int x,
int y)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_at_position (self, x, y);
}
int
gth_file_view_get_first_visible (GthFileView *self)
gth_file_view_get_first_visible (GthFileView *self)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_first_visible (self);
}
int
gth_file_view_get_last_visible (GthFileView *self)
gth_file_view_get_last_visible (GthFileView *self)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_last_visible (self);
}
void
gth_file_view_activated (GthFileView *self,
int pos)
void
gth_file_view_activated (GthFileView *self,
int pos)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->activated (self, pos);
}
void
gth_file_view_set_cursor (GthFileView *self,
int pos)
void
gth_file_view_set_cursor (GthFileView *self,
int pos)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->set_cursor (self, pos);
}
int
gth_file_view_get_cursor (GthFileView *self)
gth_file_view_get_cursor (GthFileView *self)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_cursor (self);
}
void
gth_file_view_set_reorderable (GthFileView *self,
void
gth_file_view_set_reorderable (GthFileView *self,
gboolean value)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->set_reorderable (self, value);
}
gboolean
gth_file_view_get_reorderable (GthFileView *self)
gboolean
gth_file_view_get_reorderable (GthFileView *self)
{
return GTH_FILE_VIEW_GET_INTERFACE (self)->get_reorderable (self);
}
GType
gth_file_view_get_type (void)
void
gth_file_view_enable_drag_source (GthFileView *self,
GdkModifierType start_button_mask,
const GtkTargetEntry *targets,
int n_targets,
GdkDragAction actions)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->enable_drag_source (self, start_button_mask, targets, n_targets, actions);
}
void
gth_file_view_unset_drag_source (GthFileView *self)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->unset_drag_source (self);
}
void
gth_file_view_enable_drag_dest (GthFileView *self,
const GtkTargetEntry *targets,
int n_targets,
GdkDragAction actions)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->enable_drag_dest (self, targets, n_targets, actions);
}
void
gth_file_view_unset_drag_dest (GthFileView *self)
{
GTH_FILE_VIEW_GET_INTERFACE (self)->unset_drag_dest (self);
}
GType
gth_file_view_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo g_define_type_info = {
sizeof (GthFileViewIface),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) NULL,
(GClassFinalizeFunc) NULL,
NULL,
0,
0,
(GInstanceInitFunc) NULL,
NULL
static const GTypeInfo g_define_type_info = {
sizeof (GthFileViewIface),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) NULL,
(GClassFinalizeFunc) NULL,
NULL,
0,
0,
(GInstanceInitFunc) NULL,
NULL
};
type = g_type_register_static (G_TYPE_INTERFACE,
"GthFileView",
&g_define_type_info,
type = g_type_register_static (G_TYPE_INTERFACE,
"GthFileView",
&g_define_type_info,
0);
}
return type;
}
......@@ -58,57 +58,79 @@ struct _GthFileViewIface {
/*< virtual functions >*/
void (*set_model) (GthFileView *self,
GtkTreeModel *model);
GtkTreeModel * (*get_model) (GthFileView *self);
void (*set_view_mode) (GthFileView *self,
GthViewMode mode);
GthViewMode (*get_view_mode) (GthFileView *self);
void (*scroll_to) (GthFileView *self,
int pos,
double yalign);
GthVisibility (*get_visibility) (GthFileView *self,
int pos);
int (*get_at_position) (GthFileView *self,
int x,
int y);
int (*get_first_visible) (GthFileView *self);
int (*get_last_visible) (GthFileView *self);
void (*activated) (GthFileView *self,
int pos);
void (*set_cursor) (GthFileView *self,
int pos);
int (*get_cursor) (GthFileView *self);
void (*set_reorderable) (GthFileView *self,
gboolean value);
gboolean (*get_reorderable) (GthFileView *self);
void (*set_model) (GthFileView *self,
GtkTreeModel *model);
GtkTreeModel * (*get_model) (GthFileView *self);
void (*set_view_mode) (GthFileView *self,
GthViewMode mode);
GthViewMode (*get_view_mode) (GthFileView *self);
void (*scroll_to) (GthFileView *self,
int pos,
double yalign);
GthVisibility (*get_visibility) (GthFileView *self,
int pos);
int (*get_at_position) (GthFileView *self,
int x,
int y);
int (*get_first_visible) (GthFileView *self);
int (*get_last_visible) (GthFileView *self);
void (*activated) (GthFileView *self,
int pos);
void (*set_cursor) (GthFileView *self,
int pos);
int (*get_cursor) (GthFileView *self);
void (*set_reorderable) (GthFileView *self,
gboolean value);
gboolean (*get_reorderable) (GthFileView *self);
void (*enable_drag_source) (GthFileView *self,
GdkModifierType start_button_mask,
const GtkTargetEntry *targets,
gint n_targets,
GdkDragAction actions);
void (*unset_drag_source) (GthFileView *self);
void (*enable_drag_dest) (GthFileView *self,
const GtkTargetEntry *targets,
gint n_targets,
GdkDragAction actions);
void (*unset_drag_dest) (GthFileView *self);
};
GType gth_file_view_get_type (void);
void gth_file_view_set_model (GthFileView *self,
GtkTreeModel *model);
GtkTreeModel * gth_file_view_get_model (GthFileView *self);
void gth_file_view_set_view_mode (GthFileView *self,
GthViewMode mode);
GthViewMode gth_file_view_get_view_mode (GthFileView *self);
void gth_file_view_scroll_to (GthFileView *self,
int pos,
double yalign);
GthVisibility gth_file_view_get_visibility (GthFileView *self,
int pos);
int gth_file_view_get_at_position (GthFileView *self,
int x,
int y);
int gth_file_view_get_first_visible (GthFileView *self);
int gth_file_view_get_last_visible (GthFileView *self);
void gth_file_view_activated (GthFileView *self,
int pos);
void gth_file_view_set_cursor (GthFileView *self,
int pos);
int gth_file_view_get_cursor (GthFileView *self);
void gth_file_view_set_reorderable (GthFileView *self,
gboolean value);
gboolean gth_file_view_get_reorderable (GthFileView *self);
GType gth_file_view_get_type (void);
void gth_file_view_set_model (GthFileView *self,
GtkTreeModel *model);
GtkTreeModel * gth_file_view_get_model (GthFileView *self);
void gth_file_view_set_view_mode (GthFileView *self,
GthViewMode mode);
GthViewMode gth_file_view_get_view_mode (GthFileView *self);
void gth_file_view_scroll_to (GthFileView *self,
int pos,
double yalign);
GthVisibility gth_file_view_get_visibility (GthFileView *self,
int pos);
int gth_file_view_get_at_position (GthFileView *self,
int x,
int y);
int gth_file_view_get_first_visible (GthFileView *self);
int gth_file_view_get_last_visible (GthFileView *self);
void gth_file_view_activated (GthFileView *self,
int pos);
void gth_file_view_set_cursor (GthFileView *self,
int pos);
int gth_file_view_get_cursor (GthFileView *self);
void gth_file_view_set_reorderable (GthFileView *self,
gboolean value);
gboolean gth_file_view_get_reorderable (GthFileView *self);
void gth_file_view_enable_drag_source (GthFileView *self,
GdkModifierType start_button_mask,
const GtkTargetEntry *targets,
int n_targets,
GdkDragAction actions);
void gth_file_view_unset_drag_source (GthFileView *self);
void gth_file_view_enable_drag_dest (GthFileView *self,
const GtkTargetEntry *targets,
int n_targets,
GdkDragAction actions);
void gth_file_view_unset_drag_dest (GthFileView *self);
G_END_DECLS
......
......@@ -206,6 +206,48 @@ gth_icon_view_real_get_reorderable (GthFileView *base)
}
static void
gth_icon_view_enable_drag_source (GthFileView *self,
GdkModifierType start_button_mask,
const GtkTargetEntry *targets,
int n_targets,
GdkDragAction actions)
{
gtk_icon_view_enable_model_drag_source (GTK_ICON_VIEW (self),
start_button_mask,
targets,
n_targets,
actions);
}
static void
gth_icon_view_unset_drag_source (GthFileView *self)
{
gtk_icon_view_unset_model_drag_source (GTK_ICON_VIEW (self));
}
static void
gth_icon_view_enable_drag_dest (GthFileView *self,
const GtkTargetEntry *targets,
int n_targets,
GdkDragAction actions)
{
gtk_icon_view_enable_model_drag_dest (GTK_ICON_VIEW (self),
targets,
n_targets,
actions);
}
static void
gth_icon_view_unset_drag_dest (GthFileView *self)
{
gtk_icon_view_unset_model_drag_dest (GTK_ICON_VIEW (self));
}
static GList *
gth_icon_view_real_get_selected (GthFileSelection *base)
{
......@@ -322,28 +364,26 @@ gtk_icon_view_add_move_binding (GtkBindingSet *binding_set,
GtkMovementStep step,
gint count)
{
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
return;
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
return;
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK,
"move_cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
}
......@@ -392,6 +432,10 @@ gth_icon_view_gth_file_view_interface_init (GthFileViewIface *iface)
iface->get_cursor = gth_icon_view_real_get_cursor;
iface->set_reorderable = gth_icon_view_real_set_reorderable;
iface->get_reorderable = gth_icon_view_real_get_reorderable;
iface->enable_drag_source = gth_icon_view_enable_drag_source;
iface->unset_drag_source = gth_icon_view_unset_drag_source;
iface->enable_drag_dest = gth_icon_view_enable_drag_dest;