diff options
author | William Jon McCann <jmccann@redhat.com> | 2013-04-20 15:41:08 -0400 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2013-04-20 15:56:59 -0400 |
commit | fa1f7d3f97aebf9e26453e620acc1958a517cdde (patch) | |
tree | cf923a6d47d4a9389238dcb45cc7edded4a87ec7 /gtk/gtkplacessidebar.c | |
parent | 3b34e70f132ddc6794063fb84a73812b6632f05a (diff) | |
download | gtk+-fa1f7d3f97aebf9e26453e620acc1958a517cdde.tar.gz |
Sync nautilus commit 95400548176688f3d2f5e8888f48410756bd96b8
Switch location on hovering the places sidebar during a DnD operation -
kind of for spring-loaded folders.
Diffstat (limited to 'gtk/gtkplacessidebar.c')
-rw-r--r-- | gtk/gtkplacessidebar.c | 73 |
1 files changed, 65 insertions, 8 deletions
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index acbd59e1ea..59f2ed78be 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -166,6 +166,8 @@ struct _GtkPlacesSidebar { DropState drop_state; int new_bookmark_index; guint drag_leave_timeout_id; + guint switch_location_timer; + char *drop_target_uri; guint show_desktop : 1; }; @@ -1408,6 +1410,15 @@ get_drag_data (GtkTreeView *tree_view, } static void +remove_switch_location_timer (GtkPlacesSidebar *sidebar) +{ + if (sidebar->switch_location_timer != 0) { + g_source_remove (sidebar->switch_location_timer); + sidebar->switch_location_timer = 0; + } +} + +static void free_drag_data (GtkPlacesSidebar *sidebar) { sidebar->drag_data_received = FALSE; @@ -1416,6 +1427,49 @@ free_drag_data (GtkPlacesSidebar *sidebar) g_list_free_full (sidebar->drag_list, g_object_unref); sidebar->drag_list = NULL; } + + remove_switch_location_timer (sidebar); + + g_free (sidebar->drop_target_uri); + sidebar->drop_target_uri = NULL; +} + +static gboolean +switch_location_timer (gpointer user_data) +{ + GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (user_data); + GFile *location; + + sidebar->switch_location_timer = 0; + + location = g_file_new_for_uri (sidebar->drop_target_uri); + emit_open_location (sidebar, location, 0); + g_object_unref (location); + + return FALSE; +} + +static void +check_switch_location_timer (GtkPlacesSidebar *sidebar, const char *uri) +{ + GtkSettings *settings; + guint timeout; + + if (g_strcmp0 (uri, sidebar->drop_target_uri) == 0) { + return; + } + remove_switch_location_timer (sidebar); + + settings = gtk_widget_get_settings (GTK_WIDGET (sidebar)); + g_object_get (settings, "gtk-timeout-expand", &timeout, NULL); + + g_free (sidebar->drop_target_uri); + sidebar->drop_target_uri = NULL; + + if (uri != NULL) { + sidebar->drop_target_uri = g_strdup (uri); + sidebar->switch_location_timer = gdk_threads_add_timeout (timeout, switch_location_timer, sidebar); + } } static void @@ -1525,6 +1579,7 @@ drag_motion_callback (GtkTreeView *tree_view, GtkTreeIter iter; gboolean res; gboolean drop_as_bookmarks; + char *drop_target_uri = NULL; action = 0; drop_as_bookmarks = FALSE; @@ -1571,30 +1626,32 @@ drag_motion_callback (GtkTreeView *tree_view, } if (!drop_as_bookmarks) { - char *uri; - gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter, - PLACES_SIDEBAR_COLUMN_URI, &uri, + PLACES_SIDEBAR_COLUMN_URI, &drop_target_uri, -1); - if (uri != NULL) { - GFile *dest_file = g_file_new_for_uri (uri); + if (drop_target_uri != NULL) { + GFile *dest_file = g_file_new_for_uri (drop_target_uri); action = emit_drag_action_requested (sidebar, context, dest_file, sidebar->drag_list); g_object_unref (dest_file); - g_free (uri); } /* uri may be NULL for unmounted volumes, for example, so we don't allow drops there */ } } } out: - if (action != 0) + if (action != 0) { + check_switch_location_timer (sidebar, drop_target_uri); start_drop_feedback (sidebar, path, pos, drop_as_bookmarks); - else + } else { + remove_switch_location_timer (sidebar); stop_drop_feedback (sidebar); + } + + g_free (drop_target_uri); if (path != NULL) { gtk_tree_path_free (path); |