111 lines
2.3 KiB
Go
111 lines
2.3 KiB
Go
|
// Copyright 2014 The gocui Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"os"
|
||
|
|
||
|
"github.com/awesome-gocui/gocui"
|
||
|
colorful "github.com/lucasb-eyer/go-colorful"
|
||
|
)
|
||
|
|
||
|
var dark = false
|
||
|
|
||
|
func main() {
|
||
|
os.Setenv("COLORTERM", "truecolor")
|
||
|
g, err := gocui.NewGui(gocui.OutputTrue, true)
|
||
|
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
defer g.Close()
|
||
|
|
||
|
g.SetManagerFunc(layout)
|
||
|
|
||
|
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
|
||
|
if err := g.SetKeybinding("", gocui.KeyCtrlR, gocui.ModNone, func(g *gocui.Gui, v *gocui.View) error {
|
||
|
if dark {
|
||
|
dark = false
|
||
|
} else {
|
||
|
dark = true
|
||
|
}
|
||
|
displayHsv(v)
|
||
|
|
||
|
return nil
|
||
|
}); err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
|
||
|
if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func layout(g *gocui.Gui) error {
|
||
|
maxX, maxY := g.Size()
|
||
|
rows := 33
|
||
|
cols := 182
|
||
|
if maxY < rows {
|
||
|
rows = maxY
|
||
|
}
|
||
|
if maxX < cols {
|
||
|
cols = maxX
|
||
|
}
|
||
|
|
||
|
if v, err := g.SetView("colors", 0, 0, cols-1, rows-1, 0); err != nil {
|
||
|
if !errors.Is(err, gocui.ErrUnknownView) {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
v.FrameColor = gocui.GetColor("#FFAA55")
|
||
|
displayHsv(v)
|
||
|
|
||
|
if _, err := g.SetCurrentView("colors"); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func displayHsv(v *gocui.View) {
|
||
|
v.Clear()
|
||
|
str := ""
|
||
|
// HSV color space (lines are value or saturation)
|
||
|
for i := 50; i > 0; i -= 2 {
|
||
|
// Hue
|
||
|
for j := 0; j < 360; j += 2 {
|
||
|
ir, ig, ib := hsv(j, i-1)
|
||
|
ir2, ig2, ib2 := hsv(j, i)
|
||
|
str += fmt.Sprintf("\x1b[48;2;%d;%d;%dm\x1b[38;2;%d;%d;%dm▀\x1b[0m", ir, ig, ib, ir2, ig2, ib2)
|
||
|
}
|
||
|
str += "\n"
|
||
|
fmt.Fprint(v, str)
|
||
|
str = ""
|
||
|
}
|
||
|
|
||
|
fmt.Fprintln(v, "\n\x1b[38;5;245mCtrl + R - Switch light/dark mode")
|
||
|
fmt.Fprintln(v, "\nCtrl + C - Exit\n")
|
||
|
fmt.Fprint(v, "Example should enable true color, but if it doesn't work run this command: \x1b[0mexport COLORTERM=truecolor")
|
||
|
}
|
||
|
|
||
|
func hsv(hue, sv int) (uint32, uint32, uint32) {
|
||
|
if !dark {
|
||
|
ir, ig, ib, _ := colorful.Hsv(float64(hue), float64(sv)/50, float64(1)).RGBA()
|
||
|
return ir >> 8, ig >> 8, ib >> 8
|
||
|
}
|
||
|
ir, ig, ib, _ := colorful.Hsv(float64(hue), float64(1), float64(sv)/50).RGBA()
|
||
|
return ir >> 8, ig >> 8, ib >> 8
|
||
|
}
|
||
|
|
||
|
func quit(g *gocui.Gui, v *gocui.View) error {
|
||
|
return gocui.ErrQuit
|
||
|
}
|