colors.go raw

   1  package gel
   2  
   3  import (
   4  	"fmt"
   5  	"image/color"
   6  	"sync"
   7  )
   8  
   9  // Colors is a map of names to hex strings specifying colors
  10  type Colors struct {
  11  	sync.Mutex
  12  	m map[string]string
  13  }
  14  
  15  // HexARGB converts a 32 bit hex string into a color specification
  16  func HexARGB(s string) (c color.RGBA) {
  17  	_, _ = fmt.Sscanf(s, "%02x%02x%02x%02x", &c.A, &c.R, &c.G, &c.B)
  18  	return
  19  }
  20  
  21  // HexNRGB converts a 32 bit hex string into a color specification
  22  func HexNRGB(s string) (c color.NRGBA) {
  23  	_, _ = fmt.Sscanf(s, "%02x%02x%02x%02x", &c.A, &c.R, &c.G, &c.B)
  24  	return
  25  }
  26  
  27  // GetNRGBAFromName returns the named color from the map
  28  func (c *Colors) GetNRGBAFromName(co string) color.NRGBA {
  29  	c.Lock()
  30  	defer c.Unlock()
  31  	if col, ok := c.m[co]; ok {
  32  		return HexNRGB(col)
  33  	}
  34  	return color.NRGBA{}
  35  }
  36  
  37  // newColors creates the base palette for the theme
  38  func newColors() (c *Colors) {
  39  	c = new(Colors)
  40  	c.Lock()
  41  	defer c.Unlock()
  42  	c.m = map[string]string{
  43  		"black":                 "ff000000",
  44  		"light-black":           "ff222222",
  45  		"blue":                  "ff3030cf",
  46  		"blue-lite-blue":        "ff3080cf",
  47  		"blue-orange":           "ff80a830",
  48  		"blue-red":              "ff803080",
  49  		"dark":                  "ff303030",
  50  		"dark-blue":             "ff303080",
  51  		"dark-blue-lite-blue":   "ff305880",
  52  		"dark-blue-orange":      "ff584458",
  53  		"dark-blue-red":         "ff583058",
  54  		"dark-gray":             "ff656565",
  55  		"dark-grayi":            "ff535353",
  56  		"dark-grayii":           "ff424242",
  57  		"dark-green":            "ff308030",
  58  		"dark-green-blue":       "ff305858",
  59  		"dark-green-lite-blue":  "ff308058",
  60  		"dark-green-orange":     "ff586c30",
  61  		"dark-green-red":        "ff585830",
  62  		"dark-green-yellow":     "ff588030",
  63  		"dark-lite-blue":        "ff308080",
  64  		"dark-orange":           "ff805830",
  65  		"dark-purple":           "ff803080",
  66  		"dark-red":              "ff803030",
  67  		"dark-yellow":           "ff808030",
  68  		"gray":                  "ff808080",
  69  		"green":                 "ff30cf30",
  70  		"green-blue":            "ff308080",
  71  		"green-lite-blue":       "ff30cf80",
  72  		"green-orange":          "ff80a830",
  73  		"green-red":             "ff808030",
  74  		"green-yellow":          "ff80cf30",
  75  		"light":                 "ffcfcfcf",
  76  		"light-blue":            "ff8080cf",
  77  		"light-blue-lite-blue":  "ff80a8cf",
  78  		"light-blue-orange":     "ffa894a8",
  79  		"light-blue-red":        "ffa880a8",
  80  		"light-gray":            "ff888888",
  81  		"light-grayi":           "ff9a9a9a",
  82  		"light-grayii":          "ffacacac",
  83  		"light-grayiii":         "ffbdbdbd",
  84  		"light-green":           "ff80cf80",
  85  		"light-green-blue":      "ff80a8a8",
  86  		"light-green-lite-blue": "ff80cfa8",
  87  		"light-green-orange":    "ffa8bc80",
  88  		"light-green-red":       "ffa8a880",
  89  		"light-green-yellow":    "ffa8cf80",
  90  		"light-lite-blue":       "ff80cfcf",
  91  		"light-orange":          "ffcfa880",
  92  		"light-purple":          "ffcf80cf",
  93  		"light-red":             "ffcf8080",
  94  		"light-yellow":          "ffcfcf80",
  95  		"lite-blue":             "ff30cfcf",
  96  		"orange":                "ffcf8030",
  97  		"purple":                "ffcf30cf",
  98  		"red":                   "ffcf3030",
  99  		"white":                 "ffffffff",
 100  		"dark-white":            "ffdddddd",
 101  		"yellow":                "ffcfcf30",
 102  		"halfdim":               "33000000",
 103  		"halfbright":            "02ffffff",
 104  	}
 105  	
 106  	c.m["Black"] = c.m["black"]
 107  	c.m["ButtonBg"] = c.m["blue-lite-blue"]
 108  	c.m["ButtonBgDim"] = "ff30809a"
 109  	c.m["ButtonText"] = c.m["White"]
 110  	c.m["ButtonTextDim"] = c.m["light-grayii"]
 111  	c.m["Chk"] = c.m["orange"]
 112  	c.m["Chk"] = c.m["orange"]
 113  	c.m["Danger"] = c.m["red"]
 114  	c.m["Dark"] = c.m["dark"]
 115  	c.m["DarkGray"] = c.m["dark-grayii"]
 116  	c.m["DarkGrayI"] = c.m["dark-grayi"]
 117  	c.m["DarkGrayII"] = c.m["dark-gray"]
 118  	c.m["DarkGrayIII"] = c.m["dark"]
 119  	c.m["DocBg"] = c.m["white"]
 120  	c.m["DocBgDim"] = c.m["light-grayiii"]
 121  	c.m["DocBgHilite"] = c.m["dark-white"]
 122  	c.m["DocText"] = c.m["dark"]
 123  	c.m["DocTextDim"] = c.m["light-grayi"]
 124  	c.m["Fatal"] = "ff880000"
 125  	c.m["Gray"] = c.m["gray"]
 126  	c.m["Hint"] = c.m["light-gray"]
 127  	c.m["Info"] = c.m["blue-lite-blue"]
 128  	c.m["InvText"] = c.m["light"]
 129  	c.m["Light"] = c.m["light"]
 130  	c.m["LightGray"] = c.m["light-grayiii"]
 131  	c.m["LightGrayI"] = c.m["light-grayii"]
 132  	c.m["LightGrayII"] = c.m["light-grayi"]
 133  	c.m["LightGrayIII"] = c.m["light-gray"]
 134  	c.m["PanelBg"] = c.m["light"]
 135  	c.m["PanelBgDim"] = c.m["dark-grayi"]
 136  	c.m["PanelText"] = c.m["dark"]
 137  	c.m["PanelTextDim"] = c.m["light-grayii"]
 138  	c.m["PrimaryLight"] = c.m["light-green-blue"]
 139  	c.m["Primary"] = c.m["green-blue"]
 140  	c.m["PrimaryDim"] = c.m["dark-green-blue"]
 141  	c.m["SecondaryLight"] = c.m["purple"]
 142  	c.m["Secondary"] = c.m["purple"]
 143  	c.m["SecondaryDim"] = c.m["dark-purple"]
 144  	c.m["Success"] = c.m["green"]
 145  	c.m["Transparent"] = c.m["00000000"]
 146  	c.m["Warning"] = c.m["light-orange"]
 147  	c.m["White"] = c.m["white"]
 148  	c.m["scrim"] = c.m["halfbright"]
 149  	
 150  	c.m["Primary"] = c.m["PrimaryLight"]
 151  	c.m["Secondary"] = c.m["SecondaryLight"]
 152  	
 153  	c.m["DocText"] = c.m["dark"]
 154  	c.m["DocBg"] = c.m["light"]
 155  	
 156  	c.m["PanelText"] = c.m["dark"]
 157  	c.m["PanelBg"] = c.m["light"]
 158  	
 159  	c.m["PanelTextDim"] = c.m["dark-grayii"]
 160  	c.m["PanelBgDim"] = c.m["dark-grayi"]
 161  	c.m["DocTextDim"] = c.m["light-grayi"]
 162  	c.m["DocBgDim"] = c.m["dark-grayi"]
 163  	c.m["Warning"] = c.m["light-orange"]
 164  	c.m["Success"] = c.m["dark-green"]
 165  	c.m["Chk"] = c.m["orange"]
 166  	c.m["DocBgHilite"] = c.m["dark-white"]
 167  	c.m["scrim"] = c.m["halfbright"]
 168  	return c
 169  }
 170  
 171  // SetDarkTheme to dark or light
 172  func (c *Colors) SetDarkTheme(dark bool) {
 173  	c.Lock()
 174  	defer c.Unlock()
 175  	if !dark {
 176  		c.m["Primary"] = c.m["PrimaryLight"]
 177  		c.m["Secondary"] = c.m["SecondaryLight"]
 178  		
 179  		c.m["DocText"] = c.m["dark"]
 180  		c.m["DocBg"] = c.m["light"]
 181  		
 182  		c.m["PanelText"] = c.m["dark"]
 183  		c.m["PanelBg"] = c.m["white"]
 184  		
 185  		c.m["PanelTextDim"] = c.m["dark-grayii"]
 186  		c.m["PanelBgDim"] = c.m["dark-grayi"]
 187  		c.m["DocTextDim"] = c.m["light-grayi"]
 188  		c.m["DocBgDim"] = c.m["light-grayiii"]
 189  		c.m["Warning"] = c.m["light-orange"]
 190  		c.m["Success"] = c.m["dark-green"]
 191  		c.m["Chk"] = c.m["orange"]
 192  		c.m["DocBgHilite"] = c.m["dark-white"]
 193  		c.m["scrim"] = c.m["halfdim"]
 194  		c.m["Fatal"] = c.m["light-red"]
 195  		c.m["Info"] = c.m["light-blue"]
 196  	} else {
 197  		c.m["Primary"] = c.m["PrimaryDim"]
 198  		c.m["Secondary"] = c.m["SecondaryDim"]
 199  		
 200  		c.m["DocText"] = c.m["light"]
 201  		c.m["DocBg"] = c.m["dark"]
 202  		
 203  		c.m["PanelText"] = c.m["light"]
 204  		c.m["PanelBg"] = c.m["black"]
 205  		
 206  		c.m["PanelTextDim"] = c.m["light-grayii"]
 207  		c.m["PanelBgDim"] = c.m["light-gray"]
 208  		c.m["DocTextDim"] = c.m["dark-gray"]
 209  		c.m["DocBgDim"] = c.m["dark-grayii"]
 210  		c.m["Warning"] = c.m["yellow"]
 211  		c.m["Success"] = c.m["green"]
 212  		c.m["Chk"] = c.m["orange"]
 213  		c.m["DocBgHilite"] = c.m["light-black"]
 214  		c.m["scrim"] = c.m["halfbright"]
 215  		c.m["Fatal"] = c.m["red"]
 216  		c.m["Info"] = c.m["blue"]
 217  	}
 218  }
 219