141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.
 | |
| // Use of this source code is governed by a MIT license that can
 | |
| // be found in the LICENSE file.
 | |
| 
 | |
| package termui
 | |
| 
 | |
| import "strings"
 | |
| 
 | |
| /*
 | |
| // A ColorScheme represents the current look-and-feel of the dashboard.
 | |
| type ColorScheme struct {
 | |
| 	BodyBg            Attribute
 | |
| 	BlockBg           Attribute
 | |
| 	HasBorder         bool
 | |
| 	BorderFg          Attribute
 | |
| 	BorderBg          Attribute
 | |
| 	BorderLabelTextFg Attribute
 | |
| 	BorderLabelTextBg Attribute
 | |
| 	ParTextFg         Attribute
 | |
| 	ParTextBg         Attribute
 | |
| 	SparklineLine     Attribute
 | |
| 	SparklineTitle    Attribute
 | |
| 	GaugeBar          Attribute
 | |
| 	GaugePercent      Attribute
 | |
| 	LineChartLine     Attribute
 | |
| 	LineChartAxes     Attribute
 | |
| 	ListItemFg        Attribute
 | |
| 	ListItemBg        Attribute
 | |
| 	BarChartBar       Attribute
 | |
| 	BarChartText      Attribute
 | |
| 	BarChartNum       Attribute
 | |
| 	MBarChartBar      Attribute
 | |
| 	MBarChartText     Attribute
 | |
| 	MBarChartNum      Attribute
 | |
| 	TabActiveBg		  Attribute
 | |
| }
 | |
| 
 | |
| // default color scheme depends on the user's terminal setting.
 | |
| var themeDefault = ColorScheme{HasBorder: true}
 | |
| 
 | |
| var themeHelloWorld = ColorScheme{
 | |
| 	BodyBg:            ColorBlack,
 | |
| 	BlockBg:           ColorBlack,
 | |
| 	HasBorder:         true,
 | |
| 	BorderFg:          ColorWhite,
 | |
| 	BorderBg:          ColorBlack,
 | |
| 	BorderLabelTextBg: ColorBlack,
 | |
| 	BorderLabelTextFg: ColorGreen,
 | |
| 	ParTextBg:         ColorBlack,
 | |
| 	ParTextFg:         ColorWhite,
 | |
| 	SparklineLine:     ColorMagenta,
 | |
| 	SparklineTitle:    ColorWhite,
 | |
| 	GaugeBar:          ColorRed,
 | |
| 	GaugePercent:      ColorWhite,
 | |
| 	LineChartLine:     ColorYellow | AttrBold,
 | |
| 	LineChartAxes:     ColorWhite,
 | |
| 	ListItemBg:        ColorBlack,
 | |
| 	ListItemFg:        ColorYellow,
 | |
| 	BarChartBar:       ColorRed,
 | |
| 	BarChartNum:       ColorWhite,
 | |
| 	BarChartText:      ColorCyan,
 | |
| 	MBarChartBar:      ColorRed,
 | |
| 	MBarChartNum:      ColorWhite,
 | |
| 	MBarChartText:     ColorCyan,
 | |
| 	TabActiveBg:	   ColorMagenta,
 | |
| }
 | |
| 
 | |
| var theme = themeDefault // global dep
 | |
| 
 | |
| // Theme returns the currently used theme.
 | |
| func Theme() ColorScheme {
 | |
| 	return theme
 | |
| }
 | |
| 
 | |
| // SetTheme sets a new, custom theme.
 | |
| func SetTheme(newTheme ColorScheme) {
 | |
| 	theme = newTheme
 | |
| }
 | |
| 
 | |
| // UseTheme sets a predefined scheme. Currently available: "hello-world" and
 | |
| // "black-and-white".
 | |
| func UseTheme(th string) {
 | |
| 	switch th {
 | |
| 	case "helloworld":
 | |
| 		theme = themeHelloWorld
 | |
| 	default:
 | |
| 		theme = themeDefault
 | |
| 	}
 | |
| }
 | |
| */
 | |
| 
 | |
| var ColorMap = map[string]Attribute{
 | |
| 	"fg":           ColorWhite,
 | |
| 	"bg":           ColorDefault,
 | |
| 	"border.fg":    ColorWhite,
 | |
| 	"label.fg":     ColorGreen,
 | |
| 	"par.fg":       ColorYellow,
 | |
| 	"par.label.bg": ColorWhite,
 | |
| }
 | |
| 
 | |
| func ThemeAttr(name string) Attribute {
 | |
| 	return lookUpAttr(ColorMap, name)
 | |
| }
 | |
| 
 | |
| func lookUpAttr(clrmap map[string]Attribute, name string) Attribute {
 | |
| 
 | |
| 	a, ok := clrmap[name]
 | |
| 	if ok {
 | |
| 		return a
 | |
| 	}
 | |
| 
 | |
| 	ns := strings.Split(name, ".")
 | |
| 	for i := range ns {
 | |
| 		nn := strings.Join(ns[i:len(ns)], ".")
 | |
| 		a, ok = ColorMap[nn]
 | |
| 		if ok {
 | |
| 			break
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return a
 | |
| }
 | |
| 
 | |
| // 0<=r,g,b <= 5
 | |
| func ColorRGB(r, g, b int) Attribute {
 | |
| 	within := func(n int) int {
 | |
| 		if n < 0 {
 | |
| 			return 0
 | |
| 		}
 | |
| 
 | |
| 		if n > 5 {
 | |
| 			return 5
 | |
| 		}
 | |
| 
 | |
| 		return n
 | |
| 	}
 | |
| 
 | |
| 	r, b, g = within(r), within(b), within(g)
 | |
| 	return Attribute(0x0f + 36*r + 6*g + b)
 | |
| }
 |