[nautilus] list-base: Open directories on hover during DnD
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus] list-base: Open directories on hover during DnD
- Date: Thu, 30 Jun 2022 17:41:23 +0000 (UTC)
commit 3457f7fe5002481cca5102f85bd3a6eec7e1e94a
Author: António Fernandes <antoniof gnome org>
Date: Wed Jun 29 21:34:51 2022 +0100
list-base: Open directories on hover during DnD
Restore behavior from before GTK4 switch.
src/nautilus-list-base.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
---
diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c
index ebb8a5947..ce4f27641 100644
--- a/src/nautilus-list-base.c
+++ b/src/nautilus-list-base.c
@@ -49,6 +49,7 @@ struct _NautilusListBasePrivate
GdkDragAction drag_item_action;
GdkDragAction drag_view_action;
+ guint hover_timer_id;
};
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (NautilusListBase, nautilus_list_base, NAUTILUS_TYPE_FILES_VIEW)
@@ -534,6 +535,50 @@ on_item_drag_prepare (GtkDragSource *source,
return gdk_content_provider_new_typed (GDK_TYPE_FILE_LIST, file_list);
}
+static gboolean
+hover_timer (gpointer user_data)
+{
+ NautilusViewCell *cell = user_data;
+ NautilusListBase *self = nautilus_view_cell_get_view (cell);
+ NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self);
+ NautilusViewItem *item = nautilus_view_cell_get_item (cell);
+ g_autofree gchar *uri = NULL;
+
+ priv->hover_timer_id = 0;
+
+ uri = nautilus_file_get_uri (nautilus_view_item_get_file (item));
+ nautilus_files_view_handle_hover (NAUTILUS_FILES_VIEW (self), uri);
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+on_item_drag_hover_enter (GtkDropControllerMotion *controller,
+ gdouble x,
+ gdouble y,
+ gpointer user_data)
+{
+ NautilusViewCell *cell = user_data;
+ NautilusListBase *self = nautilus_view_cell_get_view (cell);
+ NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self);
+
+ if (priv->hover_timer_id == 0)
+ {
+ priv->hover_timer_id = g_timeout_add (HOVER_TIMEOUT, hover_timer, cell);
+ }
+}
+
+static void
+on_item_drag_hover_leave (GtkDropControllerMotion *controller,
+ gpointer user_data)
+{
+ NautilusViewCell *cell = user_data;
+ NautilusListBase *self = nautilus_view_cell_get_view (cell);
+ NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self);
+
+ g_clear_handle_id (&priv->hover_timer_id, g_source_remove);
+}
+
static void
real_perform_drop (NautilusListBase *self,
const GValue *value,
@@ -773,6 +818,11 @@ setup_cell_common (GtkListItem *listitem,
g_signal_connect (drop_target, "motion", G_CALLBACK (on_item_drag_motion), cell);
g_signal_connect (drop_target, "drop", G_CALLBACK (on_item_drop), cell);
gtk_widget_add_controller (GTK_WIDGET (cell), GTK_EVENT_CONTROLLER (drop_target));
+
+ controller = gtk_drop_controller_motion_new ();
+ gtk_widget_add_controller (GTK_WIDGET (cell), controller);
+ g_signal_connect (controller, "enter", G_CALLBACK (on_item_drag_hover_enter), cell);
+ g_signal_connect (controller, "leave", G_CALLBACK (on_item_drag_hover_leave), cell);
}
static void
@@ -1406,6 +1456,7 @@ nautilus_list_base_dispose (GObject *object)
g_clear_handle_id (&priv->scroll_to_file_handle_id, g_source_remove);
g_clear_handle_id (&priv->prioritize_thumbnailing_handle_id, g_source_remove);
+ g_clear_handle_id (&priv->hover_timer_id, g_source_remove);
G_OBJECT_CLASS (nautilus_list_base_parent_class)->dispose (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]