From e1b62db583c39ae67cd6aa02b0ebde642eda308c Mon Sep 17 00:00:00 2001 From: Tim Culverhouse Date: Fri, 12 Aug 2022 14:51:25 -0500 Subject: [PATCH] fix: Set proper UIConfig for msgstores The merged UIConfig used to create new message stores is based on the selected directory. If the message store is created by other means than selecting (ListDirectories for maildir/notmuch/mbox, or check-mail) it may have an incorrect configuration if the user has folder-specific values for: - Threaded view - Client built threads - Client threads delay - Sort criteria - NewMessage bell Use the correct merged UIConfig when creating a new message store. Signed-off-by: Tim Culverhouse Acked-by: Robin Jarry --- widgets/account.go | 11 ++++++----- widgets/dirlist.go | 29 ++++++++++++++++------------- widgets/dirtree.go | 10 +++++----- widgets/msglist.go | 2 +- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/widgets/account.go b/widgets/account.go index b92a619..bc2dc36 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -42,7 +42,7 @@ type AccountView struct { func (acct *AccountView) UiConfig() *config.UIConfig { if dirlist := acct.Directories(); dirlist != nil { - return dirlist.UiConfig() + return dirlist.UiConfig("") } return acct.uiConf } @@ -291,16 +291,17 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) { if store, ok := acct.dirlist.MsgStore(msg.Info.Name); ok { store.Update(msg) } else { + name := msg.Info.Name store = lib.NewMessageStore(acct.worker, msg.Info, acct.GetSortCriteria(), - acct.UiConfig().ThreadingEnabled, - acct.UiConfig().ForceClientThreads, - acct.UiConfig().ClientThreadsDelay, + acct.dirlist.UiConfig(name).ThreadingEnabled, + acct.dirlist.UiConfig(name).ForceClientThreads, + acct.dirlist.UiConfig(name).ClientThreadsDelay, func(msg *models.MessageInfo) { acct.conf.Triggers.ExecNewEmail(acct.acct, acct.conf, msg) }, func() { - if acct.UiConfig().NewMessageBell { + if acct.dirlist.UiConfig(name).NewMessageBell { acct.host.Beep() } }) diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 03f9239..38f3c84 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -43,7 +43,7 @@ type DirectoryLister interface { FilterDirs([]string, []string, bool) []string - UiConfig() *config.UIConfig + UiConfig(string) *config.UIConfig } type DirectoryList struct { @@ -78,7 +78,7 @@ func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, skipSelectCancel: cancel, uiConf: uiConfMap, } - uiConf := dirlist.UiConfig() + uiConf := dirlist.UiConfig("") dirlist.spinner = NewSpinner(uiConf) dirlist.spinner.OnInvalidate(func(_ ui.Drawable) { dirlist.Invalidate() @@ -92,15 +92,18 @@ func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, return dirlist } -func (dirlist *DirectoryList) UiConfig() *config.UIConfig { - if ui, ok := dirlist.uiConf[dirlist.Selected()]; ok { +func (dirlist *DirectoryList) UiConfig(dir string) *config.UIConfig { + if dir == "" { + dir = dirlist.Selected() + } + if ui, ok := dirlist.uiConf[dir]; ok { return ui } ui := dirlist.aercConf.GetUiConfig(map[config.ContextType]string{ config.UI_CONTEXT_ACCOUNT: dirlist.acctConf.Name, - config.UI_CONTEXT_FOLDER: dirlist.Selected(), + config.UI_CONTEXT_FOLDER: dir, }) - dirlist.uiConf[dirlist.Selected()] = ui + dirlist.uiConf[dir] = ui return ui } @@ -154,7 +157,7 @@ func (dirlist *DirectoryList) Select(name string) { defer logging.PanicHandler() select { - case <-time.After(dirlist.UiConfig().DirListDelay): + case <-time.After(dirlist.UiConfig(name).DirListDelay): newStore := true for _, s := range dirlist.store.List() { if s == dirlist.selecting { @@ -218,7 +221,7 @@ func (dirlist *DirectoryList) getDirString(name string, width int, recentUnseen formatted = runewidth.FillRight(formatted, width-len(s)) formatted = runewidth.Truncate(formatted, width-len(s), "…") } - for _, char := range dirlist.UiConfig().DirListFormat { + for _, char := range dirlist.UiConfig(name).DirListFormat { switch char { case '%': if percent { @@ -283,7 +286,7 @@ func (dirlist *DirectoryList) getRUEString(name string) string { func (dirlist *DirectoryList) Draw(ctx *ui.Context) { ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', - dirlist.UiConfig().GetStyle(config.STYLE_DIRLIST_DEFAULT)) + dirlist.UiConfig("").GetStyle(config.STYLE_DIRLIST_DEFAULT)) if dirlist.spinner.IsRunning() { dirlist.spinner.Draw(ctx) @@ -291,8 +294,8 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { } if len(dirlist.dirs) == 0 { - style := dirlist.UiConfig().GetStyle(config.STYLE_DIRLIST_DEFAULT) - ctx.Printf(0, 0, style, dirlist.UiConfig().EmptyDirlist) + style := dirlist.UiConfig("").GetStyle(config.STYLE_DIRLIST_DEFAULT) + ctx.Printf(0, 0, style, dirlist.UiConfig("").EmptyDirlist) return } @@ -324,10 +327,10 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { case 2: dirStyle = append(dirStyle, config.STYLE_DIRLIST_RECENT) } - style := dirlist.UiConfig().GetComposedStyle( + style := dirlist.UiConfig(name).GetComposedStyle( config.STYLE_DIRLIST_DEFAULT, dirStyle) if name == dirlist.selecting { - style = dirlist.UiConfig().GetComposedStyleSelected( + style = dirlist.UiConfig(name).GetComposedStyleSelected( config.STYLE_DIRLIST_DEFAULT, dirStyle) } ctx.Fill(0, row, textWidth, 1, ' ', style) diff --git a/widgets/dirtree.go b/widgets/dirtree.go index c3b8077..65fb311 100644 --- a/widgets/dirtree.go +++ b/widgets/dirtree.go @@ -51,7 +51,7 @@ func (dt *DirectoryTree) UpdateList(done func([]string)) { func (dt *DirectoryTree) Draw(ctx *ui.Context) { ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', - dt.UiConfig().GetStyle(config.STYLE_DIRLIST_DEFAULT)) + dt.UiConfig("").GetStyle(config.STYLE_DIRLIST_DEFAULT)) if dt.DirectoryList.spinner.IsRunning() { dt.DirectoryList.spinner.Draw(ctx) @@ -60,8 +60,8 @@ func (dt *DirectoryTree) Draw(ctx *ui.Context) { n := dt.countVisible(dt.list) if n == 0 { - style := dt.UiConfig().GetStyle(config.STYLE_DIRLIST_DEFAULT) - ctx.Printf(0, 0, style, dt.UiConfig().EmptyDirlist) + style := dt.UiConfig("").GetStyle(config.STYLE_DIRLIST_DEFAULT) + ctx.Printf(0, 0, style, dt.UiConfig("").EmptyDirlist) return } @@ -104,10 +104,10 @@ func (dt *DirectoryTree) Draw(ctx *ui.Context) { case 2: dirStyle = append(dirStyle, config.STYLE_DIRLIST_RECENT) } - style := dt.UiConfig().GetComposedStyle( + style := dt.UiConfig(path).GetComposedStyle( config.STYLE_DIRLIST_DEFAULT, dirStyle) if i == dt.listIdx { - style = dt.UiConfig().GetComposedStyleSelected( + style = dt.UiConfig(path).GetComposedStyleSelected( config.STYLE_DIRLIST_DEFAULT, dirStyle) } ctx.Fill(0, row, textWidth, 1, ' ', style) diff --git a/widgets/msglist.go b/widgets/msglist.go index e505608..935566f 100644 --- a/widgets/msglist.go +++ b/widgets/msglist.go @@ -201,7 +201,7 @@ func (ml *MessageList) drawRow(textWidth int, ctx *ui.Context, uid uint32, row i // should implement a better per-message styling method // Check if we have any applicable ContextualUIConfigs confs := ml.aerc.conf.GetContextualUIConfigs() - uiConfig := acct.Directories().UiConfig() + uiConfig := acct.Directories().UiConfig(store.DirInfo.Name) for _, c := range confs { if c.ContextType == config.UI_CONTEXT_SUBJECT && msg.Envelope != nil { if c.Regex.Match([]byte(msg.Envelope.Subject)) {