Files
prevara/incdec.go
2025-11-30 16:45:22 +00:00

148 lines
2.8 KiB
Go

package gel
import (
"fmt"
l "github.com/p9c/p9/pkg/gel/gio/layout"
"golang.org/x/exp/shiny/materialdesign/icons"
)
type IncDec struct {
*Window
nDigits int
min, max int
amount int
current int
changeHook func(n int)
inc, dec *Clickable
color, background string
inactive string
scale float32
}
// IncDec is a simple increment/decrement for a number setting
func (w *Window) IncDec() (out *IncDec) {
out = &IncDec{
Window: w,
// nDigits: nDigits,
// min: min,
// max: max,
// current: current,
// changeHook: changeHook,
inc: w.Clickable(),
dec: w.Clickable(),
color: "DocText",
background: "Transparent",
inactive: "Transparent",
amount: 1,
scale: 1,
}
return
}
func (in *IncDec) Scale(n float32) *IncDec {
in.scale = n
return in
}
func (in *IncDec) Amount(n int) *IncDec {
in.amount = n
return in
}
func (in *IncDec) ChangeHook(fn func(n int)) *IncDec {
in.changeHook = fn
return in
}
func (in *IncDec) SetCurrent(current int) *IncDec {
in.current = current
return in
}
func (in *IncDec) GetCurrent() int {
return in.current
}
func (in *IncDec) Max(max int) *IncDec {
in.max = max
return in
}
func (in *IncDec) Min(min int) *IncDec {
in.min = min
return in
}
func (in *IncDec) NDigits(nDigits int) *IncDec {
in.nDigits = nDigits
return in
}
func (in *IncDec) Color(color string) *IncDec {
in.color = color
return in
}
func (in *IncDec) Background(color string) *IncDec {
in.background = color
return in
}
func (in *IncDec) Inactive(color string) *IncDec {
in.inactive = color
return in
}
func (in *IncDec) Fn(gtx l.Context) l.Dimensions {
out := in.Theme.Flex().AlignMiddle()
incColor, decColor := in.color, in.color
if in.current != in.min {
out.Rigid(
in.Inset(
0.25,
in.ButtonLayout(
in.inc.SetClick(
func() {
ic := in.current
ic -= in.amount
if ic < in.min {
ic = in.min
}
in.current = ic
in.changeHook(ic)
},
),
).Background(in.background).Embed(
in.Icon().Color(decColor).Scale(in.scale).Src(&icons.ContentRemove).Fn,
).Fn,
).Fn,
)
}
cur := fmt.Sprintf("%"+fmt.Sprint(in.nDigits)+"d", in.current)
out.Rigid(in.Caption(cur).Color(in.color).TextScale(in.scale).Font("go regular").Fn)
if in.current != in.max {
out.Rigid(
in.Inset(
0.25,
in.ButtonLayout(
in.dec.SetClick(
func() {
ic := in.current
ic += in.amount
if in.current > in.max {
in.current = in.max
} else {
in.current = ic
in.changeHook(in.current)
}
},
),
).Background(in.background).Embed(
in.Icon().Color(incColor).Scale(in.scale).Src(&icons.ContentAdd).Fn,
).Fn,
).Fn,
)
}
return out.Fn(gtx)
}