package status // import "hhvn.uk/hbspbar/status" import ( "fmt" "time" "image" "image/color" "hhvn.uk/hbspbar/drw" "hhvn.uk/hbspbar/config" "hhvn.uk/hbspbar/common" ) var NewBlocks = make(chan []*Block) var updates = make(chan *Block) var blockid = make(map[string]int) var blockids = 0 type Block struct { Name string I *image.RGBA W int } func init() { blocks := make(map[int]*Block) go func() { for s := range updates { id := blockid[s.Name] blocks[id] = s b := make([]*Block, blockids) for i := 0; i < blockids; i++ { b[i] = blocks[i] } NewBlocks <- b } }() } func register(name string, fn func(string) error) { nid := 0 for _, id := range blockid { if id >= nid { nid = id + 1 blockids++ } } blockid[name] = nid go func(){ for { err := fn(name) if err != nil { common.Error("block \"%s\": %s\n", name, err) u := newUpdate(name) u.drawText(0, config.Red, fmt.Sprintf("[err: %s]", name)) updates <- u sleep(5) } } }() } func newUpdate(name string) (*Block) { var s Block s.Name = name s.W = 0 s.I = image.NewRGBA(image.Rect(0, 0, 1000, int(config.H))) // Use drw's in order not to modify s.W drw.DrawRect(s.I, 0, 0, 1000, int(config.H), config.Status, true) return &s } func sleep(s int) { time.Sleep(time.Duration(s) * time.Second) } func blendGYR(percent int) color.Color { return drw.Blend(percent, config.Green, config.Yellow, config.Red) } func blendBg(c color.Color) color.Color { return drw.Blend(75, c, config.Status) } func (s *Block) furthest(x int) { if x > s.W { s.W = x } } func (s *Block) drawText(x int, col color.Color, text string) (int, error) { w, err := drw.DrawText(s.I, x, col, text) s.furthest(x + w) return w, err } func (s *Block) drawRect(x, y, w, h int, c color.Color, fill bool) { drw.DrawRect(s.I, x, y, w, h, c, fill) s.furthest(x + w) } func (s *Block) drawPercentBar(x, percent int) int { tbpad := 3 th := int(config.H) - tbpad * 2 + 1 h := int(th * percent / 100) fg := blendGYR(percent) bg := blendBg(fg) s.drawRect(x, tbpad - 1, 3, th, bg, true) s.drawRect(x, tbpad + th - h - 1, 3, h, fg, true) return 5 }