Fix hidden directories not showing in a tree view
authorMaciej S. Szmigiero <mail@maciej.szmigiero.name>
Sat, 9 Jul 2016 16:57:08 +0000 (18:57 +0200)
committerMaciej S. Szmigiero <mail@maciej.szmigiero.name>
Sat, 9 Jul 2016 16:57:08 +0000 (18:57 +0200)
Directory tree view contains code that when "Show hidden files or folders"
option is not enabled but the user enters a path containing hidden
directories the missing tree entries are added automatically.

This didn't work (at least) in case when the first hidden directory in
newly selected path was in a current directory because the tree populating
function exited early when directory contents did not change since last
run, before checking for this special case.

Fix this by skipping this check when we have to add such hidden directory
entry.

This check must also be skipped when 'force' flag is passed to this
function, otherwise when enabling "Show hidden files or folders" option
the missing directories are not added to the tree until Geeqie is
restarted.

Signed-off-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
src/view_dir_tree.c

index ae7367c..a90a9db 100644 (file)
@@ -440,6 +440,7 @@ gboolean vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean f
        time_t current_time;
        GtkTreeIter child;
        NodeData *nd;
+       gboolean add_hidden = FALSE;
 
        store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
        gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
@@ -464,13 +465,8 @@ gboolean vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean f
                        return TRUE;
                        }
                file_data_check_changed_files(nd->fd); /* make sure we have recent info */
-               if (nd->fd->version == nd->version) return TRUE;
                }
 
-       vdtree_busy_push(vd);
-
-       filelist_read(nd->fd, NULL, &list);
-
        /* when hidden files are not enabled, and the user enters a hidden path,
         * allow the tree to display that path by specifically inserting the hidden entries
         */
@@ -482,21 +478,32 @@ gboolean vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean f
 
                n = strlen(nd->fd->path);
                if (target_fd->path[n] == G_DIR_SEPARATOR && target_fd->path[n+1] == '.')
-                       {
-                       gchar *name8;
+                       add_hidden = TRUE;
+               }
 
-                       n++;
+       if (nd->expanded && (!force && !add_hidden) && nd->fd->version == nd->version)
+               return TRUE;
 
-                       while (target_fd->path[n] != '\0' && target_fd->path[n] != G_DIR_SEPARATOR) n++;
-                       name8 = g_strndup(target_fd->path, n);
+       vdtree_busy_push(vd);
 
-                       if (isdir(name8))
-                               {
-                               list = g_list_prepend(list, file_data_new_dir(name8));
-                               }
+       filelist_read(nd->fd, NULL, &list);
+
+       if (add_hidden)
+               {
+               gint n;
+               gchar *name8;
 
-                       g_free(name8);
+               n = strlen(nd->fd->path) + 1;
+
+               while (target_fd->path[n] != '\0' && target_fd->path[n] != G_DIR_SEPARATOR) n++;
+               name8 = g_strndup(target_fd->path, n);
+
+               if (isdir(name8))
+                       {
+                       list = g_list_prepend(list, file_data_new_dir(name8));
                        }
+
+               g_free(name8);
                }
 
        old = NULL;