diff options
Diffstat (limited to 'config')
-rw-r--r-- | config/style.go | 233 | ||||
-rw-r--r-- | config/ui.go | 16 |
2 files changed, 206 insertions, 43 deletions
diff --git a/config/style.go b/config/style.go index 8a88dcfc..efe84722 100644 --- a/config/style.go +++ b/config/style.go @@ -9,8 +9,8 @@ import ( "strings" "git.sr.ht/~rjarry/aerc/lib/xdg" + "git.sr.ht/~rockorager/vaxis" "github.com/emersion/go-message/mail" - "github.com/gdamore/tcell/v2" "github.com/go-ini/ini" ) @@ -116,8 +116,8 @@ var StyleNames = map[string]StyleObject{ } type Style struct { - Fg tcell.Color - Bg tcell.Color + Fg vaxis.Color + Bg vaxis.Color Bold bool Blink bool Underline bool @@ -129,16 +129,30 @@ type Style struct { re *regexp.Regexp // only for msglist } -func (s Style) Get() tcell.Style { - return tcell.StyleDefault. - Foreground(s.Fg). - Background(s.Bg). - Bold(s.Bold). - Blink(s.Blink). - Underline(s.Underline). - Reverse(s.Reverse). - Italic(s.Italic). - Dim(s.Dim) +func (s Style) Get() vaxis.Style { + vx := vaxis.Style{ + Foreground: s.Fg, + Background: s.Bg, + } + if s.Bold { + vx.Attribute |= vaxis.AttrBold + } + if s.Blink { + vx.Attribute |= vaxis.AttrBlink + } + if s.Underline { + vx.UnderlineStyle |= vaxis.UnderlineSingle + } + if s.Reverse { + vx.Attribute |= vaxis.AttrReverse + } + if s.Italic { + vx.Attribute |= vaxis.AttrItalic + } + if s.Dim { + vx.Attribute |= vaxis.AttrDim + } + return vx } func (s *Style) Normal() { @@ -151,8 +165,8 @@ func (s *Style) Normal() { } func (s *Style) Default() *Style { - s.Fg = tcell.ColorDefault - s.Bg = tcell.ColorDefault + s.Fg = 0 + s.Bg = 0 return s } @@ -176,15 +190,22 @@ func boolSwitch(val string, cur_val bool) (bool, error) { } } -func extractColor(val string) tcell.Color { +func extractColor(val string) vaxis.Color { // Check if the string can be interpreted as a number, indicating a // reference to the color number. Otherwise retrieve the number based // on the name. if i, err := strconv.ParseUint(val, 10, 8); err == nil { - return tcell.PaletteColor(int(i)) - } else { - return tcell.GetColor(val) + return vaxis.IndexColor(uint8(i)) + } + if strings.HasPrefix(val, "#") { + val = strings.TrimPrefix(val, "#") + hex, err := strconv.ParseUint(val, 16, 32) + if err != nil { + return 0 + } + return vaxis.HexColor(uint32(hex)) } + return colorNames[val] } func (s *Style) Set(attr, val string) error { @@ -243,10 +264,10 @@ func (s *Style) Set(attr, val string) error { func (s Style) composeWith(styles []*Style) Style { newStyle := s for _, st := range styles { - if st.Fg != s.Fg && st.Fg != tcell.ColorDefault { + if st.Fg != s.Fg && st.Fg != 0 { newStyle.Fg = st.Fg } - if st.Bg != s.Bg && st.Bg != tcell.ColorDefault { + if st.Bg != s.Bg && st.Bg != 0 { newStyle.Bg = st.Bg } if st.Bold != s.Bold { @@ -297,13 +318,13 @@ func NewStyleSet() StyleSet { // *error.bold=true conf.base.Bold = true // error.fg=red - conf.base.Fg = tcell.ColorRed + conf.base.Fg = vaxis.IndexColor(1) case STYLE_WARNING: // warning.fg=yellow - conf.base.Fg = tcell.ColorYellow + conf.base.Fg = vaxis.IndexColor(3) case STYLE_SUCCESS: // success.fg=green - conf.base.Fg = tcell.ColorGreen + conf.base.Fg = vaxis.IndexColor(2) case STYLE_TITLE: // title.reverse=true conf.base.Reverse = true @@ -315,28 +336,28 @@ func NewStyleSet() StyleSet { conf.base.Reverse = true case STYLE_STATUSLINE_ERROR: // *error.bold=true - conf.base.Fg = tcell.ColorRed + conf.base.Fg = vaxis.IndexColor(1) // statusline_error.fg=red conf.base.Bold = true // statusline_error.reverse=true conf.base.Reverse = true case STYLE_STATUSLINE_WARNING: // statusline_warning.fg=yellow - conf.base.Fg = tcell.ColorYellow + conf.base.Fg = vaxis.IndexColor(3) // statusline_warning.reverse=true conf.base.Reverse = true case STYLE_STATUSLINE_SUCCESS: - conf.base.Fg = tcell.ColorGreen + conf.base.Fg = vaxis.IndexColor(2) conf.base.Reverse = true case STYLE_MSGLIST_UNREAD: // msglist_unread.bold=true conf.base.Bold = true case STYLE_MSGLIST_DELETED: // msglist_deleted.fg=gray - conf.base.Fg = tcell.ColorGray + conf.base.Fg = vaxis.IndexColor(8) case STYLE_MSGLIST_RESULT: // msglist_result.fg=green - conf.base.Fg = tcell.ColorGreen + conf.base.Fg = vaxis.IndexColor(2) case STYLE_MSGLIST_PILL: // msglist_pill.reverse=true conf.base.Reverse = true @@ -391,24 +412,24 @@ func (c *StyleConf) getStyle(h *mail.Header) *Style { return &c.base } -func (ss StyleSet) Get(so StyleObject, h *mail.Header) tcell.Style { +func (ss StyleSet) Get(so StyleObject, h *mail.Header) vaxis.Style { return ss.objects[so].getStyle(h).Get() } -func (ss StyleSet) Selected(so StyleObject, h *mail.Header) tcell.Style { +func (ss StyleSet) Selected(so StyleObject, h *mail.Header) vaxis.Style { return ss.selected[so].getStyle(h).Get() } -func (ss StyleSet) UserStyle(name string) tcell.Style { +func (ss StyleSet) UserStyle(name string) vaxis.Style { if style, found := ss.user[name]; found { return style.Get() } - return tcell.StyleDefault + return vaxis.Style{} } func (ss StyleSet) Compose( so StyleObject, sos []StyleObject, h *mail.Header, -) tcell.Style { +) vaxis.Style { base := *ss.objects[so].getStyle(h) styles := make([]*Style, len(sos)) for i, so := range sos { @@ -420,7 +441,7 @@ func (ss StyleSet) Compose( func (ss StyleSet) ComposeSelected( so StyleObject, sos []StyleObject, h *mail.Header, -) tcell.Style { +) vaxis.Style { base := *ss.selected[so].getStyle(h) styles := make([]*Style, len(sos)) for i, so := range sos { @@ -590,3 +611,145 @@ func fnmatchToRegex(pattern string) (*regexp.Regexp, error) { p = strings.ReplaceAll(p, `\*`, `.*`) return regexp.Compile(strings.ReplaceAll(p, `\?`, `.`)) } + +var colorNames = map[string]vaxis.Color{ + "black": vaxis.IndexColor(0), + "maroon": vaxis.IndexColor(1), + "green": vaxis.IndexColor(2), + "olive": vaxis.IndexColor(3), + "navy": vaxis.IndexColor(4), + "purple": vaxis.IndexColor(5), + "teal": vaxis.IndexColor(6), + "silver": vaxis.IndexColor(7), + "gray": vaxis.IndexColor(8), + "red": vaxis.IndexColor(9), + "lime": vaxis.IndexColor(10), + "yellow": vaxis.IndexColor(11), + "blue": vaxis.IndexColor(12), + "fuchsia": vaxis.IndexColor(13), + "aqua": vaxis.IndexColor(14), + "white": vaxis.IndexColor(15), + "aliceblue": vaxis.HexColor(0xF0F8FF), + "antiquewhite": vaxis.HexColor(0xFAEBD7), + "aquamarine": vaxis.HexColor(0x7FFFD4), + "azure": vaxis.HexColor(0xF0FFFF), + "beige": vaxis.HexColor(0xF5F5DC), + "bisque": vaxis.HexColor(0xFFE4C4), + "blanchedalmond": vaxis.HexColor(0xFFEBCD), + "blueviolet": vaxis.HexColor(0x8A2BE2), + "brown": vaxis.HexColor(0xA52A2A), + "burlywood": vaxis.HexColor(0xDEB887), + "cadetblue": vaxis.HexColor(0x5F9EA0), + "chartreuse": vaxis.HexColor(0x7FFF00), + "chocolate": vaxis.HexColor(0xD2691E), + "coral": vaxis.HexColor(0xFF7F50), + "cornflowerblue": vaxis.HexColor(0x6495ED), + "cornsilk": vaxis.HexColor(0xFFF8DC), + "crimson": vaxis.HexColor(0xDC143C), + "darkblue": vaxis.HexColor(0x00008B), + "darkcyan": vaxis.HexColor(0x008B8B), + "darkgoldenrod": vaxis.HexColor(0xB8860B), + "darkgray": vaxis.HexColor(0xA9A9A9), + "darkgreen": vaxis.HexColor(0x006400), + "darkkhaki": vaxis.HexColor(0xBDB76B), + "darkmagenta": vaxis.HexColor(0x8B008B), + "darkolivegreen": vaxis.HexColor(0x556B2F), + "darkorange": vaxis.HexColor(0xFF8C00), + "darkorchid": vaxis.HexColor(0x9932CC), + "darkred": vaxis.HexColor(0x8B0000), + "darksalmon": vaxis.HexColor(0xE9967A), + "darkseagreen": vaxis.HexColor(0x8FBC8F), + "darkslateblue": vaxis.HexColor(0x483D8B), + "darkslategray": vaxis.HexColor(0x2F4F4F), + "darkturquoise": vaxis.HexColor(0x00CED1), + "darkviolet": vaxis.HexColor(0x9400D3), + "deeppink": vaxis.HexColor(0xFF1493), + "deepskyblue": vaxis.HexColor(0x00BFFF), + "dimgray": vaxis.HexColor(0x696969), + "dodgerblue": vaxis.HexColor(0x1E90FF), + "firebrick": vaxis.HexColor(0xB22222), + "floralwhite": vaxis.HexColor(0xFFFAF0), + "forestgreen": vaxis.HexColor(0x228B22), + "gainsboro": vaxis.HexColor(0xDCDCDC), + "ghostwhite": vaxis.HexColor(0xF8F8FF), + "gold": vaxis.HexColor(0xFFD700), + "goldenrod": vaxis.HexColor(0xDAA520), + "greenyellow": vaxis.HexColor(0xADFF2F), + "honeydew": vaxis.HexColor(0xF0FFF0), + "hotpink": vaxis.HexColor(0xFF69B4), + "indianred": vaxis.HexColor(0xCD5C5C), + "indigo": vaxis.HexColor(0x4B0082), + "ivory": vaxis.HexColor(0xFFFFF0), + "khaki": vaxis.HexColor(0xF0E68C), + "lavender": vaxis.HexColor(0xE6E6FA), + "lavenderblush": vaxis.HexColor(0xFFF0F5), + "lawngreen": vaxis.HexColor(0x7CFC00), + "lemonchiffon": vaxis.HexColor(0xFFFACD), + "lightblue": vaxis.HexColor(0xADD8E6), + "lightcoral": vaxis.HexColor(0xF08080), + "lightcyan": vaxis.HexColor(0xE0FFFF), + "lightgoldenrodyellow": vaxis.HexColor(0xFAFAD2), + "lightgray": vaxis.HexColor(0xD3D3D3), + "lightgreen": vaxis.HexColor(0x90EE90), + "lightpink": vaxis.HexColor(0xFFB6C1), + "lightsalmon": vaxis.HexColor(0xFFA07A), + "lightseagreen": vaxis.HexColor(0x20B2AA), + "lightskyblue": vaxis.HexColor(0x87CEFA), + "lightslategray": vaxis.HexColor(0x778899), + "lightsteelblue": vaxis.HexColor(0xB0C4DE), + "lightyellow": vaxis.HexColor(0xFFFFE0), + "limegreen": vaxis.HexColor(0x32CD32), + "linen": vaxis.HexColor(0xFAF0E6), + "mediumaquamarine": vaxis.HexColor(0x66CDAA), + "mediumblue": vaxis.HexColor(0x0000CD), + "mediumorchid": vaxis.HexColor(0xBA55D3), + "mediumpurple": vaxis.HexColor(0x9370DB), + "mediumseagreen": vaxis.HexColor(0x3CB371), + "mediumslateblue": vaxis.HexColor(0x7B68EE), + "mediumspringgreen": vaxis.HexColor(0x00FA9A), + "mediumturquoise": vaxis.HexColor(0x48D1CC), + "mediumvioletred": vaxis.HexColor(0xC71585), + "midnightblue": vaxis.HexColor(0x191970), + "mintcream": vaxis.HexColor(0xF5FFFA), + "mistyrose": vaxis.HexColor(0xFFE4E1), + "moccasin": vaxis.HexColor(0xFFE4B5), + "navajowhite": vaxis.HexColor(0xFFDEAD), + "oldlace": vaxis.HexColor(0xFDF5E6), + "olivedrab": vaxis.HexColor(0x6B8E23), + "orange": vaxis.HexColor(0xFFA500), + "orangered": vaxis.HexColor(0xFF4500), + "orchid": vaxis.HexColor(0xDA70D6), + "palegoldenrod": vaxis.HexColor(0xEEE8AA), + "palegreen": vaxis.HexColor(0x98FB98), + "paleturquoise": vaxis.HexColor(0xAFEEEE), + "palevioletred": vaxis.HexColor(0xDB7093), + "papayawhip": vaxis.HexColor(0xFFEFD5), + "peachpuff": vaxis.HexColor(0xFFDAB9), + "peru": vaxis.HexColor(0xCD853F), + "pink": vaxis.HexColor(0xFFC0CB), + "plum": vaxis.HexColor(0xDDA0DD), + "powderblue": vaxis.HexColor(0xB0E0E6), + "rebeccapurple": vaxis.HexColor(0x663399), + "rosybrown": vaxis.HexColor(0xBC8F8F), + "royalblue": vaxis.HexColor(0x4169E1), + "saddlebrown": vaxis.HexColor(0x8B4513), + "salmon": vaxis.HexColor(0xFA8072), + "sandybrown": vaxis.HexColor(0xF4A460), + "seagreen": vaxis.HexColor(0x2E8B57), + "seashell": vaxis.HexColor(0xFFF5EE), + "sienna": vaxis.HexColor(0xA0522D), + "skyblue": vaxis.HexColor(0x87CEEB), + "slateblue": vaxis.HexColor(0x6A5ACD), + "slategray": vaxis.HexColor(0x708090), + "snow": vaxis.HexColor(0xFFFAFA), + "springgreen": vaxis.HexColor(0x00FF7F), + "steelblue": vaxis.HexColor(0x4682B4), + "tan": vaxis.HexColor(0xD2B48C), + "thistle": vaxis.HexColor(0xD8BFD8), + "tomato": vaxis.HexColor(0xFF6347), + "turquoise": vaxis.HexColor(0x40E0D0), + "violet": vaxis.HexColor(0xEE82EE), + "wheat": vaxis.HexColor(0xF5DEB3), + "whitesmoke": vaxis.HexColor(0xF5F5F5), + "yellowgreen": vaxis.HexColor(0x9ACD32), +} diff --git a/config/ui.go b/config/ui.go index 87e137a3..ee561a52 100644 --- a/config/ui.go +++ b/config/ui.go @@ -9,8 +9,8 @@ import ( "time" "git.sr.ht/~rjarry/aerc/log" + "git.sr.ht/~rockorager/vaxis" "github.com/emersion/go-message/mail" - "github.com/gdamore/tcell/v2" "github.com/go-ini/ini" ) @@ -280,39 +280,39 @@ func (base *UIConfig) mergeContextual( return base } -func (uiConfig *UIConfig) GetUserStyle(name string) tcell.Style { +func (uiConfig *UIConfig) GetUserStyle(name string) vaxis.Style { return uiConfig.style.UserStyle(name) } -func (uiConfig *UIConfig) GetStyle(so StyleObject) tcell.Style { +func (uiConfig *UIConfig) GetStyle(so StyleObject) vaxis.Style { return uiConfig.style.Get(so, nil) } -func (uiConfig *UIConfig) GetStyleSelected(so StyleObject) tcell.Style { +func (uiConfig *UIConfig) GetStyleSelected(so StyleObject) vaxis.Style { return uiConfig.style.Selected(so, nil) } func (uiConfig *UIConfig) GetComposedStyle(base StyleObject, styles []StyleObject, -) tcell.Style { +) vaxis.Style { return uiConfig.style.Compose(base, styles, nil) } func (uiConfig *UIConfig) GetComposedStyleSelected( base StyleObject, styles []StyleObject, -) tcell.Style { +) vaxis.Style { return uiConfig.style.ComposeSelected(base, styles, nil) } func (uiConfig *UIConfig) MsgComposedStyle( base StyleObject, styles []StyleObject, h *mail.Header, -) tcell.Style { +) vaxis.Style { return uiConfig.style.Compose(base, styles, h) } func (uiConfig *UIConfig) MsgComposedStyleSelected( base StyleObject, styles []StyleObject, h *mail.Header, -) tcell.Style { +) vaxis.Style { return uiConfig.style.ComposeSelected(base, styles, h) } |