From 430559c25573eb2558384441c5789387c48a6aea Mon Sep 17 00:00:00 2001 From: Alfons Hoogervorst Date: Tue, 10 Jul 2001 16:14:23 +0000 Subject: [PATCH] add persistence for collapsed / expanded folder trees --- ChangeLog.claws | 10 +++++++++- src/folder.c | 28 +++++++++++++++++++++++++++- src/folder.h | 6 ++++-- src/folderview.c | 27 +++++++++++++++++++++++++-- 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/ChangeLog.claws b/ChangeLog.claws index 742f0da73..980e6973c 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -1,3 +1,11 @@ +2001-07-10 [alfons] + + * folder.[ch] + folderview.c + make collapse state of folders and folder items persistent, i.e. + if you collapse a folder tree, the next time sylpheed-claws starts + up the folder tree remains collapsed. + 2001-07-10 [christoph] * acconfig.h @@ -33,7 +41,7 @@ * src/prefs_common.[ch] src/compose.c - add experimental option "smart wrapping" which make the + add experimental option "smart wrapping" which makes the compose editor auto wrap. | TODO: the problem with the buggy cursor handling is caused | diff --git a/src/folder.c b/src/folder.c index b1934073b..ae93c2ff3 100644 --- a/src/folder.c +++ b/src/folder.c @@ -153,6 +153,7 @@ FolderItem *folder_item_new(const gchar *name, const gchar *path) item->last_num = -1; item->no_sub = FALSE; item->no_select = FALSE; + item->collapsed = FALSE; /* default is open */ item->parent = NULL; item->folder = NULL; item->data = NULL; @@ -1050,7 +1051,7 @@ static gboolean folder_build_tree(GNode *node, gpointer data) const gchar *name = NULL; const gchar *path = NULL; PrefsAccount *account = NULL; - gboolean no_sub = FALSE, no_select = FALSE; + gboolean no_sub = FALSE, no_select = FALSE, collapsed = FALSE; gint mtime = 0, new = 0, unread = 0, total = 0; g_return_val_if_fail(node->data != NULL, FALSE); @@ -1100,6 +1101,8 @@ static gboolean folder_build_tree(GNode *node, gpointer data) no_sub = *attr->value == '1' ? TRUE : FALSE; else if (!strcmp(attr->name, "no_select")) no_select = *attr->value == '1' ? TRUE : FALSE; + else if (!strcmp(attr->name, "collapsed")) + collapsed = *attr->value == '1' ? TRUE : FALSE; } item = folder_item_new(name, path); @@ -1111,6 +1114,7 @@ static gboolean folder_build_tree(GNode *node, gpointer data) item->total = total; item->no_sub = no_sub; item->no_select = no_select; + item->collapsed = collapsed; item->parent = FOLDER_ITEM(node->parent->data); item->folder = folder; switch (stype) { @@ -1140,6 +1144,7 @@ static gboolean folder_read_folder_func(GNode *node, gpointer data) const gchar *name = NULL; const gchar *path = NULL; PrefsAccount *account = NULL; + gboolean collapsed = FALSE; if (g_node_depth(node) != 2) return FALSE; g_return_val_if_fail(node->data != NULL, FALSE); @@ -1175,6 +1180,9 @@ static gboolean folder_read_folder_func(GNode *node, gpointer data) if (!account) g_warning("account_id: %s not found\n", attr->value); } + else if (!strcmp(attr->name, "collapsed")) { + collapsed = *(attr->value) == '1' ? 1 : 0; + } } folder = folder_new(type, name, path); @@ -1182,14 +1190,23 @@ static gboolean folder_read_folder_func(GNode *node, gpointer data) folder->account = account; if (account && (type == F_IMAP || type == F_NEWS)) account->folder = REMOTE_FOLDER(folder); + node->data = folder->node->data; g_node_destroy(folder->node); folder->node = node; + folder_add(folder); g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, folder_build_tree, folder); + /* ALFONS_NOTE: after a folder_new() the folder system also created a + * FolderItem for the folder (which makes insertion in the GtkCTree + * easier because it deals with FolderItems only). put the collapsed + * state for this Folder in its associated FolderItem */ + + FOLDER_ITEM((folder->node->data))->collapsed = collapsed; + return FALSE; } @@ -1237,6 +1254,13 @@ static void folder_write_list_recursive(GNode *node, gpointer data) if (folder->account) fprintf(fp, " account_id=\"%d\"", folder->account->account_id); + + /* ALFONS_NOTE: for each Folder structure, also a FolderItem is created; + * this is very clever, but undocumented. (it is clever because the + * folderview's GtkCTree only deals with FolderItems.) */ + if (item->collapsed ) + fprintf(fp, " collapsed=\"1\""); + } else { fprintf(fp, "stype]); @@ -1257,6 +1281,8 @@ static void folder_write_list_recursive(GNode *node, gpointer data) fputs(" no_sub=\"1\"", fp); if (item->no_select) fputs(" no_select=\"1\"", fp); + if (item->collapsed) + fputs(" collapsed=\"1\"", fp); fprintf(fp, " mtime=\"%ld\" new=\"%d\" unread=\"%d\" total=\"%d\"", item->mtime, item->new, item->unread, item->total); diff --git a/src/folder.h b/src/folder.h index 306d33ed5..deb19dee9 100644 --- a/src/folder.h +++ b/src/folder.h @@ -211,8 +211,10 @@ struct _FolderItem gint last_num; - gboolean no_sub; - gboolean no_select; + /* special flags */ + guint no_sub : 1; /* no childs allowed? */ + guint no_select : 1; /* not selectable? */ + guint collapsed : 1; /* collapsed item */ FolderItem *parent; diff --git a/src/folderview.c b/src/folderview.c index d1b738ca4..7ad83cbf1 100644 --- a/src/folderview.c +++ b/src/folderview.c @@ -976,8 +976,23 @@ static gboolean folderview_gnode_func(GtkCTree *ctree, guint depth, static void folderview_expand_func(GtkCTree *ctree, GtkCTreeNode *node, gpointer data) { - if (GTK_CTREE_ROW(node)->children) - gtk_ctree_expand(ctree, node); + /* NOTE: data should by FolderView pointer */ + if (GTK_CTREE_ROW(node)->children) { + FolderItem *item = gtk_ctree_node_get_row_data(ctree, node); + FolderView *view = (FolderView *) data; + g_return_if_fail(item != NULL); + g_return_if_fail(view); + + if (!item->collapsed) { + gtk_ctree_expand(ctree, node); + } + else { + /* if it is collapsed we should update the node, + * in case one of the children contains unread + * messages or other visible state things */ + folderview_update_node(view, node); + } + } } #define SET_SPECIAL_FOLDER(ctree, item) \ @@ -1358,12 +1373,20 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row, static void folderview_tree_expanded(GtkCTree *ctree, GtkCTreeNode *node, FolderView *folderview) { + FolderItem *item = gtk_ctree_node_get_row_data(ctree, node); + + g_return_if_fail(item); + item->collapsed = FALSE; folderview_update_node(folderview, node); } static void folderview_tree_collapsed(GtkCTree *ctree, GtkCTreeNode *node, FolderView *folderview) { + FolderItem *item = gtk_ctree_node_get_row_data(ctree, node); + + g_return_if_fail(item); + item->collapsed = TRUE; folderview_update_node(folderview, node); } -- 2.25.1