#include "folderutils.h"
#include "partial_download.h"
#include "prefs_folder_column.h"
+#include "filtering.h"
#define COL_FOLDER_WIDTH 150
#define COL_NUM_WIDTH 32
gtk_clist_freeze(GTK_CLIST(ctree));
text[col_pos[F_COL_FOLDER]] = item->name;
- child = gtk_ctree_insert_node
+ child = gtk_sctree_insert_node
(ctree, node, NULL, text,
FOLDER_SPACING,
folderxpm, folderxpmmask,
return folderview_have_matching_children_sub(folderview, item, FALSE);
}
+static gboolean folderview_have_marked_children_sub(FolderView *folderview,
+ FolderItem *item,
+ gboolean in_sub)
+{
+ GNode *node = NULL;
+
+ if (!item || !item->folder || !item->folder->node)
+ return FALSE;
+
+ node = item->folder->node;
+
+ node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
+ node = node->children;
+
+ if (item->marked_msgs != 0) {
+ return TRUE;
+ }
+
+ while (node != NULL) {
+ if (node && node->data) {
+ FolderItem *next_item = (FolderItem*) node->data;
+ node = node->next;
+ if (folderview_have_marked_children_sub(folderview,
+ next_item, TRUE))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean folderview_have_marked_children(FolderView *folderview,
+ FolderItem *item)
+{
+ return folderview_have_marked_children_sub(folderview, item, FALSE);
+}
+
static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
{
GtkCTree *ctree = GTK_CTREE(folderview->ctree);
item = gtk_ctree_node_get_row_data(ctree, node);
g_return_if_fail(item != NULL);
- mark = (item->marked_msgs != 0);
+ if (!GTK_CTREE_ROW(node)->expanded)
+ mark = folderview_have_marked_children(folderview, item);
+ else
+ mark = (item->marked_msgs != 0);
stype = item->stype;
if (stype == F_NORMAL) {
prefs_common.display_folder_unread) {
str = g_strdup_printf("%s (%d%s)", name, item->total_msgs,
add_unread_mark ? "+" : "");
- gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+ gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
xpm, mask, openxpm, openmask,
FALSE, GTK_CTREE_ROW(node)->expanded);
g_free(str);
item->unreadmarked_msgs > 0 ? "!":"");
else
str = g_strdup_printf("%s (+)", name);
- gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+ gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
xpm, mask, openxpm, openmask,
FALSE, GTK_CTREE_ROW(node)->expanded);
g_free(str);
str = g_strdup_printf("%s%s", name,
item->unreadmarked_msgs > 0 ? " (!)":"");
- gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+ gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
xpm, mask, openxpm, openmask,
FALSE, GTK_CTREE_ROW(node)->expanded);
g_free(str);
gtk_clist_thaw(GTK_CLIST(folderview->summaryview->ctree));
}
-gboolean folderview_process_open(gpointer data)
+void folderview_process_open(FolderView *folderview, FolderItem *item)
+{
+ if (!item)
+ return;
+
+ folder_item_update_freeze();
+ folder_item_process_open(item,
+ summary_freeze_for_proc,
+ summary_thaw_for_proc,
+ folderview);
+ folder_item_update_thaw();
+
+ return;
+}
+
+#if 0
+gboolean folderview_process_open_cb(gpointer data)
{
FolderView *folderview = (FolderView *)data;
FolderItem *item = NULL;
if (!item)
return FALSE;
- folder_item_update_freeze();
- folder_item_process_open(item,
- summary_freeze_for_proc,
- summary_thaw_for_proc,
- folderview);
- folder_item_update_thaw();
+ folderview_process_open(folderview, item);
return FALSE;
}
+#endif
static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
gint column, FolderView *folderview)
return;
}
+ folderview_process_open(folderview, item);
main_window_cursor_normal(folderview->mainwin);
gtk_ctree_node_moveto(ctree, row, -1, 0.5, 0);
}
- g_timeout_add(0, folderview_process_open, folderview);
-
STATUSBAR_POP(folderview->mainwin);
folderview->open_folder = FALSE;
gtk_clist_freeze(GTK_CLIST(ctree));
text[col_pos[F_COL_FOLDER]] = item->name;
- node = gtk_ctree_insert_node(ctree, parent_node, NULL, text,
+ node = gtk_sctree_insert_node(ctree, parent_node, NULL, text,
FOLDER_SPACING,
folderxpm, folderxpmmask,
folderopenxpm, folderopenxpmmask,
void folderview_reflect_prefs(void)
{
+ static gchar *last_font = NULL;
+ gboolean update_font = TRUE;
FolderView *folderview = mainwindow_get_mainwindow()->folderview;
- FolderItem *item = folderview_get_selected_item(folderview);
- normal_style = normal_color_style = bold_style =
- bold_color_style = bold_tgtfold_style = NULL;
+ FolderItem *item = folderview_get_selected_item(folderview);
+ GtkAdjustment *pos = gtk_scrolled_window_get_vadjustment(
+ GTK_SCROLLED_WINDOW(folderview->scrolledwin));
+ gint height = pos->value;
+
+ if (last_font && !strcmp(last_font, NORMAL_FONT))
+ update_font = FALSE;
+
+ if (last_font)
+ g_free(last_font);
+
+ last_font = g_strdup(NORMAL_FONT);
+
+ if (update_font) {
+ normal_style = normal_color_style = bold_style =
+ bold_color_style = bold_tgtfold_style = NULL;
- folderview_init(folderview);
+ folderview_init(folderview);
+ }
+ gtk_clist_freeze(GTK_CLIST(folderview->ctree));
folderview_column_set_titles(folderview);
folderview_set_all();
+
+ g_signal_handlers_block_by_func
+ (G_OBJECT(folderview->ctree),
+ G_CALLBACK(folderview_selected), folderview);
+
if (item)
folderview_select(folderview, item);
+
+ g_signal_handlers_unblock_by_func
+ (G_OBJECT(folderview->ctree),
+ G_CALLBACK(folderview_selected), folderview);
+
+ pos = gtk_scrolled_window_get_vadjustment(
+ GTK_SCROLLED_WINDOW(folderview->scrolledwin));
+ gtk_adjustment_set_value(pos, height);
+ gtk_clist_thaw(GTK_CLIST(folderview->ctree));
}
static void drag_state_stop(FolderView *folderview)