1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
package status // import "hhvn.uk/hbspbar/status"
import (
"fmt"
"time"
"sync"
"image"
"image/color"
"hhvn.uk/hbspbar/drw"
"hhvn.uk/hbspbar/config"
"hhvn.uk/hbspbar/common"
)
var Status map[int]*status
var Mutex sync.Mutex
var statusid map[string]int
var Updated chan bool
var updates chan *status
const (
)
func init() {
Status = make(map[int]*status)
statusid = make(map[string]int)
Updated = make(chan bool)
updates = make(chan *status)
go func() {
for {
s := <- updates
id := statusid[s.Name]
Mutex.Lock()
Status[id] = s
Mutex.Unlock()
Updated <- true
}
}()
}
func register(name string) {
nid := 0
for _, id := range statusid {
if id >= nid {
nid = id + 1
}
}
statusid[name] = nid
}
type status struct {
Name string
I *image.RGBA
W int
}
func newUpdate(name string) (*status) {
var s status
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 checkError(name string, err error) {
if err == nil { return }
common.Error("status \"%s\": %s\n", name, err)
u := newUpdate(name)
u.drawText(0, config.Red, fmt.Sprintf("[err: %s]", name))
updates <- u
sleep(5)
}
func sleep(s int) {
time.Sleep(time.Duration(s) * time.Second)
}
func blendGYR(percent int) color.Color {
return drw.Blend3(config.Green, config.Yellow, config.Red, percent)
}
func blendBg(c color.Color) color.Color {
return drw.Blend(c, config.Status, 75)
}
func (s *status) furthest(x int) {
if x > s.W {
s.W = x
}
}
func (s *status) 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 *status) 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 *status) 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
}
|