[gnome-flashback/gnome-3-36] desktop: resort icons when file changes



commit 67827b7fdcf91d24a9a7583f5a2a898ccd8117a6
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Wed Apr 29 18:02:21 2020 +0300

    desktop: resort icons when file changes

 gnome-flashback/libdesktop/gf-icon-view.c | 12 ++++++++++++
 gnome-flashback/libdesktop/gf-icon.c      | 30 ++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 4 deletions(-)
---
diff --git a/gnome-flashback/libdesktop/gf-icon-view.c b/gnome-flashback/libdesktop/gf-icon-view.c
index 9299beb..2c3e7f8 100644
--- a/gnome-flashback/libdesktop/gf-icon-view.c
+++ b/gnome-flashback/libdesktop/gf-icon-view.c
@@ -626,6 +626,14 @@ create_icon_info (GfIconView *self,
   return gf_icon_info_new (icon);
 }
 
+static void
+icon_changed_cb (GfIcon     *icon,
+                 GfIconView *self)
+{
+  if (self->placement == GF_PLACEMENT_AUTO_ARRANGE_ICONS)
+    resort_icons (self, FALSE);
+}
+
 static void
 query_info_cb (GObject      *object,
                GAsyncResult *res,
@@ -657,6 +665,8 @@ query_info_cb (GObject      *object,
   icon = gf_icon_new (self, file, file_info);
   g_object_unref (file_info);
 
+  g_signal_connect (icon, "changed", G_CALLBACK (icon_changed_cb), self);
+
   icon_info = create_icon_info (self, icon);
   self->icons = g_list_prepend (self->icons, icon_info);
 
@@ -1618,6 +1628,8 @@ next_files_cb (GObject      *object,
       icon = gf_icon_new (self, file, info);
       g_object_unref (file);
 
+      g_signal_connect (icon, "changed", G_CALLBACK (icon_changed_cb), self);
+
       icon_info = create_icon_info (self, icon);
       self->icons = g_list_prepend (self->icons, icon_info);
     }
diff --git a/gnome-flashback/libdesktop/gf-icon.c b/gnome-flashback/libdesktop/gf-icon.c
index 6305043..d07d793 100644
--- a/gnome-flashback/libdesktop/gf-icon.c
+++ b/gnome-flashback/libdesktop/gf-icon.c
@@ -85,6 +85,8 @@ enum
 {
   SELECTED,
 
+  CHANGED,
+
   LAST_SIGNAL
 };
 
@@ -835,21 +837,33 @@ update_icon (GfIcon *self)
   gtk_image_set_pixel_size (GTK_IMAGE (priv->image), priv->icon_size);
 }
 
-static void
+static gboolean
 update_text (GfIcon *self)
 {
   GfIconPrivate *priv;
   const char *name;
+  char *old_name;
 
   priv = gf_icon_get_instance_private (self);
 
   name = GF_ICON_GET_CLASS (self)->get_text (self);
 
+  old_name = priv->name;
   priv->name = g_strdup (name);
+
   gtk_label_set_text (GTK_LABEL (priv->label), name);
 
   g_clear_pointer (&priv->name_collated, g_free);
   priv->name_collated = g_utf8_collate_key_for_filename (name, -1);
+
+  if (g_strcmp0 (old_name, name) != 0)
+    {
+      g_free (old_name);
+      return TRUE;
+    }
+
+  g_free (old_name);
+  return FALSE;
 }
 
 static void
@@ -924,7 +938,7 @@ load_thumbnail (GfIcon *self)
   g_free (uri);
 }
 
-static void
+static gboolean
 icon_refresh (GfIcon *self)
 {
   GfIconPrivate *priv;
@@ -948,7 +962,8 @@ icon_refresh (GfIcon *self)
     }
 
   update_icon (self);
-  update_text (self);
+
+  return update_text (self);
 }
 
 static void
@@ -980,6 +995,8 @@ query_info_cb (GObject      *object,
   priv->info = file_info;
 
   icon_refresh (self);
+
+  g_signal_emit (self, icon_signals[CHANGED], 0);
 }
 
 static void
@@ -1019,7 +1036,8 @@ file_changed_cb (GFileMonitor      *monitor,
         break;
 
       case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
-        icon_refresh (self);
+        if (icon_refresh (self))
+          g_signal_emit (self, icon_signals[CHANGED], 0);
         break;
 
       case G_FILE_MONITOR_EVENT_DELETED:
@@ -1371,6 +1389,10 @@ install_signals (void)
   icon_signals[SELECTED] =
     g_signal_new ("selected", GF_TYPE_ICON, G_SIGNAL_RUN_LAST,
                   0, NULL, NULL, NULL, G_TYPE_NONE, 0);
+
+  icon_signals[CHANGED] =
+    g_signal_new ("changed", GF_TYPE_ICON, G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL, NULL, G_TYPE_NONE, 0);
 }
 
 static void


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