about summary refs log tree commit diff stats
path: root/config/config.go
diff options
context:
space:
mode:
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 8ebd69d..c430724 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)
+}