passgo/cmd/passgo-gui/ui.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
}
}