-
Notifications
You must be signed in to change notification settings - Fork 86
/
select_item.go
97 lines (76 loc) · 2.03 KB
/
select_item.go
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
package prompt
import (
"github.com/BurntSushi/xgb/xproto"
"github.com/BurntSushi/xgbutil/xwindow"
"github.com/BurntSushi/wingo/logger"
"github.com/BurntSushi/wingo/text"
)
type SelectChoice interface {
SelectText() string
SelectSelected(data interface{})
SelectHighlighted(data interface{})
}
type SelectItem struct {
slct *Select
choice SelectChoice
text string
regular, highlighted *xwindow.Window
}
func newSelectItem(slct *Select, choice SelectChoice) *SelectItem {
si := &SelectItem{
slct: slct,
choice: choice,
}
si.regular = xwindow.Must(xwindow.Create(si.slct.X, si.slct.win.Id))
si.highlighted = xwindow.Must(xwindow.Create(si.slct.X, si.slct.win.Id))
// If the text overruns, make sure it's below the borders.
si.regular.StackSibling(si.slct.bRht.Id, xproto.StackModeBelow)
si.highlighted.StackSibling(si.slct.bRht.Id, xproto.StackModeBelow)
si.UpdateText()
return si
}
func (si *SelectItem) show(x, y int) {
si.regular.Move(x, y)
si.highlighted.Move(x, y)
si.regular.Map()
}
func (si *SelectItem) hide() {
si.regular.Unmap()
si.highlighted.Unmap()
}
func (si *SelectItem) choose() {
si.choice.SelectSelected(si.slct.data)
}
func (si *SelectItem) highlight() {
si.choice.SelectHighlighted(si.slct.data)
si.highlighted.Map()
si.regular.Unmap()
}
func (si *SelectItem) unhighlight() {
si.regular.Map()
si.highlighted.Unmap()
}
func (si *SelectItem) Destroy() {
si.regular.Destroy()
si.highlighted.Destroy()
}
func (si *SelectItem) UpdateText() {
t := si.slct.theme
si.text = si.choice.SelectText()
// Always have some text.
if len(si.text) == 0 {
si.text = "N/A"
}
err := text.DrawText(si.regular, t.Font, t.FontSize,
t.FontColor, t.BgColor, si.text)
if err != nil {
logger.Warning.Printf("(*SelectItem).UpdateText: "+
"Could not render text: %s", err)
}
err = text.DrawText(si.highlighted, t.Font, t.FontSize,
t.ActiveFontColor, t.ActiveBgColor, si.text)
if err != nil {
logger.Warning.Printf("(*SelectItem).UpdateText: "+
"Could not render text: %s", err)
}
}