Target folder colourization.
authorDarko Koruga <darko@users.sourceforge.net>
Tue, 31 Jul 2001 06:17:48 +0000 (06:17 +0000)
committerDarko Koruga <darko@users.sourceforge.net>
Tue, 31 Jul 2001 06:17:48 +0000 (06:17 +0000)
ChangeLog.claws
src/folder.c
src/folder.h
src/folderview.c
src/folderview.h
src/mainwindow.c
src/mh.c
src/prefs_common.c
src/prefs_common.h
src/summaryview.c

index 84c7424520bda9aa246c2c36639ffc701e1bcf59..6c0fc63e3796e0175a58993830b142f4a8322db5 100644 (file)
@@ -1,3 +1,13 @@
+2001-07-31 [darko]
+
+        * src/folder.[ch]
+        * src/folderview.[ch]
+        * src/mainwindow.c
+        * src/mh.c
+        * src/prefs_common.[ch]
+        * src/summaryview.c
+               target folder colourization
+
 2001-07-30 [paul]
 
        more sync with Sylpheed 0.5.1cvs6 
index 44bc44b647962d7d29bd14bf09a0b867b7f0c4bb..acf6a93ac43fd636e423ad31eecd7888251b87ad 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "intl.h"
 #include "folder.h"
+#include "folderview.h"
 #include "session.h"
 #include "imap.h"
 #include "news.h"
@@ -60,6 +61,7 @@ static gboolean folder_read_folder_func       (GNode          *node,
 static gchar *folder_get_list_path     (void);
 static void folder_write_list_recursive        (GNode          *node,
                                         gpointer        data);
+static void folder_update_op_count_rec (GNode          *node);
 
 
 Folder *folder_new(FolderType type, const gchar *name, const gchar *path)
@@ -646,6 +648,7 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
 
        num = folder->move_msgs_with_dest(folder, dest, msglist);
        if (num > 0) dest->last_num = num;
+       else dest->op_count = 0;
 
        return num;
 }
@@ -752,6 +755,7 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
 
        num = folder->copy_msgs_with_dest(folder, dest, msglist);
        if (num > 0) dest->last_num = num;
+       else dest->op_count = 0;
 
        return num;
 }
@@ -1284,6 +1288,39 @@ static void folder_write_list_recursive(GNode *node, gpointer data)
                fputs(" />\n", fp);
 }
 
+static void folder_update_op_count_rec(GNode *node) {
+       FolderItem *fitem = FOLDER_ITEM(node->data);
+
+       if (g_node_depth(node) > 0) {
+               if (fitem->op_count > 0) {
+                       fitem->op_count = 0;
+                       folderview_update_item(fitem, 0);
+               }
+               if (node->children) {
+                       GNode *child;
+
+                       child = node->children;
+                       while (child) {
+                               GNode *cur;
+
+                               cur = child;
+                               child = cur->next;
+                               folder_update_op_count_rec(cur);
+                       }
+               }
+       }
+}
+
+void folder_update_op_count() {
+       GList *cur;
+       Folder *folder;
+
+       for (cur = folder_list; cur != NULL; cur = cur->next) {
+               folder = cur->data;
+               folder_update_op_count_rec(folder->node);
+       }
+}
+
 typedef struct _type_str {
        gchar * str;
        gint type;
index d6d4a63a4d0f84166bf79603ab1d81b3e1ebe913..420f2e088798ca24a68969b912934adfe8126208 100644 (file)
@@ -216,6 +216,8 @@ struct _FolderItem
        guint no_select : 1; /* not selectable?   */
        guint collapsed : 1; /* collapsed item    */
 
+       gint op_count;
+
        FolderItem *parent;
 
        Folder *folder;
@@ -257,6 +259,7 @@ void   folder_add           (Folder         *folder);
 GList *folder_get_list         (void);
 gint   folder_read_list                (void);
 void   folder_write_list       (void);
+void   folder_update_op_count  (void);
 
 Folder     *folder_find_from_path      (const gchar    *path);
 FolderItem *folder_find_item_from_path (const gchar    *path);
index 614838c10354895c8b3556384de5c4d16f1cc169..bf7de4bc9f9c9e261023092a5ce80766f8bd2a65 100644 (file)
@@ -468,11 +468,15 @@ void folderview_select(FolderView *folderview, FolderItem *item)
 {
        GtkCTree *ctree = GTK_CTREE(folderview->ctree);
        GtkCTreeNode *node;
+       GtkCTreeNode *old_selected = folderview->selected;
 
        if (!item) return;
 
        node = gtk_ctree_find_by_row_data(ctree, NULL, item);
        if (node) folderview_select_node(folderview, node);
+
+       if (old_selected != node)
+               folder_update_op_count();
 }
 
 static void folderview_select_node(FolderView *folderview, GtkCTreeNode *node)
@@ -911,10 +915,19 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
                style->fg[GTK_STATE_NORMAL]   = folderview->color_new;
                style->fg[GTK_STATE_SELECTED] = folderview->color_new;
        } else {
-               style->fg[GTK_STATE_NORMAL] =
-                       ctree_style->fg[GTK_STATE_NORMAL];
-               style->fg[GTK_STATE_SELECTED] =
-                       ctree_style->fg[GTK_STATE_SELECTED];
+               if (item->op_count > 0) {
+                       if (boldfont)
+                               style->font = boldfont;
+                       style->fg[GTK_STATE_NORMAL]   =
+                               folderview->color_op;
+                       style->fg[GTK_STATE_SELECTED] =
+                               folderview->color_op;
+               } else {
+                       style->fg[GTK_STATE_NORMAL] =
+                               ctree_style->fg[GTK_STATE_NORMAL];
+                       style->fg[GTK_STATE_SELECTED] =
+                               ctree_style->fg[GTK_STATE_SELECTED];
+               }
        }
 
        gtk_ctree_node_set_row_style(ctree, node, style);
@@ -2158,4 +2171,14 @@ static void folderview_property_cb(FolderView *folderview, guint action, GtkWidg
        g_return_if_fail(item->folder != NULL);
 
        prefs_folder_item_create(item);
-}
\ No newline at end of file
+}
+
+void folderview_set_target_folder_color(gint color_op) {
+       GList *list;
+       FolderView *folderview;
+
+       for (list = folderview_list; list != NULL; list = list->next) {
+               folderview = (FolderView *)list->data;
+               gtkut_convert_int_to_gdk_color(color_op, &folderview->color_op);
+       }
+}
index 1b6d1cba32acac8d4565f9424e22f594ef8c223d..f76ddbc453c027f3cb5780996128519b4ef524cd 100644 (file)
@@ -51,6 +51,7 @@ struct _FolderView
        gboolean open_folder;
 
        GdkColor color_new;
+       GdkColor color_op;
 
        MainWindow   *mainwin;
        SummaryView  *summaryview;
@@ -80,4 +81,5 @@ void folderview_new_folder            (FolderView     *folderview);
 void folderview_rename_folder          (FolderView     *folderview);
 void folderview_delete_folder          (FolderView     *folderview);
 
+void folderview_set_target_folder_color (gint          color_op);
 #endif /* __FOLDERVIEW_H__ */
index a87ded6508afb74ec70f09635eb0167d53e7792f..7ba88fb3d3d6f4d5054d1c13d27fe645a7e8c76e 100644 (file)
@@ -592,8 +592,8 @@ MainWindow *main_window_create(SeparateType type)
        SummaryView *summaryview;
        MessageView *messageview;
        GdkColormap *colormap;
-       GdkColor color[3];
-       gboolean success[3];
+       GdkColor color[4];
+       gboolean success[4];
        guint n_menu_entries;
        GtkItemFactory *ifactory;
        GtkWidget *ac_menu;
@@ -703,6 +703,9 @@ MainWindow *main_window_create(SeparateType type)
        folderview->color_new.red = (guint16)55000;
        folderview->color_new.green = folderview->color_new.blue = 15000;
 
+       gtkut_convert_int_to_gdk_color(prefs_common.tgt_folder_col,
+                                      &folderview->color_op);
+
        summaryview->color_important.red = 0;
        summaryview->color_marked.green = 0;
        summaryview->color_important.blue = (guint16)65535;
@@ -710,10 +713,11 @@ MainWindow *main_window_create(SeparateType type)
        color[0] = summaryview->color_marked;
        color[1] = summaryview->color_dim;
        color[2] = folderview->color_new;
+       color[3] = folderview->color_op;
 
        colormap = gdk_window_get_colormap(window->window);
-       gdk_colormap_alloc_colors(colormap, color, 3, FALSE, TRUE, success);
-       for (i = 0; i < 3; i++) {
+       gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
+       for (i = 0; i < 4; i++) {
                if (success[i] == FALSE)
                        g_warning(_("MainWindow: color allocation %d failed\n"), i);
        }
@@ -2431,6 +2435,8 @@ static void update_summary_cb(MainWindow *mainwin, guint action,
        if (!mainwin->summaryview->folder_item) return;
        if (!folderview->opened) return;
 
+       folder_update_op_count();
+
        fitem = gtk_ctree_node_get_row_data(GTK_CTREE(folderview->ctree),
                                            folderview->opened);
        if (!fitem) return;
index 4c860c60f3db52ae259a2020d5ec2ccfb43c6c57..0ff17bec267ead28cc7c114f08cfbe8c5be6347a 100644 (file)
--- a/src/mh.c
+++ b/src/mh.c
@@ -377,6 +377,8 @@ gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
                                   dest->last_num + 1);
        g_free(destdir);
 
+       dest->op_count--;
+
        if (is_file_exist(destfile)) {
                g_warning(_("%s already exists."), destfile);
                g_free(srcfile);
index 7da9857a9d286f41e2c46db0062f1fda4134849b..37555103a9c6ddba630751a43d5c4c8fafe37a44 100644 (file)
@@ -49,6 +49,7 @@
 #include "gtkutils.h"
 #include "alertpanel.h"
 #include "folder.h"
+#include "folderview.h"
 
 PrefsCommon prefs_common;
 
@@ -180,6 +181,7 @@ static struct MessageColorButtons {
        GtkWidget *quote_level2_btn;
        GtkWidget *quote_level3_btn;
        GtkWidget *uri_btn;
+       GtkWidget *tgt_folder_btn;
 } color_buttons;
 
 static GtkWidget *quote_desc_win;
@@ -449,6 +451,8 @@ static PrefParam param[] = {
         NULL, NULL, NULL},
        {"uri_color", "32512", &prefs_common.uri_col, P_INT,
         NULL, NULL, NULL},
+       {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_INT,
+        NULL, NULL, NULL},
        {"signature_color", "0", &prefs_common.sig_col, P_USHORT,
         NULL, NULL, NULL},
        {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
@@ -2235,6 +2239,7 @@ static void prefs_quote_colors_dialog_create(void)
        GtkWidget *quotelevel2_label;
        GtkWidget *quotelevel3_label;
        GtkWidget *uri_label;
+       GtkWidget *tgt_folder_label;
        GtkWidget *hbbox;
        GtkWidget *ok_btn;
        //GtkWidget *cancel_btn;
@@ -2257,7 +2262,7 @@ static void prefs_quote_colors_dialog_create(void)
        gtk_container_add (GTK_CONTAINER (frame_colors), table);
        gtk_container_set_border_width (GTK_CONTAINER (table), 8);
        gtk_table_set_row_spacings (GTK_TABLE (table), 2);
-       gtk_table_set_col_spacings (GTK_TABLE (table), 4);
+       gtk_table_set_col_spacings (GTK_TABLE (table), 5);
 
        color_buttons.quote_level1_btn = gtk_button_new();
        gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level1_btn,
@@ -2285,6 +2290,12 @@ static void prefs_quote_colors_dialog_create(void)
        gtk_widget_set_usize (color_buttons.uri_btn, 40, 30);
        gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
 
+       color_buttons.tgt_folder_btn = gtk_button_new_with_label ("");
+       gtk_table_attach (GTK_TABLE (table), color_buttons.tgt_folder_btn,
+                         0, 1, 4, 5, 0, 0, 0, 0);
+       gtk_widget_set_usize (color_buttons.tgt_folder_btn, 40, 30);
+       gtk_container_set_border_width (GTK_CONTAINER (color_buttons.tgt_folder_btn), 5);
+
        quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
        gtk_table_attach (GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
@@ -2309,6 +2320,12 @@ static void prefs_quote_colors_dialog_create(void)
        gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
        gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
 
+       tgt_folder_label = gtk_label_new (_("Target folder"));
+       gtk_table_attach (GTK_TABLE (table), tgt_folder_label, 1, 2, 4, 5,
+                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
+       gtk_label_set_justify (GTK_LABEL (tgt_folder_label), GTK_JUSTIFY_LEFT);
+       gtk_misc_set_alignment (GTK_MISC (tgt_folder_label), 0, 0.5);
+
        PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
                           _("Recycle quote colors"));
 
@@ -2335,6 +2352,8 @@ static void prefs_quote_colors_dialog_create(void)
                           GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL3");
        gtk_signal_connect(GTK_OBJECT(color_buttons.uri_btn), "clicked",
                           GTK_SIGNAL_FUNC(quote_color_set_dialog), "URI");
+       gtk_signal_connect(GTK_OBJECT(color_buttons.tgt_folder_btn), "clicked",
+                          GTK_SIGNAL_FUNC(quote_color_set_dialog), "TGTFLD");
        gtk_signal_connect(GTK_OBJECT(recycle_colors_btn), "toggled",
                           GTK_SIGNAL_FUNC(prefs_recycle_colors_toggled), NULL);
        gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
@@ -2349,6 +2368,8 @@ static void prefs_quote_colors_dialog_create(void)
                            prefs_common.quote_level3_col);
        set_button_bg_color(color_buttons.uri_btn,
                            prefs_common.uri_col);
+       set_button_bg_color(color_buttons.tgt_folder_btn,
+                           prefs_common.tgt_folder_col);
        gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
                                     prefs_common.recycle_quote_colors);
 
@@ -2383,6 +2404,9 @@ static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
        } else if(g_strcasecmp(type, "URI") == 0) {
                title = _("Pick color for URI");
                rgbvalue = prefs_common.uri_col;
+       } else if(g_strcasecmp(type, "TGTFLD") == 0) {
+               title = _("Pick color for target folder");
+               rgbvalue = prefs_common.tgt_folder_col;
        } else {   /* Should never be called */
                g_warning("Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
                return;
@@ -2446,6 +2470,10 @@ static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
        } else if (g_strcasecmp(type, "URI") == 0) {
                prefs_common.uri_col = rgbvalue;
                set_button_bg_color(color_buttons.uri_btn, rgbvalue);
+       } else if (g_strcasecmp(type, "TGTFLD") == 0) {
+               prefs_common.tgt_folder_col = rgbvalue;
+               set_button_bg_color(color_buttons.tgt_folder_btn, rgbvalue);
+               folderview_set_target_folder_color(prefs_common.tgt_folder_col);
        } else
                fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
 
index 68a9ac47a6c0747eb744c02b4ce9a9c31744e433..8adbf2663f6f5cc15563487fe5951c74379c8f08 100644 (file)
@@ -151,6 +151,7 @@ struct _PrefsCommon
        gint quote_level2_col;
        gint quote_level3_col;
        gint uri_col;
+       gint tgt_folder_col;
        gushort sig_col;
        gboolean recycle_quote_colors;
        gboolean conv_mb_alnum;
index a737b477a16611a52e25bab0a3b3185e06c167d0..a2063dad0d507780352adc22cd9f7b39ba82e45f 100644 (file)
@@ -2358,17 +2358,27 @@ void summary_set_marks_selected(SummaryView *summaryview)
 
 static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
 {
+       gboolean changed = FALSE;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-       msginfo->to_folder = NULL;
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted--;
-       if (MSG_IS_MOVE(msginfo->flags))
+       if (MSG_IS_MOVE(msginfo->flags)) {
                summaryview->moved--;
-       if (MSG_IS_COPY(msginfo->flags))
+               changed = TRUE;
+       }
+       if (MSG_IS_COPY(msginfo->flags)) {
                summaryview->copied--;
+               changed = TRUE;
+       }
+       if (changed && !prefs_common.immediate_exec) {
+               msginfo->to_folder->op_count--;
+               if (msginfo->to_folder->op_count == 0)
+                       folderview_update_item(msginfo->to_folder, 0);
+       }
+       msginfo->to_folder = NULL;
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
        MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
        MSG_SET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
@@ -2472,6 +2482,7 @@ void summary_mark_as_unread(SummaryView *summaryview)
 
 static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
 {
+       gboolean changed = FALSE;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
 
@@ -2479,11 +2490,20 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
 
        if (MSG_IS_DELETED(msginfo->flags)) return;
 
-       msginfo->to_folder = NULL;
-       if (MSG_IS_MOVE(msginfo->flags))
+       if (MSG_IS_MOVE(msginfo->flags)) {
                summaryview->moved--;
-       if (MSG_IS_COPY(msginfo->flags))
+               changed = TRUE;
+       }
+       if (MSG_IS_COPY(msginfo->flags)) {
                summaryview->copied--;
+               changed = TRUE;
+       }
+       if (changed && !prefs_common.immediate_exec) {
+               msginfo->to_folder->op_count--;
+               if (msginfo->to_folder->op_count == 0)
+                       folderview_update_item(msginfo->to_folder, 0);
+       }
+       msginfo->to_folder = NULL;
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
        MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
        MSG_SET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
@@ -2563,17 +2583,27 @@ static void summary_delete_duplicated_func(GtkCTree *ctree, GtkCTreeNode *node,
 
 static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
 {
+       gboolean changed = FALSE;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-       msginfo->to_folder = NULL;
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted--;
-       if (MSG_IS_MOVE(msginfo->flags))
+       if (MSG_IS_MOVE(msginfo->flags)) {
                summaryview->moved--;
-       if (MSG_IS_COPY(msginfo->flags))
+               changed = TRUE;
+       }
+       if (MSG_IS_COPY(msginfo->flags)) {
                summaryview->copied--;
+               changed = TRUE;
+       }
+       if (changed && !prefs_common.immediate_exec) {
+               msginfo->to_folder->op_count--;
+               if (msginfo->to_folder->op_count == 0)
+                       folderview_update_item(msginfo->to_folder, 0);
+       }
+       msginfo->to_folder = NULL;
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
        MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
        CHANGE_FLAGS(msginfo);
@@ -2598,23 +2628,45 @@ void summary_unmark(SummaryView *summaryview)
 static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                                FolderItem *to_folder)
 {
+       gboolean changed = FALSE;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
 
        g_return_if_fail(to_folder != NULL);
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
+       if (MSG_IS_MOVE(msginfo->flags)) {
+               if (!prefs_common.immediate_exec) {
+                       msginfo->to_folder->op_count--;
+                       if (msginfo->to_folder->op_count == 0) {
+                               folderview_update_item(msginfo->to_folder, 0);
+                               changed = TRUE;
+                       }
+               }
+       }
        msginfo->to_folder = to_folder;
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted--;
+       if (MSG_IS_COPY(msginfo->flags)) {
+               summaryview->copied--;
+               if (!prefs_common.immediate_exec)
+                       msginfo->to_folder->op_count--;
+       }
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
        MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_COPY);
        if (!MSG_IS_MOVE(msginfo->flags)) {
                MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MOVE);
                summaryview->moved++;
+               changed = TRUE;
        }
-       if (!prefs_common.immediate_exec)
+       if (!prefs_common.immediate_exec) {
                summary_set_row_marks(summaryview, row);
+               if (changed) {
+                       msginfo->to_folder->op_count++;
+                       if (msginfo->to_folder->op_count == 1)
+                               folderview_update_item(msginfo->to_folder, 0);
+               }
+       }
 
        debug_print(_("Message %d is set to move to %s\n"),
                    msginfo->msgnum, to_folder->path);
@@ -2641,8 +2693,11 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
 
        if (prefs_common.immediate_exec)
                summary_execute(summaryview);
-       else
+       else {
                summary_status_show(summaryview);
+
+               folderview_update_item(to_folder, 0);
+       }
 }
 
 void summary_move_to(SummaryView *summaryview)
@@ -2659,23 +2714,45 @@ void summary_move_to(SummaryView *summaryview)
 static void summary_copy_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                                FolderItem *to_folder)
 {
+       gboolean changed = FALSE;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
 
        g_return_if_fail(to_folder != NULL);
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
+       if (MSG_IS_COPY(msginfo->flags)) {
+               if (!prefs_common.immediate_exec) {
+                       msginfo->to_folder->op_count--;
+                       if (msginfo->to_folder->op_count == 0) {
+                               folderview_update_item(msginfo->to_folder, 0);
+                               changed = TRUE;
+                       }
+               }
+       }
        msginfo->to_folder = to_folder;
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted--;
+       if (MSG_IS_MOVE(msginfo->flags)) {
+               summaryview->moved--;
+               if (!prefs_common.immediate_exec)
+                       msginfo->to_folder->op_count--;
+       }
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
        MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE);
        if (!MSG_IS_COPY(msginfo->flags)) {
                MSG_SET_TMP_FLAGS(msginfo->flags, MSG_COPY);
                summaryview->copied++;
+               changed = TRUE;
        }
-       if (!prefs_common.immediate_exec)
+       if (!prefs_common.immediate_exec) {
                summary_set_row_marks(summaryview, row);
+               if (changed) {
+                       msginfo->to_folder->op_count++;
+                       if (msginfo->to_folder->op_count == 1)
+                               folderview_update_item(msginfo->to_folder, 0);
+               }
+       }
 
        debug_print(_("Message %d is set to copy to %s\n"),
                    msginfo->msgnum, to_folder->path);
@@ -2703,8 +2780,11 @@ void summary_copy_selected_to(SummaryView *summaryview, FolderItem *to_folder)
 
        if (prefs_common.immediate_exec)
                summary_execute(summaryview);
-       else
+       else {
                summary_status_show(summaryview);
+
+               folderview_update_item(to_folder, 0);
+       }
 }
 
 void summary_copy_to(SummaryView *summaryview)