From 9d0297e9d913a92b2d7ae02692e83f0f4093a766 Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Sun, 11 Dec 2022 23:57:30 +0100 Subject: config: rework contextual sections implementation The current contextual binds and ui config API is awkward and cumbersome to use. Rework it to make it more elegant. Store the contextual sections as private fields of the UIConfig and KeyBindings structures. Add cache to avoid recomputation of the composed UIConfig and KeyBindings objects every time a contextual item is requested. Replace the cache from DirectoryList with that. Signed-off-by: Robin Jarry Acked-by: Tim Culverhouse --- widgets/account.go | 4 +--- widgets/aerc.go | 19 ++++++++++++------- widgets/compose.go | 5 +---- widgets/dirlist.go | 18 +----------------- widgets/msglist.go | 14 ++------------ widgets/msgviewer.go | 7 +------ 6 files changed, 18 insertions(+), 49 deletions(-) (limited to 'widgets') diff --git a/widgets/account.go b/widgets/account.go index c8c58b1e..838dd624 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -58,9 +58,7 @@ func (acct *AccountView) UiConfig() *config.UIConfig { func NewAccountView(aerc *Aerc, conf *config.AercConfig, acct *config.AccountConfig, host TabHost, deferLoop chan struct{}, ) (*AccountView, error) { - acctUiConf := conf.GetUiConfig(map[config.ContextType]string{ - config.UI_CONTEXT_ACCOUNT: acct.Name, - }) + acctUiConf := conf.Ui.ForAccount(acct.Name) view := &AccountView{ acct: acct, diff --git a/widgets/aerc.go b/widgets/aerc.go index ca82ee28..97e3c663 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -229,25 +229,30 @@ func (aerc *Aerc) getBindings() *config.KeyBindings { } switch view := aerc.SelectedTabContent().(type) { case *AccountView: - binds := aerc.conf.MergeContextualBinds(aerc.conf.Bindings.MessageList, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "messages") - return aerc.conf.MergeContextualBinds(binds, config.BIND_CONTEXT_FOLDER, view.SelectedDirectory(), "messages") + binds := aerc.conf.Bindings.MessageList.ForAccount(selectedAccountName) + return binds.ForFolder(view.SelectedDirectory()) case *AccountWizard: return aerc.conf.Bindings.AccountWizard case *Composer: switch view.Bindings() { case "compose::editor": - return aerc.conf.MergeContextualBinds(aerc.conf.Bindings.ComposeEditor, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "compose::editor") + return aerc.conf.Bindings.ComposeEditor.ForAccount( + selectedAccountName) case "compose::review": - return aerc.conf.MergeContextualBinds(aerc.conf.Bindings.ComposeReview, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "compose::review") + return aerc.conf.Bindings.ComposeReview.ForAccount( + selectedAccountName) default: - return aerc.conf.MergeContextualBinds(aerc.conf.Bindings.Compose, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "compose") + return aerc.conf.Bindings.Compose.ForAccount( + selectedAccountName) } case *MessageViewer: switch view.Bindings() { case "view::passthrough": - return aerc.conf.MergeContextualBinds(aerc.conf.Bindings.MessageViewPassthrough, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "view::passthrough") + return aerc.conf.Bindings.MessageViewPassthrough.ForAccount( + selectedAccountName) default: - return aerc.conf.MergeContextualBinds(aerc.conf.Bindings.MessageView, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "view") + return aerc.conf.Bindings.MessageView.ForAccount( + selectedAccountName) } case *Terminal: return aerc.conf.Bindings.Terminal diff --git a/widgets/compose.go b/widgets/compose.go index 37e09ccb..4cf7da16 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -1261,11 +1261,8 @@ type reviewMessage struct { } func newReviewMessage(composer *Composer, err error) *reviewMessage { - bindings := composer.config.MergeContextualBinds( - composer.config.Bindings.ComposeReview, - config.BIND_CONTEXT_ACCOUNT, + bindings := composer.config.Bindings.ComposeReview.ForAccount( composer.acctConfig.Name, - "compose::review", ) reviewCommands := [][]string{ diff --git a/widgets/dirlist.go b/widgets/dirlist.go index e4f867eb..0b41c024 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -8,7 +8,6 @@ import ( "regexp" "sort" "strings" - "sync" "time" "github.com/gdamore/tcell/v2" @@ -48,7 +47,6 @@ type DirectoryLister interface { } type DirectoryList struct { - sync.Mutex Scrollable aercConf *config.AercConfig acctConf *config.AccountConfig @@ -60,7 +58,6 @@ type DirectoryList struct { worker *types.Worker skipSelect context.Context skipSelectCancel context.CancelFunc - uiConf map[string]*config.UIConfig } func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, @@ -68,8 +65,6 @@ func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, ) DirectoryLister { ctx, cancel := context.WithCancel(context.Background()) - uiConfMap := make(map[string]*config.UIConfig) - dirlist := &DirectoryList{ aercConf: conf, acctConf: acctConf, @@ -77,7 +72,6 @@ func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, worker: worker, skipSelect: ctx, skipSelectCancel: cancel, - uiConf: uiConfMap, } uiConf := dirlist.UiConfig("") dirlist.spinner = NewSpinner(uiConf) @@ -91,20 +85,10 @@ func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, } func (dirlist *DirectoryList) UiConfig(dir string) *config.UIConfig { - dirlist.Lock() - defer dirlist.Unlock() 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: dir, - }) - dirlist.uiConf[dir] = ui - return ui + return dirlist.aercConf.Ui.ForAccount(dirlist.acctConf.Name).ForFolder(dir) } func (dirlist *DirectoryList) List() []string { diff --git a/widgets/msglist.go b/widgets/msglist.go index 09ee705e..85b8f168 100644 --- a/widgets/msglist.go +++ b/widgets/msglist.go @@ -202,19 +202,9 @@ func (ml *MessageList) drawRow(textWidth int, ctx *ui.Context, uid uint32, row i // TODO deprecate subject contextual UIs? Only related setting is styleset, // should implement a better per-message styling method // Check if we have any applicable ContextualUIConfigs - confs := ml.aerc.conf.GetContextualUIConfigs() 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)) { - confParams := map[config.ContextType]string{ - config.UI_CONTEXT_ACCOUNT: acct.AccountConfig().Name, - config.UI_CONTEXT_FOLDER: acct.Directories().Selected(), - config.UI_CONTEXT_SUBJECT: msg.Envelope.Subject, - } - uiConfig = ml.conf.GetUiConfig(confParams) - } - } + if msg.Envelope != nil { + uiConfig = uiConfig.ForSubject(msg.Envelope.Subject) } msg_styles := []config.StyleObject{} diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index 6c929578..875ff873 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -738,12 +738,7 @@ var noFilterConfiguredCommands = [][]string{ } func newNoFilterConfigured(pv *PartViewer) *ui.Grid { - bindings := pv.conf.MergeContextualBinds( - pv.conf.Bindings.MessageView, - config.BIND_CONTEXT_ACCOUNT, - pv.acctConfig.Name, - "view", - ) + bindings := pv.conf.Bindings.MessageView.ForAccount(pv.acctConfig.Name) var actions []string -- cgit