diff --git a/widgets/account.go b/widgets/account.go index e913cb7..2d3b0d2 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -331,8 +331,42 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) { } case *types.MessagesDeleted: if store, ok := acct.dirlist.SelectedMsgStore(); ok { + store.DirInfo.Exists -= len(msg.Uids) + // False to trigger recount of recent/unseen + store.DirInfo.AccurateCounts = false store.Update(msg) } + case *types.MessagesCopied: + // Only update the destination destStore if it is initialized + if destStore, ok := acct.dirlist.MsgStore(msg.Destination); ok { + var recent, unseen int + for _, uid := range msg.Uids { + // Get the message from the originating store + msg, ok := acct.Store().Messages[uid] + if !ok { + continue + } + seen := false + for _, flag := range msg.Flags { + if flag == models.SeenFlag { + seen = true + } + if flag == models.RecentFlag { + recent = recent + 1 + } + } + if !seen { + unseen = unseen + 1 + } + } + destStore.DirInfo.Recent += recent + destStore.DirInfo.Unseen += unseen + destStore.DirInfo.Exists += len(msg.Uids) + // True. For imap, we don't have the message in the store until we + // Select so we need to rely on the math we just did for accurate + // counts + destStore.DirInfo.AccurateCounts = true + } case *types.LabelList: acct.labels = msg.Labels case *types.ConnError: diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 99ffe19..60bd7fa 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -244,16 +244,12 @@ func (dirlist *DirectoryList) getRUEString(name string) string { return "" } var totalRecent, totalUnseen, totalExists int - if msgStore.DirInfo.AccurateCounts { - totalRecent = msgStore.DirInfo.Recent - totalUnseen = msgStore.DirInfo.Unseen - totalExists = msgStore.DirInfo.Exists - } else { + if !msgStore.DirInfo.AccurateCounts { totalRecent, totalUnseen = countRUE(msgStore) - // use the total count from the dirinfo, else we only count already - // fetched messages - totalExists = msgStore.DirInfo.Exists + msgStore.DirInfo.Recent = totalRecent + msgStore.DirInfo.Unseen = totalUnseen } + totalExists = msgStore.DirInfo.Exists rueString := "" if totalRecent > 0 { rueString = fmt.Sprintf("%d/%d/%d", totalRecent, totalUnseen, totalExists) diff --git a/worker/imap/movecopy.go b/worker/imap/movecopy.go index 0b19ead..f1f2b45 100644 --- a/worker/imap/movecopy.go +++ b/worker/imap/movecopy.go @@ -14,6 +14,11 @@ func (imapw *IMAPWorker) handleCopyMessages(msg *types.CopyMessages) { Error: err, }, nil) } else { + imapw.worker.PostMessage(&types.MessagesCopied{ + Message: types.RespondTo(msg), + Destination: msg.Destination, + Uids: msg.Uids, + }, nil) imapw.worker.PostMessage(&types.Done{Message: types.RespondTo(msg)}, nil) } } diff --git a/worker/maildir/worker.go b/worker/maildir/worker.go index d3de844..0a51ea7 100644 --- a/worker/maildir/worker.go +++ b/worker/maildir/worker.go @@ -536,11 +536,6 @@ func (w *Worker) handleDeleteMessages(msg *types.DeleteMessages) error { w.worker.Logger.Printf("error removing some messages: %v", err) return err } - - w.worker.PostMessage(&types.DirectoryInfo{ - Info: w.getDirectoryInfo(w.selectedName), - }, nil) - return nil } @@ -617,15 +612,11 @@ func (w *Worker) handleCopyMessages(msg *types.CopyMessages) error { if err != nil { return err } - - w.worker.PostMessage(&types.DirectoryInfo{ - Info: w.getDirectoryInfo(w.selectedName), + w.worker.PostMessage(&types.MessagesCopied{ + Message: types.RespondTo(msg), + Destination: msg.Destination, + Uids: msg.Uids, }, nil) - - w.worker.PostMessage(&types.DirectoryInfo{ - Info: w.getDirectoryInfo(msg.Destination), - }, nil) - return nil } diff --git a/worker/types/messages.go b/worker/types/messages.go index 5cd3768..d2d98fd 100644 --- a/worker/types/messages.go +++ b/worker/types/messages.go @@ -218,6 +218,12 @@ type MessagesDeleted struct { Uids []uint32 } +type MessagesCopied struct { + Message + Destination string + Uids []uint32 +} + type ModifyLabels struct { Message Uids []uint32