summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJeffas <dev@jeffas.io>2019-07-21 22:39:36 +0100
committerDrew DeVault <sir@cmpwn.com>2019-07-26 14:15:27 -0400
commit1b673b5ea7d06ef914e9d48ff7299f8b5f2119fd (patch)
tree7b6598470500ec2fd923fb6f0939409c25963d79
parentdc4c36adbfbffd34319ddc007bad437ef802ee72 (diff)
downloadaerc-1b673b5ea7d06ef914e9d48ff7299f8b5f2119fd.tar.gz
Move msgstore map to dirstore
This map represents a mapping from directory names to their associated
messagestores anyway so they should be under dirstore. This simply moves
them there and adds some methods required to interact with them.
-rw-r--r--lib/dirstore.go15
-rw-r--r--widgets/account.go48
-rw-r--r--widgets/dirlist.go12
3 files changed, 48 insertions, 27 deletions
diff --git a/lib/dirstore.go b/lib/dirstore.go
index 862e97a..bb58a9d 100644
--- a/lib/dirstore.go
+++ b/lib/dirstore.go
@@ -1,11 +1,13 @@
 package lib
 
 type DirStore struct {
-	dirs []string
+	dirs      []string
+	msgStores map[string]*MessageStore
 }
 
 func NewDirStore() *DirStore {
-	return &DirStore{}
+	msgStores := make(map[string]*MessageStore)
+	return &DirStore{msgStores: msgStores}
 }
 
 func (store *DirStore) Update(dirs []string) {
@@ -16,3 +18,12 @@ func (store *DirStore) Update(dirs []string) {
 func (store *DirStore) List() []string {
 	return store.dirs
 }
+
+func (store *DirStore) MessageStore(dirname string) (*MessageStore, bool) {
+	msgStore, ok := store.msgStores[dirname]
+	return msgStore, ok
+}
+
+func (store *DirStore) SetMessageStore(name string, msgStore *MessageStore) {
+	store.msgStores[name] = msgStore
+}
diff --git a/widgets/account.go b/widgets/account.go
index 92e7a56..86ec00c 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -16,15 +16,14 @@ import (
 )
 
 type AccountView struct {
-	acct      *config.AccountConfig
-	conf      *config.AercConfig
-	dirlist   *DirectoryList
-	grid      *ui.Grid
-	host      TabHost
-	logger    *log.Logger
-	msglist   *MessageList
-	msgStores map[string]*lib.MessageStore
-	worker    *types.Worker
+	acct    *config.AccountConfig
+	conf    *config.AercConfig
+	dirlist *DirectoryList
+	grid    *ui.Grid
+	host    TabHost
+	logger  *log.Logger
+	msglist *MessageList
+	worker  *types.Worker
 }
 
 func NewAccountView(conf *config.AercConfig, acct *config.AccountConfig,
@@ -58,15 +57,14 @@ func NewAccountView(conf *config.AercConfig, acct *config.AccountConfig,
 	grid.AddChild(msglist).At(0, 1)
 
 	view := &AccountView{
-		acct:      acct,
-		conf:      conf,
-		dirlist:   dirlist,
-		grid:      grid,
-		host:      host,
-		logger:    logger,
-		msglist:   msglist,
-		msgStores: make(map[string]*lib.MessageStore),
-		worker:    worker,
+		acct:    acct,
+		conf:    conf,
+		dirlist: dirlist,
+		grid:    grid,
+		host:    host,
+		logger:  logger,
+		msglist: msglist,
+		worker:  worker,
 	}
 
 	go worker.Backend.Run()
@@ -187,7 +185,7 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) {
 	case *types.Done:
 		switch msg.InResponseTo().(type) {
 		case *types.OpenDirectory:
-			if store, ok := acct.msgStores[acct.dirlist.selected]; ok {
+			if store, ok := acct.dirlist.SelectedMsgStore(); ok {
 				// If we've opened this dir before, we can re-render it from
 				// memory while we wait for the update and the UI feels
 				// snappier. If not, we'll unset the store and show the spinner
@@ -200,7 +198,7 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) {
 			acct.dirlist.UpdateList(nil)
 		}
 	case *types.DirectoryInfo:
-		if store, ok := acct.msgStores[msg.Info.Name]; ok {
+		if store, ok := acct.dirlist.MsgStore(msg.Info.Name); ok {
 			store.Update(msg)
 		} else {
 			store = lib.NewMessageStore(acct.worker, msg.Info,
@@ -208,26 +206,26 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) {
 					acct.conf.Triggers.ExecNewEmail(acct.acct,
 						acct.conf, msg)
 				})
-			acct.msgStores[msg.Info.Name] = store
+			acct.dirlist.SetMsgStore(msg.Info.Name, store)
 			store.OnUpdate(func(_ *lib.MessageStore) {
 				store.OnUpdate(nil)
 				acct.msglist.SetStore(store)
 			})
 		}
 	case *types.DirectoryContents:
-		if store, ok := acct.msgStores[acct.dirlist.selected]; ok {
+		if store, ok := acct.dirlist.SelectedMsgStore(); ok {
 			store.Update(msg)
 		}
 	case *types.FullMessage:
-		if store, ok := acct.msgStores[acct.dirlist.selected]; ok {
+		if store, ok := acct.dirlist.SelectedMsgStore(); ok {
 			store.Update(msg)
 		}
 	case *types.MessageInfo:
-		if store, ok := acct.msgStores[acct.dirlist.selected]; ok {
+		if store, ok := acct.dirlist.SelectedMsgStore(); ok {
 			store.Update(msg)
 		}
 	case *types.MessagesDeleted:
-		if store, ok := acct.msgStores[acct.dirlist.selected]; ok {
+		if store, ok := acct.dirlist.SelectedMsgStore(); ok {
 			store.Update(msg)
 		}
 	case *types.Error:
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index 0a6113a..078973a 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -178,3 +178,15 @@ func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
 	}
 	dirlist.dirs = filtered
 }
+
+func (dirlist *DirectoryList) SelectedMsgStore() (*lib.MessageStore, bool) {
+	return dirlist.store.MessageStore(dirlist.selected)
+}
+
+func (dirlist *DirectoryList) MsgStore(name string) (*lib.MessageStore, bool) {
+	return dirlist.store.MessageStore(name)
+}
+
+func (dirlist *DirectoryList) SetMsgStore(name string, msgStore *lib.MessageStore) {
+	dirlist.store.SetMessageStore(name, msgStore)
+}