aboutsummaryrefslogtreecommitdiff
path: root/widgets/msglist.go
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-03-15 21:36:06 -0400
committerDrew DeVault <sir@cmpwn.com>2019-03-15 21:36:06 -0400
commitef6178a12ae5ef7070711f5cc2f2114dfd015dcd (patch)
tree6bfba867c30bfc5ac0188aa66d4263789b1199e3 /widgets/msglist.go
parent77c76ba46296f57f88c591a420e929a059a55d3e (diff)
Move MessageStore into its own file
Diffstat (limited to 'widgets/msglist.go')
-rw-r--r--widgets/msglist.go86
1 files changed, 3 insertions, 83 deletions
diff --git a/widgets/msglist.go b/widgets/msglist.go
index 5ba75a8..0fb919d 100644
--- a/widgets/msglist.go
+++ b/widgets/msglist.go
@@ -3,100 +3,20 @@ package widgets
import (
"log"
- "github.com/emersion/go-imap"
"github.com/gdamore/tcell"
"git.sr.ht/~sircmpwn/aerc2/config"
+ "git.sr.ht/~sircmpwn/aerc2/lib"
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
- "git.sr.ht/~sircmpwn/aerc2/worker/types"
)
-type MessageStore struct {
- DirInfo types.DirectoryInfo
- Messages map[uint32]*types.MessageInfo
- // Ordered list of known UIDs
- Uids []uint32
- // Map of uids we've asked the worker to fetch
- onUpdate func(store *MessageStore)
- pendingBodies map[uint32]interface{}
- pendingHeaders map[uint32]interface{}
- worker *types.Worker
-}
-
-func NewMessageStore(worker *types.Worker,
- dirInfo *types.DirectoryInfo) *MessageStore {
-
- return &MessageStore{
- DirInfo: *dirInfo,
-
- pendingBodies: make(map[uint32]interface{}),
- pendingHeaders: make(map[uint32]interface{}),
- worker: worker,
- }
-}
-
-func (store *MessageStore) FetchHeaders(uids []uint32) {
- // TODO: this could be optimized by pre-allocating toFetch and trimming it
- // at the end. In practice we expect to get most messages back in one frame.
- var toFetch imap.SeqSet
- for _, uid := range uids {
- if _, ok := store.pendingHeaders[uid]; !ok {
- toFetch.AddNum(uint32(uid))
- store.pendingHeaders[uid] = nil
- }
- }
- if !toFetch.Empty() {
- store.worker.PostAction(&types.FetchMessageHeaders{
- Uids: toFetch,
- }, nil)
- }
-}
-
-func (store *MessageStore) Update(msg types.WorkerMessage) {
- update := false
- switch msg := msg.(type) {
- case *types.DirectoryInfo:
- store.DirInfo = *msg
- update = true
- break
- case *types.DirectoryContents:
- newMap := make(map[uint32]*types.MessageInfo)
- for _, uid := range msg.Uids {
- if msg, ok := store.Messages[uid]; ok {
- newMap[uid] = msg
- } else {
- newMap[uid] = nil
- }
- }
- store.Messages = newMap
- store.Uids = msg.Uids
- update = true
- break
- case *types.MessageInfo:
- // TODO: merge message info into existing record, if applicable
- store.Messages[msg.Uid] = msg
- if _, ok := store.pendingHeaders[msg.Uid]; msg.Envelope != nil && ok {
- delete(store.pendingHeaders, msg.Uid)
- }
- update = true
- break
- }
- if update && store.onUpdate != nil {
- store.onUpdate(store)
- }
-}
-
-func (store *MessageStore) OnUpdate(fn func(store *MessageStore)) {
- store.onUpdate = fn
-}
-
type MessageList struct {
conf *config.AercConfig
logger *log.Logger
onInvalidate func(d ui.Drawable)
selected int
spinner *Spinner
- store *MessageStore
+ store *lib.MessageStore
}
// TODO: fish in config
@@ -171,7 +91,7 @@ func (ml *MessageList) Draw(ctx *ui.Context) {
}
}
-func (ml *MessageList) SetStore(store *MessageStore) {
+func (ml *MessageList) SetStore(store *lib.MessageStore) {
ml.store = store
if store != nil {
ml.spinner.Stop()