From ffb5935164568fc20ce3b803312fe0d51bfa43bf Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Thu, 6 Feb 2025 18:37:29 +0200 Subject: [PATCH] Added config for colors (not yet supported in most areas as I need to make things not static so they color changes) --- internal/client/client.go | 11 +- internal/client/config/config.go | 47 ++++- internal/client/ui/colors/colors.go | 256 +++++++++++++++++++++++++--- 3 files changed, 280 insertions(+), 34 deletions(-) diff --git a/internal/client/client.go b/internal/client/client.go index a779bf9..b0a3447 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -1,6 +1,7 @@ package client import ( + "fmt" "io" "log" "os" @@ -12,6 +13,7 @@ import ( "github.com/kyren223/eko/internal/client/config" "github.com/kyren223/eko/internal/client/ui" "github.com/kyren223/eko/internal/client/ui/auth" + "github.com/kyren223/eko/internal/client/ui/colors" "github.com/kyren223/eko/pkg/assert" ) @@ -38,9 +40,16 @@ func Run() { err := config.Load() if err != nil { - log.Fatalf("Config file at '%v' was unable to load successfully\n%v\n", config.ConfigFile, err) + fmt.Printf("Config file at '%v' was unable to load successfully\n%v\n", config.ConfigFile, err) + os.Exit(1) } + config.Use(func(config *config.Config) { + if config.Colors != nil { + colors.LoadStrings(config.Colors) + } + }) + program := tea.NewProgram(initialModel(dump), tea.WithAltScreen()) assert.AddFlush(BubbleTeaCloser{program}) ui.Program = program diff --git a/internal/client/config/config.go b/internal/client/config/config.go index 4a4bafc..aadde87 100644 --- a/internal/client/config/config.go +++ b/internal/client/config/config.go @@ -7,27 +7,60 @@ import ( "os" "path/filepath" "reflect" + + "github.com/kyren223/eko/internal/client/ui/colors" ) type Config struct { - ServerName string `json:"server_name"` - PrivateKeyPath string `json:"private_key_path"` - InsertModeTabToSpace bool `json:"insert_mode_tab_to_space"` - InsertModeSpacesPerTab uint8 `json:"insert_mode_spaces_per_tab"` - InsecureDebugMode bool `json:"insecure_debug_mode"` + ServerName string `json:"server_name"` + PrivateKeyPath string `json:"private_key_path"` + InsertModeTabToSpace bool `json:"insert_mode_tab_to_space"` + InsertModeSpacesPerTab uint8 `json:"insert_mode_spaces_per_tab"` + InsecureDebugMode bool `json:"insecure_debug_mode"` + Colors []string `json:"colors"` } func Default() Config { + colors.Save() + cols := colors.Get() + sColors := make([]string, 0, colors.Count) + for _, color := range cols { + if color != "" { + sColors = append(sColors, colors.ToHex(color)) + } + } + return Config{ ServerName: "eko.kyren.codes", PrivateKeyPath: "", InsertModeTabToSpace: true, InsertModeSpacesPerTab: 4, InsecureDebugMode: false, + Colors: sColors, } } -func Verify(config *Config) error { +func VerifyAndFix(config *Config) error { + if config.ServerName == "" { + config.ServerName = Default().ServerName + } + + if config.Colors != nil { + for i, color := range config.Colors { + if !colors.IsHex(color) { + return fmt.Errorf("Color at %v is not a valid hex color", i) + } + } + + if len(config.Colors) != colors.Count { + return fmt.Errorf( + "Expected %v colors, got %v colors, set this value to null to use the default colors", + colors.Count, len(config.Colors), + ) + } + + } + return nil } @@ -89,7 +122,7 @@ func Load() error { config = finalConfig.Interface().(Config) - err = Verify(&config) + err = VerifyAndFix(&config) if err != nil { return err } diff --git a/internal/client/ui/colors/colors.go b/internal/client/ui/colors/colors.go index 138e390..6ab3590 100644 --- a/internal/client/ui/colors/colors.go +++ b/internal/client/ui/colors/colors.go @@ -2,37 +2,78 @@ package colors import ( "fmt" + "regexp" + "slices" "github.com/charmbracelet/lipgloss" + "github.com/kyren223/eko/pkg/assert" +) + +const Count = 32 + +var ( + DefaultLightGray = lipgloss.Color("#939AA3") + DefaultGray = lipgloss.Color("#585858") + DefaultDarkGray = lipgloss.Color("#313244") + DefaultLightBlue = lipgloss.Color("#5874FF") + DefaultBlue = lipgloss.Color("#0029f5") + DefaultDarkCyan = lipgloss.Color("#007E8A") + DefaultDarkerCyan = lipgloss.Color("#005d66") + DefaultDarkerMidnightBlue = lipgloss.Color("#0e0e16") + DefaultDarkMidnightBlue = lipgloss.Color("#181825") + DefaultMidnightBlue = lipgloss.Color("#1E1E2E") + DefaultLightMidnightBlue = lipgloss.Color("#3c3c5d") + DefaultTurquoise = lipgloss.Color("#54D7A9") + DefaultRed = lipgloss.Color("#F16265") + DefaultMutedRed = lipgloss.Color("#443737") + DefaultDarkMutedRed = lipgloss.Color("#402d2d") + DefaultWhite = lipgloss.Color("#FFFFFF") + DefaultBlack = lipgloss.Color("#000000") + DefaultGreen = lipgloss.Color("#46d46c") + DefaultPurple = lipgloss.Color("#BB91F0") + DefaultDarkPurple = lipgloss.Color("#87123d") + DefaultMutedPurple = lipgloss.Color("#403744") + DefaultDarkMutedPurple = lipgloss.Color("#382d40") + DefaultOrange = lipgloss.Color("#F5A670") + DefaultGold = lipgloss.Color("#FFBF00") + DefaultMutedGold = lipgloss.Color("#444037") + DefaultDarkMutedGold = lipgloss.Color("#40382d") + + DefaultBackground = DefaultMidnightBlue + DefaultBackgroundHighlight = DefaultLightMidnightBlue + DefaultBackgroundDim = DefaultDarkMidnightBlue + DefaultBackgroundDimmer = DefaultDarkerMidnightBlue + DefaultError = DefaultRed + DefaultFocus = DefaultLightBlue ) var ( - LightGray = lipgloss.Color("#939AA3") - Gray = lipgloss.Color("#585858") - DarkGray = lipgloss.Color("#313244") - LightBlue = lipgloss.Color("#5874FF") - Blue = lipgloss.Color("#0029f5") - DarkCyan = lipgloss.Color("#007E8A") - DarkerCyan = lipgloss.Color("#005d66") - DarkerMidnightBlue = lipgloss.Color("#0e0e16") - DarkMidnightBlue = lipgloss.Color("#181825") - MidnightBlue = lipgloss.Color("#1E1E2E") - LightMidnightBlue = lipgloss.Color("#3c3c5d") - Turquoise = lipgloss.Color("#54D7A9") - Red = lipgloss.Color("#F16265") - MutedRed = lipgloss.Color("#443737") - DarkMutedRed = lipgloss.Color("#402d2d") - White = lipgloss.Color("#FFFFFF") - Black = lipgloss.Color("#000000") - Green = lipgloss.Color("#46d46c") - Purple = lipgloss.Color("#BB91F0") - DarkPurple = lipgloss.Color("#87123d") - MutedPurple = lipgloss.Color("#403744") - DarkMutedPurple = lipgloss.Color("#382d40") - Orange = lipgloss.Color("#F5A670") - Gold = lipgloss.Color("#FFBF00") - MutedGold = lipgloss.Color("#444037") - DarkMutedGold = lipgloss.Color("#40382d") + LightGray = DefaultLightGray + Gray = DefaultGray + DarkGray = DefaultDarkGray + LightBlue = DefaultLightBlue + Blue = DefaultBlue + DarkCyan = DefaultDarkCyan + DarkerCyan = DefaultDarkerCyan + DarkerMidnightBlue = DefaultDarkerMidnightBlue + DarkMidnightBlue = DefaultDarkMidnightBlue + MidnightBlue = DefaultMidnightBlue + LightMidnightBlue = DefaultLightMidnightBlue + Turquoise = DefaultTurquoise + Red = DefaultRed + MutedRed = DefaultMutedRed + DarkMutedRed = DefaultDarkMutedRed + White = DefaultWhite + Black = DefaultBlack + Green = DefaultGreen + Purple = DefaultPurple + DarkPurple = DefaultDarkPurple + MutedPurple = DefaultMutedPurple + DarkMutedPurple = DefaultDarkMutedPurple + Orange = DefaultOrange + Gold = DefaultGold + MutedGold = DefaultMutedGold + DarkMutedGold = DefaultDarkMutedGold Background = MidnightBlue BackgroundHighlight = LightMidnightBlue @@ -42,7 +83,170 @@ var ( Focus = LightBlue ) +var colors = make([]lipgloss.Color, Count) + +func Save() { + i := 0 + colors[i] = LightGray + i++ + colors[i] = Gray + i++ + colors[i] = DarkGray + i++ + colors[i] = LightBlue + i++ + colors[i] = Blue + i++ + colors[i] = DarkCyan + i++ + colors[i] = DarkerCyan + i++ + colors[i] = DarkerMidnightBlue + i++ + colors[i] = DarkMidnightBlue + i++ + colors[i] = MidnightBlue + i++ + colors[i] = LightMidnightBlue + i++ + colors[i] = Turquoise + i++ + colors[i] = Red + i++ + colors[i] = MutedRed + i++ + colors[i] = DarkMutedRed + i++ + colors[i] = White + i++ + colors[i] = Black + i++ + colors[i] = Green + i++ + colors[i] = Purple + i++ + colors[i] = DarkPurple + i++ + colors[i] = MutedPurple + i++ + colors[i] = DarkMutedPurple + i++ + colors[i] = Orange + i++ + colors[i] = Gold + i++ + colors[i] = MutedGold + i++ + colors[i] = DarkMutedGold + i++ + + colors[i] = Background + i++ + colors[i] = BackgroundHighlight + i++ + colors[i] = BackgroundDim + i++ + colors[i] = BackgroundDimmer + i++ + colors[i] = Error + i++ + colors[i] = Focus + i++ +} + +func Restore() { + Load(colors) +} + +func Load(colors []lipgloss.Color) { + i := 0 + LightGray = colors[i] + i++ + Gray = colors[i] + i++ + DarkGray = colors[i] + i++ + LightBlue = colors[i] + i++ + Blue = colors[i] + i++ + DarkCyan = colors[i] + i++ + DarkerCyan = colors[i] + i++ + DarkerMidnightBlue = colors[i] + i++ + DarkMidnightBlue = colors[i] + i++ + MidnightBlue = colors[i] + i++ + LightMidnightBlue = colors[i] + i++ + Turquoise = colors[i] + i++ + Red = colors[i] + i++ + MutedRed = colors[i] + i++ + DarkMutedRed = colors[i] + i++ + White = colors[i] + i++ + Black = colors[i] + i++ + Green = colors[i] + i++ + Purple = colors[i] + i++ + DarkPurple = colors[i] + i++ + MutedPurple = colors[i] + i++ + DarkMutedPurple = colors[i] + i++ + Orange = colors[i] + i++ + Gold = colors[i] + i++ + MutedGold = colors[i] + i++ + DarkMutedGold = colors[i] + i++ + + Background = colors[i] + i++ + BackgroundHighlight = colors[i] + i++ + BackgroundDim = colors[i] + i++ + BackgroundDimmer = colors[i] + i++ + Error = colors[i] + i++ + Focus = colors[i] + i++ +} + +func LoadStrings(s []string) { + assert.Assert(len(s) == Count, "len of strings must match color count") + for i, c := range s { + if IsHex(c) { + colors[i] = lipgloss.Color(c) + } + } + Restore() +} + +func Get() []lipgloss.Color { + return slices.Clone(colors) +} + func ToHex(color lipgloss.Color) string { r, g, b, _ := color.RGBA() return fmt.Sprintf("#%02X%02X%02X", r>>8, g>>8, b>>8) } + +func IsHex(color string) bool { + re := regexp.MustCompile(`^#[0-9A-Fa-f]{6}$`) + return re.MatchString(color) +}