From f0035040b604b177628989e31fdf25154022f9ad Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Wed, 3 Aug 2011 21:58:41 +0000 Subject: [PATCH] Trying to automatically expand to the initial folder --- po/de.po | 4 +-- po/es.po | 4 +-- po/fr.po | 4 +-- po/it.po | 4 +-- src/plugins/dirtree.c | 76 ++++++++++++++++++++++++++++++++++--------- 5 files changed, 69 insertions(+), 23 deletions(-) diff --git a/po/de.po b/po/de.po index d1b3c79..6535c87 100644 --- a/po/de.po +++ b/po/de.po @@ -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 \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 "" diff --git a/po/es.po b/po/es.po index a497e21..ceec0de 100644 --- a/po/es.po +++ b/po/es.po @@ -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 \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 "" diff --git a/po/fr.po b/po/fr.po index 4ae0bbe..7a095a5 100644 --- a/po/fr.po +++ b/po/fr.po @@ -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 \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" diff --git a/po/it.po b/po/it.po index b6b4723..55ea488 100644 --- a/po/it.po +++ b/po/it.po @@ -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 \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 "" diff --git a/src/plugins/dirtree.c b/src/plugins/dirtree.c index 09a7d7b..4212655 100644 --- a/src/plugins/dirtree.c +++ b/src/plugins/dirtree.c @@ -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); }