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

View File

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

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Browser 0.1.4\n" "Project-Id-Version: Browser 0.1.4\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2010-03-29 23:28+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n" "Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: French\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" msgid "Command exited with signal %d"
msgstr "La commande a été terminée par le 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" msgid "Directory tree"
msgstr "Arborescence" msgstr "Arborescence"

View File

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

View File

@ -41,9 +41,11 @@ typedef struct _Dirtree
/* prototypes */ /* prototypes */
static GtkWidget * _dirtree_init(BrowserPlugin * plugin); static GtkWidget * _dirtree_init(BrowserPlugin * plugin);
static void _dirtree_destroy(BrowserPlugin * plugin); static void _dirtree_destroy(BrowserPlugin * plugin);
static void _dirtree_refresh(BrowserPlugin * plugin, char const * path);
static void _dirtree_refresh_folder(BrowserPlugin * plugin, static gboolean _dirtree_refresh_folder(BrowserPlugin * plugin,
GtkTreeIter * parent, char const * path, gboolean recurse); GtkTreeIter * parent, char const * path, char const * basename,
gboolean recurse);
/* callbacks */ /* callbacks */
static gboolean _dirtree_on_idle(gpointer data); static gboolean _dirtree_on_idle(gpointer data);
@ -62,7 +64,7 @@ BrowserPlugin plugin =
"stock_folder", "stock_folder",
_dirtree_init, _dirtree_init,
_dirtree_destroy, _dirtree_destroy,
NULL, _dirtree_refresh,
NULL NULL
}; };
@ -154,10 +156,50 @@ static void _dirtree_destroy(BrowserPlugin * plugin)
} }
/* dirtree_refresh_folder */ /* dirtree_refresh */
static void _dirtree_refresh_folder(BrowserPlugin * plugin, static void _dirtree_refresh(BrowserPlugin * plugin, char const * path)
GtkTreeIter * parent, char const * path, gboolean recurse)
{ {
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; Dirtree * dirtree = plugin->priv;
DIR * dir; DIR * dir;
struct dirent * de; struct dirent * de;
@ -169,8 +211,8 @@ static void _dirtree_refresh_folder(BrowserPlugin * plugin,
gboolean b; gboolean b;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(parent, \"%s\", %s)\n", __func__, path, fprintf(stderr, "DEBUG: %s(parent, \"%s\", \"%s\", %s)\n", __func__,
recurse ? "TRUE" : "FALSE"); path, basename, recurse ? "TRUE" : "FALSE");
#endif #endif
/* consider all the current nodes obsolete */ /* consider all the current nodes obsolete */
for(valid = gtk_tree_model_iter_children(model, &iter, parent); 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)) valid = gtk_tree_model_iter_next(model, &iter))
gtk_tree_store_set(dirtree->store, &iter, 3, FALSE, -1); gtk_tree_store_set(dirtree->store, &iter, 3, FALSE, -1);
if((dir = opendir(path)) == NULL) if((dir = opendir(path)) == NULL)
return; return FALSE;
if(strcmp(path, "/") == 0) /* XXX hack */ if(strcmp(path, "/") == 0) /* XXX hack */
path = ""; path = "";
while((de = readdir(dir)) != NULL) while((de = readdir(dir)) != NULL)
{ {
/* skip hidden folders except if we traverse it */ /* 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; 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; 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 */
r = (q != NULL) ? g_filename_display_basename(q) : NULL; r = (q != NULL) ? g_filename_display_basename(q) : NULL;
gtk_tree_store_insert(dirtree->store, &iter, parent, -1); gtk_tree_store_insert(dirtree->store, &iter, parent, -1);
gtk_tree_store_set(dirtree->store, &iter, 0, dirtree->folder, gtk_tree_store_set(dirtree->store, &iter, 0, dirtree->folder,
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, FALSE); _dirtree_refresh_folder(plugin, &iter, q, NULL, FALSE);
g_free(r); g_free(r);
string_delete(q); string_delete(q);
} }
closedir(dir); closedir(dir);
/* move all of 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;)
{ {
@ -208,6 +253,7 @@ static void _dirtree_refresh_folder(BrowserPlugin * plugin,
valid = b ? gtk_tree_model_iter_next(model, &iter) valid = b ? gtk_tree_model_iter_next(model, &iter)
: gtk_tree_store_remove(dirtree->store, &iter); : gtk_tree_store_remove(dirtree->store, &iter);
} }
return ret;
} }
@ -222,7 +268,7 @@ static gboolean _dirtree_on_idle(gpointer data)
dirtree->source = 0; dirtree->source = 0;
gtk_tree_model_iter_children(model, &iter, NULL); gtk_tree_model_iter_children(model, &iter, NULL);
_dirtree_refresh_folder(plugin, &iter, "/", TRUE); _dirtree_refresh_folder(plugin, &iter, "/", NULL, TRUE);
return FALSE; 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( gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(
dirtree->sorted), &child, iter); dirtree->sorted), &child, iter);
gtk_tree_model_get(model, &child, 2, &p, -1); 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); g_free(p);
} }