139 lines
2.9 KiB
Go
139 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"image"
|
|
"image/color"
|
|
|
|
"gioui.org/f32"
|
|
"gioui.org/gesture"
|
|
"gioui.org/io/pointer"
|
|
"gioui.org/layout"
|
|
"gioui.org/op/clip"
|
|
"gioui.org/op/paint"
|
|
"gioui.org/text"
|
|
"gioui.org/unit"
|
|
)
|
|
|
|
var (
|
|
black = color.RGBA{A: 0xff, R: 0, G: 0, B: 0}
|
|
white = color.RGBA{A: 0xff, R: 0xff, G: 0xff, B: 0xff}
|
|
gray = color.RGBA{A: 0xff, R: 0xf0, G: 0xf0, B: 0xf0}
|
|
darkgray = color.RGBA{A: 0xff, R: 0xa0, G: 0xa0, B: 0xa0}
|
|
)
|
|
|
|
type Overlay struct {
|
|
Size unit.Value
|
|
Text string
|
|
Click gesture.Click
|
|
Color color.RGBA
|
|
Background color.RGBA
|
|
Alignment text.Alignment
|
|
}
|
|
|
|
func (b *Overlay) Layout(gtx *layout.Context) {
|
|
ins := layout.UniformInset(unit.Dp(1))
|
|
ins.Layout(gtx, func() {
|
|
st := layout.Stack{}
|
|
c2 := st.Rigid(gtx, func() {
|
|
l := th.Label(b.Size, b.Text)
|
|
ins := layout.UniformInset(unit.Dp(4))
|
|
l.Color = b.Color
|
|
ins.Layout(gtx, func() {
|
|
l.Layout(gtx)
|
|
})
|
|
pointer.RectAreaOp{image.Rect(0, 0, gtx.Dimensions.Size.X, gtx.Dimensions.Size.Y)}.Add(gtx.Ops)
|
|
})
|
|
c1 := st.Expand(gtx, func() {
|
|
layoutRRect(b.Background, gtx)
|
|
})
|
|
st.Layout(gtx, c1, c2)
|
|
})
|
|
}
|
|
|
|
type SelButton struct {
|
|
Button
|
|
SelColor color.RGBA
|
|
Selected bool
|
|
}
|
|
|
|
type Button struct {
|
|
Size unit.Value
|
|
Label string
|
|
Click gesture.Click
|
|
Color color.RGBA
|
|
Background color.RGBA
|
|
Alignment text.Alignment
|
|
clicked bool
|
|
}
|
|
|
|
func layoutRRect(col color.RGBA, gtx *layout.Context) {
|
|
r := float32(gtx.Config.Px(unit.Dp(4)))
|
|
sz := image.Point{X: gtx.Constraints.Width.Min, Y: gtx.Constraints.Height.Min}
|
|
w, h := float32(sz.X), float32(sz.Y)
|
|
rect := f32.Rectangle{
|
|
f32.Point{0, 0},
|
|
f32.Point{w, h},
|
|
}
|
|
clip.RoundRect(gtx.Ops, rect, r, r, r, r)
|
|
paint.ColorOp{Color: col}.Add(gtx.Ops)
|
|
paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{X: w, Y: h}}}.Add(gtx.Ops)
|
|
gtx.Dimensions = layout.Dimensions{Size: sz}
|
|
}
|
|
|
|
func (b *Button) Layout(gtx *layout.Context) {
|
|
b.clicked = false
|
|
for _, ev := range b.Click.Events(gtx) {
|
|
if ev.Type == gesture.TypeClick {
|
|
b.clicked = true
|
|
}
|
|
}
|
|
ins := layout.UniformInset(unit.Dp(1))
|
|
ins.Layout(gtx, func() {
|
|
st := layout.Stack{}
|
|
c2 := st.Rigid(gtx, func() {
|
|
l := th.Label(b.Size, b.Label)
|
|
ins := layout.UniformInset(unit.Dp(4))
|
|
//paint.ColorOp{Color: b.Color}.Add(ops)
|
|
ins.Layout(gtx, func() {
|
|
l.Layout(gtx)
|
|
})
|
|
pointer.RectAreaOp{image.Rect(0, 0, gtx.Dimensions.Size.X, gtx.Dimensions.Size.Y)}.Add(gtx.Ops)
|
|
b.Click.Add(gtx.Ops)
|
|
})
|
|
c1 := st.Expand(gtx, func() {
|
|
layoutRRect(b.Background, gtx)
|
|
})
|
|
st.Layout(gtx, c1, c2)
|
|
})
|
|
}
|
|
|
|
func (b *Button) Clicked() bool {
|
|
return b.clicked
|
|
}
|
|
|
|
func (b *SelButton) Toggle() {
|
|
b.Selected = !b.Selected
|
|
b.SelColor, b.Background = b.Background, b.SelColor
|
|
}
|
|
|
|
func (b *SelButton) Select() {
|
|
if !b.Selected {
|
|
b.Toggle()
|
|
}
|
|
}
|
|
|
|
func (b *SelButton) Deselect() {
|
|
if b.Selected {
|
|
b.Toggle()
|
|
}
|
|
}
|
|
|
|
func (b *SelButton) Clicked() bool {
|
|
if b.clicked {
|
|
b.Toggle()
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|