/
buttonbar.go
56 lines (48 loc) · 1.16 KB
/
buttonbar.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
package razgio
import (
"gioui.org/layout"
"gioui.org/unit"
"gioui.org/widget"
"gioui.org/widget/material"
)
type ButtonBar struct {
list layout.List
in layout.Inset
btns []buttonBarItem
}
type buttonBarItem struct {
widget.Clickable
icon *widget.Icon
text string
}
func NewButtonBar(btns ...string) ButtonBar {
bb := ButtonBar{
list: layout.List{Axis: layout.Horizontal},
in: layout.UniformInset(unit.Dp(5)),
btns: make([]buttonBarItem, len(btns)),
}
for i, btn := range btns {
bb.btns[i].text = btn
}
return bb
}
func (bb *ButtonBar) SetButtonIcon(idx int, icon *widget.Icon) {
bb.btns[idx].icon = icon
}
func (bb *ButtonBar) Clicked(idx int) bool {
return bb.btns[idx].Clicked()
}
func (bb *ButtonBar) Layout(gtx C, th *material.Theme) D {
return bb.list.Layout(gtx, len(bb.btns), func(gtx C, idx int) D {
return bb.in.Layout(gtx, func(gtx C) D {
return bb.btns[idx].Layout(gtx, th)
})
})
}
func (bbi *buttonBarItem) Layout(gtx C, th *material.Theme) D {
if bbi.icon == nil {
return material.Button(th, &bbi.Clickable, bbi.text).Layout(gtx)
} else {
return IconAndTextButton(th, &bbi.Clickable, bbi.icon, bbi.text).Layout(gtx)
}
}