summary refs log tree commit diff stats
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)
downloadaerc-ef6178a12ae5ef7070711f5cc2f2114dfd015dcd.tar.gz
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()