Recurse folders upon initialization as well

This commit is contained in:
Pierre Pronchery 2011-08-04 10:29:06 +00:00
parent a04d5efbb0
commit 4215db3c3d

View File

@ -190,7 +190,7 @@ static void _dirtree_refresh(BrowserPlugin * plugin, char const * path)
c = p[j]; c = p[j];
p[j] = '\0'; p[j] = '\0';
valid = _dirtree_refresh_folder(plugin, &iter, (i == 0) valid = _dirtree_refresh_folder(plugin, &iter, (i == 0)
? "/" : p, &p[i + 1], FALSE); ? "/" : p, &p[i + 1], TRUE);
p[i] = '/'; p[i] = '/';
p[j] = c; p[j] = c;
} }
@ -221,7 +221,8 @@ static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
struct dirent * de; struct dirent * de;
GtkTreeModel * model = GTK_TREE_MODEL(dirtree->store); GtkTreeModel * model = GTK_TREE_MODEL(dirtree->store);
GtkTreeIter iter; GtkTreeIter iter;
GtkTreePath * s = NULL; GtkTreePath * s;
GtkTreeRowReference * t = NULL;
gboolean valid; gboolean valid;
String * q; String * q;
gchar * r; gchar * r;
@ -247,7 +248,8 @@ static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
ret = TRUE; ret = TRUE;
else if(de->d_name[0] == '.') else if(de->d_name[0] == '.')
continue; continue;
else if(de->d_type != DT_DIR) /* XXX d_type is not portable */ /* XXX d_type is not portable */
else if(de->d_type != DT_DIR && de->d_type != DT_LNK)
continue; continue;
q = string_new_append(path, "/", de->d_name, NULL); q = string_new_append(path, "/", de->d_name, NULL);
/* FIXME check if the node already exists */ /* FIXME check if the node already exists */
@ -257,26 +259,30 @@ static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
1, (r != NULL) ? r : de->d_name, 2, q, 3, TRUE, 1, (r != NULL) ? r : de->d_name, 2, q, 3, TRUE,
-1); -1);
if(recurse) if(recurse)
_dirtree_refresh_folder(plugin, &iter, q, NULL, FALSE); _dirtree_refresh_folder(plugin, &iter, q, NULL,
(basename != NULL) ? TRUE : FALSE);
g_free(r); g_free(r);
string_delete(q); string_delete(q);
if(ret == TRUE && strcmp(de->d_name, basename) == 0) if(ret == TRUE && strcmp(de->d_name, basename) == 0)
{
s = gtk_tree_model_get_path(model, &iter); s = gtk_tree_model_get_path(model, &iter);
t = gtk_tree_row_reference_new(model, s);
gtk_tree_path_free(s);
}
} }
closedir(dir); closedir(dir);
/* remove all the obsolete nodes */ /* remove all the obsolete nodes */
for(valid = gtk_tree_model_iter_children(model, &iter, parent); for(valid = gtk_tree_model_iter_children(model, &iter, parent);
valid == TRUE;) valid == TRUE; valid = (b == TRUE)
{ ? gtk_tree_model_iter_next(model, &iter)
: gtk_tree_store_remove(dirtree->store, &iter))
gtk_tree_model_get(model, &iter, 3, &b, -1); gtk_tree_model_get(model, &iter, 3, &b, -1);
valid = b ? gtk_tree_model_iter_next(model, &iter)
: gtk_tree_store_remove(dirtree->store, &iter);
}
/* return the parent if appropriate */ /* return the parent if appropriate */
if(s != NULL) if(t != NULL)
{ {
s = gtk_tree_row_reference_get_path(t);
gtk_tree_model_get_iter(model, parent, s); gtk_tree_model_get_iter(model, parent, s);
gtk_tree_path_free(s); gtk_tree_row_reference_free(t);
} }
return ret; return ret;
} }