1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-01-20 05:19:24 +02:00

Allow hex theme colors

This commit is contained in:
mjarkk 2021-07-25 12:18:10 +02:00
parent c005b0d92b
commit 4fca89bc52
3 changed files with 97 additions and 1 deletions

View File

@ -252,7 +252,8 @@ os:
For color attributes you can choose an array of attributes (with max one color attribute)
The available attributes are:
- default
**Colors**
- black
- red
- green
@ -261,7 +262,12 @@ The available attributes are:
- magenta
- cyan
- white
- '#ff00ff' # can't be used on text
**Modifiers**
- bold
- default
- reverse # useful for high-contrast
- underline

View File

@ -1,6 +1,8 @@
package theme
import (
"encoding/hex"
"github.com/fatih/color"
"github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/config"
@ -59,8 +61,33 @@ func UpdateTheme(themeConfig config.ThemeConfig) {
}
}
// getHexColorValues returns the rgb values of a hex color
func getHexColorValues(v string) (r int32, g int32, b int32, valid bool) {
if len(v) == 4 {
v = string([]byte{v[0], v[1], v[1], v[2], v[2], v[3], v[3]})
} else if len(v) != 7 {
return
}
if v[0] != '#' {
return
}
rgb, err := hex.DecodeString(v[1:])
if err != nil {
return
}
return int32(rgb[0]), int32(rgb[1]), int32(rgb[2]), true
}
// GetAttribute gets the gocui color attribute from the string
func GetGocuiAttribute(key string) gocui.Attribute {
r, g, b, validHexColor := getHexColorValues(key)
if validHexColor {
return gocui.NewRGBColor(r, g, b)
}
colorMap := map[string]gocui.Attribute{
"default": gocui.ColorDefault,
"black": gocui.ColorBlack,

63
pkg/theme/theme_test.go Normal file
View File

@ -0,0 +1,63 @@
package theme
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestGetHexColorValues(t *testing.T) {
scenarios := []struct {
name string
hexColor string
rgb []int32
valid bool
}{
{
name: "valid uppercase hex color",
hexColor: "#00FF00",
rgb: []int32{0, 255, 0},
valid: true,
},
{
name: "valid lowercase hex color",
hexColor: "#00ff00",
rgb: []int32{0, 255, 0},
valid: true,
},
{
name: "valid short hex color",
hexColor: "#0bf",
rgb: []int32{0, 187, 255},
valid: true,
},
{
name: "invalid hex value",
hexColor: "#zz00ff",
valid: false,
},
{
name: "invalid length hex color",
hexColor: "#",
valid: false,
},
{
name: "invalid length hex color",
hexColor: "#aaaaaaaaaaa",
valid: false,
},
}
for _, s := range scenarios {
s := s
t.Run(s.name, func(t *testing.T) {
r, g, b, valid := getHexColorValues(s.hexColor)
assert.EqualValues(t, s.valid, valid, s.hexColor)
if valid {
assert.EqualValues(t, s.rgb[0], r, s.hexColor)
assert.EqualValues(t, s.rgb[1], g, s.hexColor)
assert.EqualValues(t, s.rgb[2], b, s.hexColor)
}
})
}
}