1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-08-06 11:02:41 +03: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) For color attributes you can choose an array of attributes (with max one color attribute)
The available attributes are: The available attributes are:
- default **Colors**
- black - black
- red - red
- green - green
@@ -261,7 +262,12 @@ The available attributes are:
- magenta - magenta
- cyan - cyan
- white - white
- '#ff00ff' # can't be used on text
**Modifiers**
- bold - bold
- default
- reverse # useful for high-contrast - reverse # useful for high-contrast
- underline - underline

View File

@@ -1,6 +1,8 @@
package theme package theme
import ( import (
"encoding/hex"
"github.com/fatih/color" "github.com/fatih/color"
"github.com/jesseduffield/gocui" "github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/config" "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 // GetAttribute gets the gocui color attribute from the string
func GetGocuiAttribute(key string) gocui.Attribute { 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{ colorMap := map[string]gocui.Attribute{
"default": gocui.ColorDefault, "default": gocui.ColorDefault,
"black": gocui.ColorBlack, "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)
}
})
}
}