aboutsummaryrefslogtreecommitdiffstats
path: root/config/config.go
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2020-05-27 07:37:02 +0200
committerReto Brunner <reto@labrat.space>2020-05-27 07:57:10 +0200
commit0f78f06610c0e8887aba2ae50e99b86477a384b3 (patch)
treeff4cd6581d3af0911954a37550602366d2bb0e2f /config/config.go
parent6c4ed3cfe2fe66a1e5f26c404ea90e048142db72 (diff)
downloadaerc-0f78f06610c0e8887aba2ae50e99b86477a384b3.tar.gz
Add Style configuration
The following functionalities are added to configure aerc ui styles. - Read stylesets from file with very basic fnmatch wildcard matching - Add default styleset - Support different stylesets as part of UiConfig allowing contextual styles. - Move widgets/ui elements to use the stylesets. - Add configuration manual for the styleset
Diffstat (limited to 'config/config.go')
-rw-r--r--config/config.go63
1 files changed, 57 insertions, 6 deletions
diff --git a/config/config.go b/config/config.go
index 8ebd69d3..c4307241 100644
--- a/config/config.go
+++ b/config/config.go
@@ -45,6 +45,9 @@ type UIConfig struct {
NextMessageOnDelete bool `ini:"next-message-on-delete"`
CompletionDelay time.Duration `ini:"completion-delay"`
CompletionPopovers bool `ini:"completion-popovers"`
+ StyleSetDirs []string `ini:"stylesets-dirs", delim:":"`
+ StyleSetName string `ini:"styleset-name"`
+ style StyleSet
}
type ContextType int
@@ -332,6 +335,11 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
if err := ui.MapTo(&config.Ui); err != nil {
return err
}
+
+ stylesetsDirs := ui.Key("stylesets-dirs").String()
+ if stylesetsDirs != "" {
+ config.Ui.StyleSetDirs = strings.Split(stylesetsDirs, ":")
+ }
}
for _, sectionName := range file.SectionStrings() {
if !strings.Contains(sectionName, "ui:") {
@@ -346,6 +354,10 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
if err := uiSection.MapTo(&uiSubConfig); err != nil {
return err
}
+ stylesetsDirs := uiSection.Key("stylesets-dirs").String()
+ if stylesetsDirs != "" {
+ uiSubConfig.StyleSetDirs = strings.Split(stylesetsDirs, ":")
+ }
contextualUi :=
UIConfigContext{
UiConfig: uiSubConfig,
@@ -406,6 +418,19 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
}
}
}
+
+ if err := config.Ui.loadStyleSet(
+ config.Ui.StyleSetDirs); err != nil {
+ return err
+ }
+
+ for idx, _ := range config.ContextualUis {
+ if err := config.ContextualUis[idx].UiConfig.loadStyleSet(
+ config.Ui.StyleSetDirs); err != nil {
+ return err
+ }
+ }
+
return nil
}
@@ -466,6 +491,8 @@ func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) {
NextMessageOnDelete: true,
CompletionDelay: 250 * time.Millisecond,
CompletionPopovers: true,
+ StyleSetDirs: []string{path.Join(sharedir, "stylesets")},
+ StyleSetName: "default",
},
ContextualUis: []UIConfigContext{},
@@ -495,6 +522,7 @@ func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) {
Forwards: "forward_as_body",
},
}
+
// These bindings are not configurable
config.Bindings.AccountWizard.ExKey = KeyStroke{
Key: tcell.KeyCtrlE,
@@ -505,6 +533,7 @@ func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) {
if err = config.LoadConfig(file); err != nil {
return nil, err
}
+
if ui, err := file.GetSection("general"); err == nil {
if err := ui.MapTo(&config.General); err != nil {
return nil, err
@@ -612,8 +641,17 @@ func parseLayout(layout string) [][]string {
return l
}
-func (config *AercConfig) mergeContextualUi(baseUi *UIConfig,
- contextType ContextType, s string) {
+func (ui *UIConfig) loadStyleSet(styleSetDirs []string) error {
+ ui.style = NewStyleSet()
+ if err := ui.style.ParseStyleSet(ui.StyleSetName, styleSetDirs); err != nil {
+ return fmt.Errorf("Error whie parsing styleset \"%s\": %s", ui.StyleSetName, err)
+ }
+
+ return nil
+}
+
+func (config AercConfig) mergeContextualUi(baseUi UIConfig,
+ contextType ContextType, s string) UIConfig {
for _, contextualUi := range config.ContextualUis {
if contextualUi.ContextType != contextType {
continue
@@ -623,17 +661,30 @@ func (config *AercConfig) mergeContextualUi(baseUi *UIConfig,
continue
}
- mergo.MergeWithOverwrite(baseUi, contextualUi.UiConfig)
- return
+ mergo.Merge(&baseUi, contextualUi.UiConfig, mergo.WithOverride)
+ if contextualUi.UiConfig.StyleSetName != "" {
+ baseUi.style = contextualUi.UiConfig.style
+ }
+ return baseUi
}
+
+ return baseUi
}
-func (config *AercConfig) GetUiConfig(params map[ContextType]string) UIConfig {
+func (config AercConfig) GetUiConfig(params map[ContextType]string) UIConfig {
baseUi := config.Ui
for k, v := range params {
- config.mergeContextualUi(&baseUi, k, v)
+ baseUi = config.mergeContextualUi(baseUi, k, v)
}
return baseUi
}
+
+func (uiConfig UIConfig) GetStyle(so StyleObject) tcell.Style {
+ return uiConfig.style.Get(so)
+}
+
+func (uiConfig UIConfig) GetStyleSelected(so StyleObject) tcell.Style {
+ return uiConfig.style.Selected(so)
+}