summary refs log tree commit diff stats
path: root/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'widgets')
-rw-r--r--widgets/dirlist.go36
1 files changed, 34 insertions, 2 deletions
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index ef2dd1e..c0c8917 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -5,6 +5,7 @@ import (
 	"log"
 	"regexp"
 	"sort"
+	"strings"
 
 	"github.com/gdamore/tcell"
 	"github.com/mattn/go-runewidth"
@@ -61,9 +62,10 @@ func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {
 			case *types.Directory:
 				dirs = append(dirs, msg.Dir.Name)
 			case *types.Done:
-				sort.Strings(dirs)
 				dirlist.store.Update(dirs)
 				dirlist.filterDirsByFoldersConfig()
+				dirlist.sortDirsByFoldersSortConfig()
+				dirlist.store.Update(dirlist.dirs)
 				dirlist.spinner.Stop()
 				dirlist.Invalidate()
 				if done != nil {
@@ -94,6 +96,7 @@ func (dirlist *DirectoryList) Select(name string) {
 					dirlist.dirs = append(dirlist.dirs, dirlist.selected)
 				}
 				sort.Strings(dirlist.dirs)
+				dirlist.sortDirsByFoldersSortConfig()
 			}
 			dirlist.Invalidate()
 		})
@@ -261,7 +264,7 @@ func (dirlist *DirectoryList) Clicked(x int, y int) (string, bool) {
 }
 
 func (dirlist *DirectoryList) NextPrev(delta int) {
-	curIdx := sort.SearchStrings(dirlist.dirs, dirlist.selected)
+	curIdx := findString(dirlist.dirs, dirlist.selected)
 	if curIdx == len(dirlist.dirs) {
 		return
 	}
@@ -297,6 +300,26 @@ func folderMatches(folder string, pattern string) bool {
 	return pattern == folder
 }
 
+// sortDirsByFoldersSortConfig sets dirlist.dirs to be sorted based on the
+// AccountConfig.FoldersSort option. Folders not included in the option
+// will be appended at the end in alphabetical order
+func (dirlist *DirectoryList) sortDirsByFoldersSortConfig() {
+	sort.Slice(dirlist.dirs, func(i, j int) bool {
+		iInFoldersSort := findString(dirlist.acctConf.FoldersSort, dirlist.dirs[i])
+		jInFoldersSort := findString(dirlist.acctConf.FoldersSort, dirlist.dirs[j])
+		if iInFoldersSort >= 0 && jInFoldersSort >= 0 {
+			return iInFoldersSort < jInFoldersSort
+		}
+		if iInFoldersSort >= 0 {
+			return true
+		}
+		if jInFoldersSort >= 0 {
+			return false
+		}
+		return strings.Compare(dirlist.dirs[i], dirlist.dirs[j]) == -1
+	})
+}
+
 // filterDirsByFoldersConfig sets dirlist.dirs to the filtered subset of the
 // dirstore, based on the AccountConfig.Folders option
 func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
@@ -331,3 +354,12 @@ func (dirlist *DirectoryList) SetMsgStore(name string, msgStore *lib.MessageStor
 		dirlist.Invalidate()
 	})
 }
+
+func findString(slice []string, str string) int {
+	for i, s := range slice {
+		if str == s {
+			return i
+		}
+	}
+	return -1
+}