[Xfce4-commits] [xfce/thunar] 01/01: File / Folder size text in statusbar sometimes is ambiguous (Bug #14203)

noreply at xfce.org noreply at xfce.org
Tue Aug 14 22:04:17 CEST 2018


This is an automated email from the git hooks/post-receive script.

a   l   e   x       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/thunar.

commit f0d6b65fabd8cba6695455cac3e0d36d4bd40f13
Author: Alexander Schwinn <acs82 at gmx.de>
Date:   Mon Feb 26 13:39:11 2018 +0100

    File / Folder size text in statusbar sometimes is ambiguous
    (Bug #14203)
---
 thunar/thunar-list-model.c | 218 ++++++++++++++++++++++-----------------------
 1 file changed, 105 insertions(+), 113 deletions(-)

diff --git a/thunar/thunar-list-model.c b/thunar/thunar-list-model.c
index 713aa51..7a730a4 100644
--- a/thunar/thunar-list-model.c
+++ b/thunar/thunar-list-model.c
@@ -2311,6 +2311,82 @@ thunar_list_model_get_paths_for_pattern (ThunarListModel *store,
 
 
 /**
+ * thunar_list_model_get_statusbar_text_for_files:
+ * @files                        : list of files for which a text is requested
+ * @show_file_size_binary_format : weather the file size should be displayed in binary format
+ *
+ * Generates the statusbar text for the given @files.
+ *
+ * The caller is reponsible to free the returned text using
+ * g_free() when it's no longer needed.
+ *
+ * Return value: the statusbar text for @store with the given @files.
+ **/
+static gchar*
+thunar_list_model_get_statusbar_text_for_files (GList    *files,
+                                                gboolean  show_file_size_binary_format)
+{
+  guint64  size_summary = 0;
+  gint     folder_count = 0;
+  gint     non_folder_count = 0;
+  GList   *lp;
+  gchar   *size_string;
+  gchar   *text;
+  gchar   *folder_text = NULL;
+  gchar   *non_folder_text = NULL;
+
+  /* analyze files */
+  for (lp = files; lp != NULL; lp = lp->next)
+    {
+      if (thunar_file_is_directory (lp->data))
+        {
+          folder_count++;
+        }
+      else
+        {
+          non_folder_count++;
+          if (thunar_file_is_regular (lp->data))
+            size_summary += thunar_file_get_size (lp->data);
+        }
+    }
+
+  if (non_folder_count > 0)
+    {
+      size_string = g_format_size_full (size_summary, G_FORMAT_SIZE_LONG_FORMAT | (show_file_size_binary_format ? G_FORMAT_SIZE_IEC_UNITS : G_FORMAT_SIZE_DEFAULT));
+      non_folder_text = g_strdup_printf (ngettext ("%d file: %s",
+                                                   "%d files: %s",
+                                                   non_folder_count), non_folder_count, size_string);
+      g_free (size_string);
+    }
+
+  if (folder_count > 0)
+    {
+      folder_text = g_strdup_printf (ngettext ("%d folder",
+                                               "%d folders",
+                                               folder_count), folder_count);
+    }
+
+  if (folder_text == NULL)
+    text = non_folder_text;
+  else if (non_folder_text == NULL)
+    text = folder_text;
+  else
+    {
+      /* This is marked for translation in case a localizer
+       * needs to change ", " to something else. The comma
+       * is between the message about the number of folders
+       * and the number of items in the selection */
+      /* TRANSLATORS: string moved from line 2573 to here  */
+      text = g_strdup_printf (_("%s, %s"), folder_text, non_folder_text);
+      g_free (folder_text);
+      g_free (non_folder_text);
+    }
+  return text;
+}
+
+
+
+/**
  * thunar_list_model_get_statusbar_text:
  * @store          : a #ThunarListModel instance.
  * @selected_items : the list of selected items (as GtkTreePath's).
@@ -2338,83 +2414,61 @@ thunar_list_model_get_statusbar_text (ThunarListModel *store,
   GtkTreeIter        iter;
   ThunarFile        *file;
   guint64            size;
-  guint64            size_summary;
-  gint               folder_count;
-  gint               non_folder_count;
   GList             *lp;
   gchar             *absolute_path;
   gchar             *fspace_string;
   gchar             *display_name;
   gchar             *size_string;
   gchar             *text;
-  gchar             *folder_text;
-  gchar             *non_folder_text;
   gchar             *s;
   gint               height;
   gint               width;
   gchar             *description;
   GSequenceIter     *row;
   GSequenceIter     *end;
-  gint               nrows;
   ThunarPreferences *preferences;
   gboolean           show_image_size;
-  gboolean           file_size_binary;
+  gboolean           show_file_size_binary_format;
+  GList             *relevant_files = NULL;
 
   _thunar_return_val_if_fail (THUNAR_IS_LIST_MODEL (store), NULL);
 
-  file_size_binary = thunar_list_model_get_file_size_binary(store);
+  show_file_size_binary_format = thunar_list_model_get_file_size_binary(store);
 
-  if (selected_items == NULL)
+  if (selected_items == NULL) /* nothing selected */
     {
+      /* build a GList of all files */
+      end = g_sequence_get_end_iter (store->rows);
+      for (row = g_sequence_get_begin_iter (store->rows); row != end; row = g_sequence_iter_next (row))
+        {
+          relevant_files = g_list_append (relevant_files, g_sequence_get (row));
+        }
+
       /* try to determine a file for the current folder */
       file = (store->folder != NULL) ? thunar_folder_get_corresponding_file (store->folder) : NULL;
 
-      nrows = g_sequence_get_length (store->rows);
-
       /* check if we can determine the amount of free space for the volume */
       if (G_LIKELY (file != NULL
           && thunar_g_file_get_free_space (thunar_file_get_file (file), &size, NULL)))
         {
-          /* humanize the free space */
-          fspace_string = g_format_size_full (size, file_size_binary ? G_FORMAT_SIZE_IEC_UNITS : G_FORMAT_SIZE_DEFAULT);
-          size_summary = 0;
+          size_string = thunar_list_model_get_statusbar_text_for_files (relevant_files, show_file_size_binary_format);
 
-          row = g_sequence_get_begin_iter (store->rows);
-          end = g_sequence_get_end_iter (store->rows);
-
-          /* calculate the size of all file items */
-          while (row != end)
-            {
-              file = g_sequence_get (row);
-              if (thunar_file_is_regular (file))
-                size_summary += thunar_file_get_size (file);
-              row = g_sequence_iter_next (row);
-            }
+          /* humanize the free space */
+          fspace_string = g_format_size_full (size, show_file_size_binary_format ? G_FORMAT_SIZE_IEC_UNITS : G_FORMAT_SIZE_DEFAULT);
 
-          if (size_summary > 0)
-            {
-              /* generate a text which includes the size of all items in the folder */
-              size_string = g_format_size_full (size_summary, G_FORMAT_SIZE_LONG_FORMAT | (file_size_binary ? G_FORMAT_SIZE_IEC_UNITS : G_FORMAT_SIZE_DEFAULT));
-              text = g_strdup_printf (ngettext ("%d item: %s, Free space: %s", "%d items: %s, Free space: %s", nrows),
-                                      nrows, size_string, fspace_string);
-              g_free (size_string);
-            }
-          else
-            {
-              /* just the standard text */
-              text = g_strdup_printf (ngettext ("%d item, Free space: %s", "%d items, Free space: %s", nrows),
-                                      nrows, fspace_string);
-            }
+          text = g_strdup_printf (_("%s, Free space: %s"), size_string, fspace_string);
 
           /* cleanup */
+          g_free (size_string);
           g_free (fspace_string);
         }
       else
         {
-          text = g_strdup_printf (ngettext ("%d item", "%d items", nrows), nrows);
+          text = thunar_list_model_get_statusbar_text_for_files (relevant_files, show_file_size_binary_format);
         }
+      g_list_free (relevant_files);
     }
-  else if (selected_items->next == NULL)
+  else if (selected_items->next == NULL) /* only one item selected */
     {
       /* resolve the iter for the single path */
       gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, selected_items->data);
@@ -2431,7 +2485,7 @@ thunar_list_model_get_statusbar_text (ThunarListModel *store,
         }
       else if (G_UNLIKELY (thunar_file_is_symlink (file)))
         {
-          size_string = thunar_file_get_size_string_long (file, file_size_binary);
+          size_string = thunar_file_get_size_string_long (file, show_file_size_binary_format);
           text = g_strdup_printf (_("\"%s\": %s link to %s"), thunar_file_get_display_name (file),
                                   size_string, thunar_file_get_symlink_target (file));
           g_free (size_string);
@@ -2447,7 +2501,7 @@ thunar_list_model_get_statusbar_text (ThunarListModel *store,
       else if (thunar_file_is_regular (file))
         {
           description = g_content_type_get_description (content_type);
-          size_string = thunar_file_get_size_string_long (file, file_size_binary);
+          size_string = thunar_file_get_size_string_long (file, show_file_size_binary_format);
           /* I18N, first %s is the display name of the file, 2nd the file size, 3rd the content type */
           text = g_strdup_printf (_("\"%s\": %s %s"), thunar_file_get_display_name (file),
                                   size_string, description);
@@ -2499,81 +2553,19 @@ thunar_list_model_get_statusbar_text (ThunarListModel *store,
             }
         }
     }
-  else
+  else /* more than one item selected */
     {
-      /* reset */
-      size_summary = 0;
-      folder_count = 0;
-      non_folder_count = 0;
-
-      /* analyze selection */
+      /* build GList of files from selection */
       for (lp = selected_items; lp != NULL; lp = lp->next)
         {
           gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, lp->data);
-          file = g_sequence_get (iter.user_data);
-          if (thunar_file_is_directory (file))
-            {
-              folder_count++;
-            }
-          else
-            {
-              non_folder_count++;
-              if (thunar_file_is_regular (file))
-                size_summary += thunar_file_get_size (file);
-            }
-        }
-
-     /* text for the items in the folder */
-     if (non_folder_count > 0)
-        {
-          size_string = g_format_size_full (size_summary, G_FORMAT_SIZE_LONG_FORMAT | (file_size_binary ? G_FORMAT_SIZE_IEC_UNITS : G_FORMAT_SIZE_DEFAULT));
-          if (folder_count > 0)
-            {
-              /* item count if there are also folders in the selection */
-              non_folder_text = g_strdup_printf (ngettext ("%d other item selected: %s",
-                                                           "%d other items selected: %s",
-                                                           non_folder_count), non_folder_count, size_string);
-            }
-          else
-            {
-              /* only non-folders are selected */
-              non_folder_text = g_strdup_printf (ngettext ("%d item selected: %s",
-                                                           "%d items selected: %s",
-                                                           non_folder_count), non_folder_count, size_string);
-            }
-          g_free (size_string);
-        }
-      else
-        {
-          non_folder_text = NULL;
-        }
-
-      /* text for the folders */
-      if (folder_count > 0)
-        {
-          folder_text = g_strdup_printf (ngettext ("%d folder selected",
-                                                   "%d folders selected",
-                                                   folder_count), folder_count);
-        }
-      else
-        {
-          folder_text = NULL;
-        }
-
-      if (folder_text == NULL)
-        text = non_folder_text;
-      else if (non_folder_text == NULL)
-        text = folder_text;
-      else
-        {
-          /* This is marked for translation in case a localizer
-           * needs to change ", " to something else. The comma
-           * is between the message about the number of folders
-           * and the number of items in the selection */
-          text = g_strdup_printf (_("%s, %s"), folder_text, non_folder_text);
-          g_free (folder_text);
-          g_free (non_folder_text);
+          relevant_files = g_list_append (relevant_files, g_sequence_get (iter.user_data));
         }
+        
+      size_string = thunar_list_model_get_statusbar_text_for_files (relevant_files, show_file_size_binary_format);
+      text = g_strdup_printf (_("Selection: %s"), size_string);
+      g_free (size_string);
+      g_list_free (relevant_files);
     }
 
   return text;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list