From 99a8803e962701d0b9b43d0421cdc0bb05e8f02a Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 21 Dec 2005 10:17:43 +0000 Subject: reflect flag changes on virtual folders in the real ones. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@850 ee746299-78ed-0310-b773-934348b2243d --- src/compose.c | 6 ++++-- src/summaryview.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/summaryview.h | 2 ++ 3 files changed, 60 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/compose.c b/src/compose.c index b1d12dcc..2e77a6df 100644 --- a/src/compose.c +++ b/src/compose.c @@ -769,7 +769,8 @@ void compose_reply(MsgInfo *msginfo, FolderItem *item, ComposeMode mode, MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED); MSG_SET_PERM_FLAGS(msginfo->flags, MSG_REPLIED); MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); - msginfo->folder->mark_dirty = TRUE; + if (item) + item->mark_dirty = TRUE; if (MSG_IS_IMAP(msginfo->flags)) imap_msg_set_perm_flags(msginfo, MSG_REPLIED); @@ -861,7 +862,8 @@ void compose_forward(GSList *mlist, FolderItem *item, gboolean as_attach, MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_REPLIED); MSG_SET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED); MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); - msginfo->folder->mark_dirty = TRUE; + if (item) + item->mark_dirty = TRUE; } msginfo = (MsgInfo *)mlist->data; if (MSG_IS_IMAP(msginfo->flags)) diff --git a/src/summaryview.c b/src/summaryview.c index 39940ce1..eb11dc92 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -918,7 +918,6 @@ GSList *summary_get_selected_msg_list(SummaryView *summaryview) rows = summary_get_selected_rows(summaryview); for (cur = rows; cur != NULL; cur = cur->next) { - msginfo = NULL; gtk_tree_model_get_iter(model, &iter, (GtkTreePath *)cur->data); gtk_tree_model_get(model, &iter, S_COL_MSG_INFO, &msginfo, -1); mlist = g_slist_prepend(mlist, msginfo); @@ -929,6 +928,26 @@ GSList *summary_get_selected_msg_list(SummaryView *summaryview) return mlist; } +GSList *summary_get_changed_msg_list(SummaryView *summaryview) +{ + GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store); + GtkTreeIter iter; + GSList *mlist = NULL; + MsgInfo *msginfo; + gboolean valid; + + valid = gtk_tree_model_get_iter_first(model, &iter); + + while (valid) { + gtk_tree_model_get(model, &iter, S_COL_MSG_INFO, &msginfo, -1); + if (MSG_IS_FLAG_CHANGED(msginfo->flags)) + mlist = g_slist_prepend(mlist, msginfo); + valid = gtkut_tree_model_next(model, &iter); + } + + return g_slist_reverse(mlist); +} + GSList *summary_get_msg_list(SummaryView *summaryview) { GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store); @@ -2142,7 +2161,7 @@ gint summary_write_cache(SummaryView *summaryview) } else fps.cache_fp = NULL; - if (item->mark_dirty) { + if (item->mark_dirty && item->stype != F_VIRTUAL) { fps.mark_fp = procmsg_open_mark_file(item, DATA_WRITE); if (fps.mark_fp == NULL) { if (fps.cache_fp) @@ -2174,6 +2193,17 @@ gint summary_write_cache(SummaryView *summaryview) if (fps.mark_fp) fclose(fps.mark_fp); + if (item->stype == F_VIRTUAL) { + GSList *mlist; + + mlist = summary_get_changed_msg_list(summaryview); + if (mlist) { + procmsg_write_flags_for_multiple_folders(mlist); + g_slist_free(mlist); + folderview_update_all_updated(FALSE); + } + } + debug_print(_("done.\n")); if (item->cache_dirty) { @@ -2267,6 +2297,15 @@ static void summary_display_msg_full(SummaryView *summaryview, summaryview->folder_item->new--; if (MSG_IS_UNREAD(msginfo->flags)) summaryview->folder_item->unread--; + + if (summaryview->folder_item->stype == F_VIRTUAL) { + if (MSG_IS_NEW(msginfo->flags)) + msginfo->folder->new--; + if (MSG_IS_UNREAD(msginfo->flags)) + msginfo->folder->unread--; + folderview_update_item(msginfo->folder, FALSE); + } + if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) { MSG_UNSET_PERM_FLAGS @@ -2509,6 +2548,15 @@ static void summary_mark_row_as_read(SummaryView *summaryview, summaryview->folder_item->new--; if (MSG_IS_UNREAD(msginfo->flags)) summaryview->folder_item->unread--; + + if (summaryview->folder_item->stype == F_VIRTUAL) { + if (MSG_IS_NEW(msginfo->flags)) + msginfo->folder->new--; + if (MSG_IS_UNREAD(msginfo->flags)) + msginfo->folder->unread--; + folderview_update_item(msginfo->folder, FALSE); + } + if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) { MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD); MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); @@ -2598,6 +2646,10 @@ static void summary_mark_row_as_unread(SummaryView *summaryview, MSG_SET_PERM_FLAGS(msginfo->flags, MSG_UNREAD); summaryview->folder_item->unread++; summaryview->folder_item->mark_dirty = TRUE; + if (summaryview->folder_item->stype == F_VIRTUAL) { + msginfo->folder->unread++; + folderview_update_item(msginfo->folder, FALSE); + } debug_print(_("Message %d is marked as unread\n"), msginfo->msgnum); } diff --git a/src/summaryview.h b/src/summaryview.h index f5267629..d2688d89 100644 --- a/src/summaryview.h +++ b/src/summaryview.h @@ -152,6 +152,8 @@ gboolean summary_is_locked (SummaryView *summaryview); SummarySelection summary_get_selection_type (SummaryView *summaryview); GSList *summary_get_selected_msg_list (SummaryView *summaryview); +GSList *summary_get_changed_msg_list (SummaryView *summaryview); +GSList *summary_get_msg_list (SummaryView *summaryview); void summary_select_prev_unread (SummaryView *summaryview); void summary_select_next_unread (SummaryView *summaryview); -- cgit v1.2.3