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:
@@ -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
|
||||||
|
|
||||||
|
@@ -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
63
pkg/theme/theme_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user