aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/dirstore.go16
-rw-r--r--widgets/account.go48
-rw-r--r--widgets/dirlist.go41
-rw-r--r--widgets/dirtree.go23
4 files changed, 69 insertions, 59 deletions
diff --git a/lib/dirstore.go b/lib/dirstore.go
index bb58a9dc..cc06d579 100644
--- a/lib/dirstore.go
+++ b/lib/dirstore.go
@@ -1,7 +1,6 @@
package lib
type DirStore struct {
- dirs []string
msgStores map[string]*MessageStore
}
@@ -10,13 +9,12 @@ func NewDirStore() *DirStore {
return &DirStore{msgStores: msgStores}
}
-func (store *DirStore) Update(dirs []string) {
- store.dirs = make([]string, len(dirs))
- copy(store.dirs, dirs)
-}
-
func (store *DirStore) List() []string {
- return store.dirs
+ dirs := []string{}
+ for dir := range store.msgStores {
+ dirs = append(dirs, dir)
+ }
+ return dirs
}
func (store *DirStore) MessageStore(dirname string) (*MessageStore, bool) {
@@ -27,3 +25,7 @@ func (store *DirStore) MessageStore(dirname string) (*MessageStore, bool) {
func (store *DirStore) SetMessageStore(name string, msgStore *MessageStore) {
store.msgStores[name] = msgStore
}
+
+func (store *DirStore) Remove(name string) {
+ delete(store.msgStores, name)
+}
diff --git a/widgets/account.go b/widgets/account.go
index 3ba511de..ad9d200a 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -231,26 +231,10 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) {
switch msg.InResponseTo().(type) {
case *types.Connect, *types.Reconnect:
acct.SetStatus(state.ConnectionActivity("Listing mailboxes..."))
+ log.Infof("[%s] connected.", acct.acct.Name)
+ acct.SetStatus(state.SetConnected(true))
log.Tracef("Listing mailboxes...")
- acct.dirlist.UpdateList(func(dirs []string) {
- var dir string
- for _, _dir := range dirs {
- if _dir == acct.acct.Default {
- dir = _dir
- break
- }
- }
- if dir == "" && len(dirs) > 0 {
- dir = dirs[0]
- }
- if dir != "" {
- acct.dirlist.Select(dir)
- }
- acct.msglist.SetInitDone()
- log.Infof("[%s] connected.", acct.acct.Name)
- acct.SetStatus(state.SetConnected(true))
- acct.newConn = true
- })
+ acct.worker.PostAction(&types.ListDirectories{}, nil)
case *types.Disconnect:
acct.dirlist.ClearList()
acct.msglist.SetStore(nil)
@@ -268,13 +252,35 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) {
acct.msglist.SetStore(nil)
}
case *types.CreateDirectory:
- acct.dirlist.UpdateList(nil)
+ acct.dirlist.Update(msg)
case *types.RemoveDirectory:
- acct.dirlist.UpdateList(nil)
+ acct.dirlist.Update(msg)
case *types.FetchMessageHeaders:
if acct.newConn {
acct.checkMailOnStartup()
}
+ case *types.ListDirectories:
+ acct.dirlist.Update(msg)
+ if acct.dirlist.Selected() != "" {
+ return
+ }
+ // Nothing selected, select based on config
+ dirs := acct.dirlist.List()
+ var dir string
+ for _, _dir := range dirs {
+ if _dir == acct.acct.Default {
+ dir = _dir
+ break
+ }
+ }
+ if dir == "" && len(dirs) > 0 {
+ dir = dirs[0]
+ }
+ if dir != "" {
+ acct.dirlist.Select(dir)
+ }
+ acct.msglist.SetInitDone()
+ acct.newConn = true
}
case *types.Directory:
name := msg.Dir.Name
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index 986bd662..a548b7b7 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -28,7 +28,7 @@ type DirectoryLister interface {
Selected() string
Select(string)
- UpdateList(func([]string))
+ Update(types.WorkerMessage)
List() []string
ClearList()
@@ -91,33 +91,30 @@ func (dirlist *DirectoryList) UiConfig(dir string) *config.UIConfig {
}
func (dirlist *DirectoryList) List() []string {
- return dirlist.store.List()
+ return dirlist.dirs
}
func (dirlist *DirectoryList) ClearList() {
dirlist.dirs = []string{}
}
-func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {
- // TODO: move this logic into dirstore
- var dirs []string
- dirlist.worker.PostAction(
- &types.ListDirectories{}, func(msg types.WorkerMessage) {
- switch msg := msg.(type) {
- case *types.Directory:
- dirs = append(dirs, msg.Dir.Name)
- case *types.Done:
- dirlist.store.Update(dirs)
- dirlist.filterDirsByFoldersConfig()
- dirlist.sortDirsByFoldersSortConfig()
- dirlist.store.Update(dirlist.dirs)
- dirlist.spinner.Stop()
- dirlist.Invalidate()
- if done != nil {
- done(dirlist.dirs)
- }
- }
- })
+func (dirlist *DirectoryList) Update(msg types.WorkerMessage) {
+ switch msg := msg.(type) {
+ case *types.Done:
+ switch msg := msg.InResponseTo().(type) {
+ case *types.ListDirectories:
+ dirlist.filterDirsByFoldersConfig()
+ dirlist.sortDirsByFoldersSortConfig()
+ dirlist.spinner.Stop()
+ dirlist.Invalidate()
+ case *types.RemoveDirectory:
+ dirlist.store.Remove(msg.Directory)
+ dirlist.filterDirsByFoldersConfig()
+ dirlist.sortDirsByFoldersSortConfig()
+ }
+ default:
+ return
+ }
}
func (dirlist *DirectoryList) CollapseFolder() {
diff --git a/widgets/dirtree.go b/widgets/dirtree.go
index 0c7f090a..88e930ec 100644
--- a/widgets/dirtree.go
+++ b/widgets/dirtree.go
@@ -37,18 +37,23 @@ func NewDirectoryTree(dirlist *DirectoryList, pathSeparator string) DirectoryLis
func (dt *DirectoryTree) ClearList() {
dt.list = make([]*types.Thread, 0)
+ dt.selected = ""
}
-func (dt *DirectoryTree) UpdateList(done func([]string)) {
- dt.DirectoryList.UpdateList(func(dirs []string) {
- if done != nil {
- done(dirs)
+func (dt *DirectoryTree) Update(msg types.WorkerMessage) {
+ switch msg := msg.(type) {
+
+ case *types.Done:
+ switch msg.InResponseTo().(type) {
+ case *types.RemoveDirectory, *types.ListDirectories, *types.CreateDirectory:
+ dt.DirectoryList.Update(msg)
+ dt.buildTree()
+ default:
+ dt.DirectoryList.Update(msg)
}
- dt.buildTree()
- dt.listIdx = findString(dt.dirs, dt.selecting)
- dt.Select(dt.selecting)
- dt.Scrollable = Scrollable{}
- })
+ default:
+ dt.DirectoryList.Update(msg)
+ }
}
func (dt *DirectoryTree) Draw(ctx *ui.Context) {