[nautilus] view-item: Add drag-accept property for DnD



commit a611f33227fa5a47c662c0885758210e739bda2d
Author: Corey Berla <corey berla me>
Date:   Thu Jun 16 08:31:28 2022 -0700

    view-item: Add drag-accept property for DnD
    
    Set drag-accept to TRUE when a drag has entered an item.
    Set flag NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT when the DnD
    has entered an item so that the icon will be update (i.e.
    the folder will show the "open folder" icon)

 src/nautilus-grid-cell.c | 15 +++++++++++++++
 src/nautilus-name-cell.c | 15 +++++++++++++++
 src/nautilus-view-item.c | 27 +++++++++++++++++++++++++++
 src/nautilus-view-item.h |  2 ++
 4 files changed, 59 insertions(+)
---
diff --git a/src/nautilus-grid-cell.c b/src/nautilus-grid-cell.c
index 426a2c2a8..28fc43622 100644
--- a/src/nautilus-grid-cell.c
+++ b/src/nautilus-grid-cell.c
@@ -31,6 +31,7 @@ update_icon (NautilusGridCell *self)
 {
     NautilusViewItem *item;
     NautilusFileIconFlags flags;
+    gboolean drag_accept;
     g_autoptr (GdkPaintable) icon_paintable = NULL;
     GtkStyleContext *style_context;
     NautilusFile *file;
@@ -46,6 +47,12 @@ update_icon (NautilusGridCell *self)
             NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS |
             NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM;
 
+    g_object_get (item, "drag-accept", &drag_accept, NULL);
+    if (drag_accept)
+    {
+        flags |= NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT;
+    }
+
     icon_paintable = nautilus_file_get_icon_paintable (file, icon_size, 1, flags);
     gtk_picture_set_paintable (GTK_PICTURE (self->icon), icon_paintable);
 
@@ -127,6 +134,12 @@ on_item_size_changed (NautilusGridCell *self)
     update_captions (self);
 }
 
+static void
+on_item_drag_accept_changed (NautilusGridCell *self)
+{
+    update_icon (self);
+}
+
 static void
 on_item_is_cut_changed (NautilusGridCell *self)
 {
@@ -181,6 +194,8 @@ nautilus_grid_cell_init (NautilusGridCell *self)
     self->item_signal_group = g_signal_group_new (NAUTILUS_TYPE_VIEW_ITEM);
     g_signal_group_connect_swapped (self->item_signal_group, "notify::icon-size",
                                     (GCallback) on_item_size_changed, self);
+    g_signal_group_connect_swapped (self->item_signal_group, "notify::drag-accept",
+                                    (GCallback) on_item_drag_accept_changed, self);
     g_signal_group_connect_swapped (self->item_signal_group, "notify::is-cut",
                                     (GCallback) on_item_is_cut_changed, self);
     g_signal_group_connect_swapped (self->item_signal_group, "file-changed",
diff --git a/src/nautilus-name-cell.c b/src/nautilus-name-cell.c
index daa6308a7..9a269ac68 100644
--- a/src/nautilus-name-cell.c
+++ b/src/nautilus-name-cell.c
@@ -133,6 +133,7 @@ static void
 update_icon (NautilusNameCell *self)
 {
     NautilusFileIconFlags flags;
+    gboolean drag_accept;
     g_autoptr (GdkPaintable) icon_paintable = NULL;
     GtkStyleContext *style_context;
     NautilusViewItem *item;
@@ -152,6 +153,12 @@ update_icon (NautilusNameCell *self)
             NAUTILUS_FILE_ICON_FLAGS_USE_EMBLEMS |
             NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM;
 
+    g_object_get (item, "drag-accept", &drag_accept, NULL);
+    if (drag_accept)
+    {
+        flags |= NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT;
+    }
+
     icon_paintable = nautilus_file_get_icon_paintable (file, icon_size, 1, flags);
     gtk_picture_set_paintable (GTK_PICTURE (self->icon), icon_paintable);
 
@@ -198,6 +205,12 @@ on_item_size_changed (NautilusNameCell *self)
     update_icon (self);
 }
 
+static void
+on_item_drag_accept_changed (NautilusNameCell *self)
+{
+    update_icon (self);
+}
+
 static void
 on_item_is_cut_changed (NautilusNameCell *self)
 {
@@ -225,6 +238,8 @@ nautilus_name_cell_init (NautilusNameCell *self)
     self->item_signal_group = g_signal_group_new (NAUTILUS_TYPE_VIEW_ITEM);
     g_signal_group_connect_swapped (self->item_signal_group, "notify::icon-size",
                                     (GCallback) on_item_size_changed, self);
+    g_signal_group_connect_swapped (self->item_signal_group, "notify::drag-accept",
+                                    (GCallback) on_item_drag_accept_changed, self);
     g_signal_group_connect_swapped (self->item_signal_group, "notify::is-cut",
                                     (GCallback) on_item_is_cut_changed, self);
     g_signal_group_connect_swapped (self->item_signal_group, "file-changed",
diff --git a/src/nautilus-view-item.c b/src/nautilus-view-item.c
index 560cfec42..84423fa2d 100644
--- a/src/nautilus-view-item.c
+++ b/src/nautilus-view-item.c
@@ -11,6 +11,7 @@ struct _NautilusViewItem
     GObject parent_instance;
     guint icon_size;
     gboolean is_cut;
+    gboolean drag_accept;
     NautilusFile *file;
     GtkWidget *item_ui;
 };
@@ -23,6 +24,7 @@ enum
     PROP_FILE,
     PROP_ICON_SIZE,
     PROP_IS_CUT,
+    PROP_DRAG_ACCEPT,
     PROP_ITEM_UI,
     N_PROPS
 };
@@ -85,6 +87,12 @@ nautilus_view_item_get_property (GObject    *object,
         }
         break;
 
+        case PROP_DRAG_ACCEPT:
+        {
+            g_value_set_boolean (value, self->drag_accept);
+        }
+        break;
+
         case PROP_ITEM_UI:
         {
             g_value_set_object (value, self->item_ui);
@@ -126,6 +134,12 @@ nautilus_view_item_set_property (GObject      *object,
         }
         break;
 
+        case PROP_DRAG_ACCEPT:
+        {
+            self->drag_accept = g_value_get_boolean (value);
+        }
+        break;
+
         case PROP_ITEM_UI:
         {
             g_set_object (&self->item_ui, g_value_get_object (value));
@@ -164,6 +178,10 @@ nautilus_view_item_class_init (NautilusViewItemClass *klass)
                                                     "", "",
                                                     FALSE,
                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+    properties[PROP_DRAG_ACCEPT] = g_param_spec_boolean ("drag-accept",
+                                                         "", "",
+                                                         FALSE,
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
     properties[PROP_FILE] = g_param_spec_object ("file",
                                                  "", "",
                                                  NAUTILUS_TYPE_FILE,
@@ -219,6 +237,15 @@ nautilus_view_item_set_cut (NautilusViewItem *self,
     g_object_set (self, "is-cut", is_cut, NULL);
 }
 
+void
+nautilus_view_item_set_drag_accept (NautilusViewItem *self,
+                                    gboolean          drag_accept)
+{
+    g_return_if_fail (NAUTILUS_IS_VIEW_ITEM (self));
+
+    g_object_set (self, "drag-accept", drag_accept, NULL);
+}
+
 NautilusFile *
 nautilus_view_item_get_file (NautilusViewItem *self)
 {
diff --git a/src/nautilus-view-item.h b/src/nautilus-view-item.h
index 5e620520a..9bdaff158 100644
--- a/src/nautilus-view-item.h
+++ b/src/nautilus-view-item.h
@@ -26,6 +26,8 @@ void               nautilus_view_item_set_icon_size (NautilusViewItem *self,
 guint              nautilus_view_item_get_icon_size (NautilusViewItem *self);
 void               nautilus_view_item_set_cut       (NautilusViewItem *self,
                                                      gboolean          is_cut);
+void               nautilus_view_item_set_drag_accept (NautilusViewItem *self,
+                                                       gboolean          drag_accept);
 
 NautilusFile *     nautilus_view_item_get_file      (NautilusViewItem *self);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]