Trying to automatically expand to the initial folder

This commit is contained in:
Pierre Pronchery 2011-08-03 21:58:41 +00:00
parent be1b603c01
commit f0035040b6
5 changed files with 69 additions and 23 deletions

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Browser 0.1.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-03 22:44+0200\n"
"POT-Creation-Date: 2011-08-03 23:52+0200\n"
"PO-Revision-Date: 2010-03-29 23:28+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: English\n"
@ -768,7 +768,7 @@ msgstr ""
msgid "Command exited with signal %d"
msgstr ""
#: ../src/plugins/dirtree.c:61
#: ../src/plugins/dirtree.c:63
msgid "Directory tree"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Browser 0.1.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-03 22:44+0200\n"
"POT-Creation-Date: 2011-08-03 23:52+0200\n"
"PO-Revision-Date: 2010-03-30 01:04+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: Spanish\n"
@ -768,7 +768,7 @@ msgstr ""
msgid "Command exited with signal %d"
msgstr ""
#: ../src/plugins/dirtree.c:61
#: ../src/plugins/dirtree.c:63
msgid "Directory tree"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Browser 0.1.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-03 22:44+0200\n"
"POT-Creation-Date: 2011-08-03 23:52+0200\n"
"PO-Revision-Date: 2010-03-29 23:28+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: French\n"
@ -802,7 +802,7 @@ msgstr "La commande a terminé avec le code d'erreur %d"
msgid "Command exited with signal %d"
msgstr "La commande a été terminée par le signal %d"
#: ../src/plugins/dirtree.c:61
#: ../src/plugins/dirtree.c:63
msgid "Directory tree"
msgstr "Arborescence"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Browser 0.1.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-03 22:44+0200\n"
"POT-Creation-Date: 2011-08-03 23:52+0200\n"
"PO-Revision-Date: 2010-04-07 23:18+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: Italian\n"
@ -768,7 +768,7 @@ msgstr ""
msgid "Command exited with signal %d"
msgstr ""
#: ../src/plugins/dirtree.c:61
#: ../src/plugins/dirtree.c:63
msgid "Directory tree"
msgstr ""

View File

@ -41,9 +41,11 @@ typedef struct _Dirtree
/* prototypes */
static GtkWidget * _dirtree_init(BrowserPlugin * plugin);
static void _dirtree_destroy(BrowserPlugin * plugin);
static void _dirtree_refresh(BrowserPlugin * plugin, char const * path);
static void _dirtree_refresh_folder(BrowserPlugin * plugin,
GtkTreeIter * parent, char const * path, gboolean recurse);
static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
GtkTreeIter * parent, char const * path, char const * basename,
gboolean recurse);
/* callbacks */
static gboolean _dirtree_on_idle(gpointer data);
@ -62,7 +64,7 @@ BrowserPlugin plugin =
"stock_folder",
_dirtree_init,
_dirtree_destroy,
NULL,
_dirtree_refresh,
NULL
};
@ -154,10 +156,50 @@ static void _dirtree_destroy(BrowserPlugin * plugin)
}
/* dirtree_refresh_folder */
static void _dirtree_refresh_folder(BrowserPlugin * plugin,
GtkTreeIter * parent, char const * path, gboolean recurse)
/* dirtree_refresh */
static void _dirtree_refresh(BrowserPlugin * plugin, char const * path)
{
Dirtree * dirtree = plugin->priv;
GtkTreeModel * model = GTK_TREE_MODEL(dirtree->store);
GtkTreeIter iter;
char * p;
gboolean valid;
size_t i;
size_t j;
char c;
/* only take care of the tree if this is the first invocation */
if(dirtree->source == 0 || path == NULL || (p = strdup(path)) == NULL)
return;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, path);
#endif
g_source_remove(dirtree->source);
dirtree->source = 0;
valid = gtk_tree_model_iter_children(model, &iter, NULL);
for(i = 0; valid == TRUE && p[i] != '\0'; i++)
{
if(p[i] != '/')
continue;
p[i] = '\0';
for(j = i + 1; p[j] != '\0' && p[j] != '/'; j++);
c = p[j];
p[j] = '\0';
valid = _dirtree_refresh_folder(plugin, &iter, (i == 0)
? "/" : p, &p[i + 1], FALSE);
p[i] = '/';
p[j] = c;
}
free(p);
}
/* dirtree_refresh_folder */
static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
GtkTreeIter * parent, char const * path, char const * basename,
gboolean recurse)
{
gboolean ret = FALSE;
Dirtree * dirtree = plugin->priv;
DIR * dir;
struct dirent * de;
@ -169,8 +211,8 @@ static void _dirtree_refresh_folder(BrowserPlugin * plugin,
gboolean b;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(parent, \"%s\", %s)\n", __func__, path,
recurse ? "TRUE" : "FALSE");
fprintf(stderr, "DEBUG: %s(parent, \"%s\", \"%s\", %s)\n", __func__,
path, basename, recurse ? "TRUE" : "FALSE");
#endif
/* consider all the current nodes obsolete */
for(valid = gtk_tree_model_iter_children(model, &iter, parent);
@ -178,29 +220,32 @@ static void _dirtree_refresh_folder(BrowserPlugin * plugin,
valid = gtk_tree_model_iter_next(model, &iter))
gtk_tree_store_set(dirtree->store, &iter, 3, FALSE, -1);
if((dir = opendir(path)) == NULL)
return;
return FALSE;
if(strcmp(path, "/") == 0) /* XXX hack */
path = "";
while((de = readdir(dir)) != NULL)
{
/* skip hidden folders except if we traverse it */
if(de->d_name[0] == '.')
if(basename != NULL && strcmp(de->d_name, basename) == 0)
ret = TRUE;
else if(de->d_name[0] == '.')
continue;
if(de->d_type != DT_DIR) /* XXX d_type is not portable */
else if(de->d_type != DT_DIR) /* XXX d_type is not portable */
continue;
q = string_new_append(path, "/", de->d_name, NULL);
/* FIXME check if the node already exists */
r = (q != NULL) ? g_filename_display_basename(q) : NULL;
gtk_tree_store_insert(dirtree->store, &iter, parent, -1);
gtk_tree_store_set(dirtree->store, &iter, 0, dirtree->folder,
1, (r != NULL) ? r : de->d_name, 2, q, 3, TRUE,
-1);
if(recurse)
_dirtree_refresh_folder(plugin, &iter, q, FALSE);
_dirtree_refresh_folder(plugin, &iter, q, NULL, FALSE);
g_free(r);
string_delete(q);
}
closedir(dir);
/* move all of the obsolete nodes */
/* remove all the obsolete nodes */
for(valid = gtk_tree_model_iter_children(model, &iter, parent);
valid == TRUE;)
{
@ -208,6 +253,7 @@ static void _dirtree_refresh_folder(BrowserPlugin * plugin,
valid = b ? gtk_tree_model_iter_next(model, &iter)
: gtk_tree_store_remove(dirtree->store, &iter);
}
return ret;
}
@ -222,7 +268,7 @@ static gboolean _dirtree_on_idle(gpointer data)
dirtree->source = 0;
gtk_tree_model_iter_children(model, &iter, NULL);
_dirtree_refresh_folder(plugin, &iter, "/", TRUE);
_dirtree_refresh_folder(plugin, &iter, "/", NULL, TRUE);
return FALSE;
}
@ -257,6 +303,6 @@ static void _dirtree_on_row_expanded(GtkTreeView * view, GtkTreeIter * iter,
gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(
dirtree->sorted), &child, iter);
gtk_tree_model_get(model, &child, 2, &p, -1);
_dirtree_refresh_folder(plugin, &child, p, TRUE);
_dirtree_refresh_folder(plugin, &child, p, NULL, TRUE);
g_free(p);
}