about summary refs log tree commit diff stats
path: root/widgets/dirlist.go
diff options
context:
space:
mode:
authorARaspiK <araspik@protonmail.com>2020-07-01 07:52:14 +0000
committerReto Brunner <reto@labrat.space>2020-07-02 09:13:14 +0200
commite1c2b596dc9e45976253d75a6b704914fcdcb82c (patch)
tree793aed9505dc3c47da5aa44f3ffb25ff40cb0da5 /widgets/dirlist.go
parentbf16ccde484ce3b6d2a4b843e7ebc04a9b2a957d (diff)
downloadaerc-e1c2b596dc9e45976253d75a6b704914fcdcb82c.tar.gz
Add a 'folders-exclude' option
Added a 'folders-exclude' option that allows removing selected folders
from the directory list sidebar. My motivating example was that removing
a single folder from the list using Golang regexes seemed pretty hard,
so this is a better way to do it. The excluded folders list is included
in the man page.
Diffstat (limited to 'widgets/dirlist.go')
-rw-r--r--widgets/dirlist.go45
1 files changed, 31 insertions, 14 deletions
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index f12631b..3711544 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -390,24 +390,41 @@ func (dirlist *DirectoryList) sortDirsByFoldersSortConfig() {
 }
 
 // filterDirsByFoldersConfig sets dirlist.dirs to the filtered subset of the
-// dirstore, based on the AccountConfig.Folders option
+// dirstore, based on AccountConfig.Folders (inclusion) and
+// AccountConfig.FoldersExclude (exclusion), in that order.
 func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
-	dirlist.dirs = dirlist.store.List()
-	// config option defaults to show all if unset
-	configFolders := dirlist.acctConf.Folders
-	if len(configFolders) == 0 {
-		return
-	}
-	var filtered []string
-	for _, folder := range dirlist.dirs {
-		for _, cfgfolder := range configFolders {
-			if folderMatches(folder, cfgfolder) {
-				filtered = append(filtered, folder)
-				break
+	filterDirs := func(orig, filters []string, exclude bool) []string {
+		if len(filters) == 0 {
+			return orig
+		}
+		var dest []string
+		for _, folder := range orig {
+			// When excluding, include things by default, and vice-versa
+			include := exclude
+			for _, f := range filters {
+				if folderMatches(folder, f) {
+					// If matched an exclusion, don't include
+					// If matched an inclusion, do include
+					include = !exclude
+					break
+				}
+			}
+			if include {
+				dest = append(dest, folder)
 			}
 		}
+		return dest
 	}
-	dirlist.dirs = filtered
+
+	dirlist.dirs = dirlist.store.List()
+
+	// 'folders' (if available) is used to make the initial list and
+	// 'folders-exclude' removes from that list.
+	configFolders := dirlist.acctConf.Folders
+	dirlist.dirs = filterDirs(dirlist.dirs, configFolders, false)
+
+	configFoldersExclude := dirlist.acctConf.FoldersExclude
+	dirlist.dirs = filterDirs(dirlist.dirs, configFoldersExclude, true)
 }
 
 func (dirlist *DirectoryList) SelectedMsgStore() (*lib.MessageStore, bool) {