diff --git a/src/command.go b/src/command.go index 90ea948..6306005 100644 --- a/src/command.go +++ b/src/command.go @@ -202,6 +202,52 @@ func initCommands() { }, } + setStyleCmd := Command{ + cmd: "set-style", + run: func(window *Window, args ...string) { + if len(args) >= 1 { + input := args[0] + + if input == "" { + return + } + + if _, ok := AvailableStyles[input]; !ok { + PrintMessage(window, fmt.Sprintf("Could not set style to '%s'", input)) + return + } + + if ok := SetCurrentStyle(window.screen, input); ok { + PrintMessage(window, fmt.Sprintf("Setting style to '%s'", input)) + } else { + PrintMessage(window, fmt.Sprintf("Could not set style to '%s'", input)) + } + + return + } + + inputChannel := RequestInput(window, "Style to switch to:", "") + go func() { + input := <-inputChannel + + if input == "" { + return + } + + if _, ok := AvailableStyles[input]; !ok { + PrintMessage(window, fmt.Sprintf("Could not set style to '%s'", input)) + return + } + + if ok := SetCurrentStyle(window.screen, input); ok { + PrintMessage(window, fmt.Sprintf("Setting style to '%s'", input)) + } else { + PrintMessage(window, fmt.Sprintf("Could not set style to '%s'", input)) + } + }() + }, + } + menuFileCmd := Command{ cmd: "menu-file", run: func(window *Window, args ...string) { @@ -297,6 +343,7 @@ func initCommands() { commands["next-buffer"] = &nextBufferCmd commands["new-buffer"] = &newBufferCmd commands["close-buffer"] = &closeBufferCmd + commands["set-style"] = &setStyleCmd commands["menu-file"] = &menuFileCmd commands["menu-edit"] = &menuEditCmd commands["menu-buffers"] = &menuBuffersCmd diff --git a/src/style.go b/src/style.go index e625c73..d1780dc 100644 --- a/src/style.go +++ b/src/style.go @@ -46,8 +46,29 @@ type typerStyleYaml struct { Colors map[string]string `yaml:"colors"` } +var FallbackStyle = TyperStyle{ + Name: "fallback", + Description: "Fallback style", + StyleType: "8-color", + + BufferAreaBg: tcell.ColorBlack, + BufferAreaFg: tcell.ColorWhite, + BufferAreaSel: tcell.ColorNavy, + TopMenuBg: tcell.ColorWhite, + TopMenuFg: tcell.ColorBlack, + DropdownBg: tcell.ColorWhite, + DropdownFg: tcell.ColorBlack, + DropdownSel: tcell.ColorNavy, + LineIndexBg: tcell.ColorWhite, + LineIndexFg: tcell.ColorBlack, + MessageBarBg: tcell.ColorWhite, + MessageBarFg: tcell.ColorBlack, + InputBarBg: tcell.ColorWhite, + InputBarFg: tcell.ColorBlack, +} + var AvailableStyles = make(map[string]TyperStyle) -var CurrentStyle TyperStyle +var CurrentStyle = FallbackStyle func readStyles() { homeDir, err := os.UserHomeDir() @@ -145,7 +166,7 @@ func readStyleYamlFile(filepath string) (TyperStyle, error) { return style, nil } -func SetCurrentStyle(screen tcell.Screen) { +func SetCurrentStyle(screen tcell.Screen, styleName string) bool { availableTypes := make([]string, 1) availableTypes[0] = "8-color" if screen.Colors() >= 16 { @@ -158,30 +179,13 @@ func SetCurrentStyle(screen tcell.Screen) { availableTypes = append(availableTypes, "true-color") } - if style, ok := AvailableStyles[Config.SelectedStyle]; ok && slices.Index(availableTypes, style.StyleType) != -1 { + if style, ok := AvailableStyles[styleName]; ok && slices.Index(availableTypes, style.StyleType) != -1 { CurrentStyle = style - } else if style, ok := AvailableStyles[Config.FallbackStyle]; ok { - CurrentStyle = style - } else { - CurrentStyle = TyperStyle{ - Name: "fallback", - Description: "Fallback style", - StyleType: "8-color", - BufferAreaBg: tcell.ColorBlack, - BufferAreaFg: tcell.ColorWhite, - BufferAreaSel: tcell.ColorNavy, - TopMenuBg: tcell.ColorWhite, - TopMenuFg: tcell.ColorBlack, - DropdownBg: tcell.ColorWhite, - DropdownFg: tcell.ColorBlack, - DropdownSel: tcell.ColorNavy, - LineIndexBg: tcell.ColorWhite, - LineIndexFg: tcell.ColorBlack, - MessageBarBg: tcell.ColorWhite, - MessageBarFg: tcell.ColorBlack, - InputBarBg: tcell.ColorWhite, - InputBarFg: tcell.ColorBlack, - } + screen.SetStyle(tcell.StyleDefault.Foreground(CurrentStyle.BufferAreaFg).Background(CurrentStyle.BufferAreaBg)) + screen.Sync() + + return true } + return false } diff --git a/src/window.go b/src/window.go index 2e47eda..fe9c611 100644 --- a/src/window.go +++ b/src/window.go @@ -72,16 +72,22 @@ func CreateWindow() (*Window, error) { log.Fatalf("Failed to initialize screen: %s", err) } - // Set screen style - SetCurrentStyle(screen) - screen.SetStyle(tcell.StyleDefault.Foreground(CurrentStyle.BufferAreaFg).Background(CurrentStyle.BufferAreaBg)) - // Enable mouse screen.EnableMouse() // Set window screen field window.screen = screen + // Try to set screen style to selected one + if ok := SetCurrentStyle(screen, Config.SelectedStyle); !ok { + // Try to set screen style to selected fallback one + if ok := SetCurrentStyle(screen, Config.FallbackStyle); !ok { + // Use hard-coded fallback style + screen.SetStyle(tcell.StyleDefault.Foreground(CurrentStyle.BufferAreaFg).Background(CurrentStyle.BufferAreaBg)) + PrintMessage(&window, "Could not set style either to selected one nor to fallback one!") + } + } + // Initialize top menu initTopMenu()