~sircmpwn/aerc

1b673b5ea7d06ef914e9d48ff7299f8b5f2119fd — Jeffas 7 months ago dc4c36a
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.
3 files changed, 48 insertions(+), 27 deletions(-)

M lib/dirstore.go
M widgets/account.go
M widgets/dirlist.go
M lib/dirstore.go => lib/dirstore.go +13 -2
@@ 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
}

M widgets/account.go => widgets/account.go +23 -25
@@ 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:

M widgets/dirlist.go => widgets/dirlist.go +12 -0
@@ 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)
}