incdec.go raw
1 package gel
2
3 import (
4 "fmt"
5
6 l "github.com/p9c/gio/layout"
7 "golang.org/x/exp/shiny/materialdesign/icons"
8 )
9
10 type IncDec struct {
11 *Window
12 nDigits int
13 min, max int
14 amount int
15 current int
16 changeHook func(n int)
17 inc, dec *Clickable
18 color, background string
19 inactive string
20 scale float32
21 }
22
23 // IncDec is a simple increment/decrement for a number setting
24 func (w *Window) IncDec() (out *IncDec) {
25 out = &IncDec{
26 Window: w,
27 // nDigits: nDigits,
28 // min: min,
29 // max: max,
30 // current: current,
31 // changeHook: changeHook,
32 inc: w.Clickable(),
33 dec: w.Clickable(),
34 color: "DocText",
35 background: "Transparent",
36 inactive: "Transparent",
37 amount: 1,
38 scale: 1,
39 }
40 return
41 }
42
43 func (in *IncDec) Scale(n float32) *IncDec {
44 in.scale = n
45 return in
46 }
47
48 func (in *IncDec) Amount(n int) *IncDec {
49 in.amount = n
50 return in
51 }
52
53 func (in *IncDec) ChangeHook(fn func(n int)) *IncDec {
54 in.changeHook = fn
55 return in
56 }
57
58 func (in *IncDec) SetCurrent(current int) *IncDec {
59 in.current = current
60 return in
61 }
62
63 func (in *IncDec) GetCurrent() int {
64 return in.current
65 }
66
67 func (in *IncDec) Max(max int) *IncDec {
68 in.max = max
69 return in
70 }
71
72 func (in *IncDec) Min(min int) *IncDec {
73 in.min = min
74 return in
75 }
76
77 func (in *IncDec) NDigits(nDigits int) *IncDec {
78 in.nDigits = nDigits
79 return in
80 }
81
82 func (in *IncDec) Color(color string) *IncDec {
83 in.color = color
84 return in
85 }
86
87 func (in *IncDec) Background(color string) *IncDec {
88 in.background = color
89 return in
90 }
91 func (in *IncDec) Inactive(color string) *IncDec {
92 in.inactive = color
93 return in
94 }
95
96 func (in *IncDec) Fn(gtx l.Context) l.Dimensions {
97 out := in.Theme.Flex().AlignMiddle()
98 incColor, decColor := in.color, in.color
99 if in.current != in.min {
100 out.Rigid(
101 in.Inset(
102 0.25,
103 in.ButtonLayout(
104 in.inc.SetClick(
105 func() {
106 ic := in.current
107 ic -= in.amount
108 if ic < in.min {
109 ic = in.min
110 }
111 in.current = ic
112 in.changeHook(ic)
113 },
114 ),
115 ).Background(in.background).Embed(
116 in.Icon().Color(decColor).Scale(in.scale).Src(&icons.ContentRemove).Fn,
117 ).Fn,
118 ).Fn,
119 )
120 }
121 cur := fmt.Sprintf("%"+fmt.Sprint(in.nDigits)+"d", in.current)
122 out.Rigid(in.Caption(cur).Color(in.color).TextScale(in.scale).Font("go regular").Fn)
123 if in.current != in.max {
124 out.Rigid(
125 in.Inset(
126 0.25,
127 in.ButtonLayout(
128 in.dec.SetClick(
129 func() {
130 ic := in.current
131 ic += in.amount
132 if in.current > in.max {
133 in.current = in.max
134 } else {
135 in.current = ic
136 in.changeHook(in.current)
137 }
138 },
139 ),
140 ).Background(in.background).Embed(
141 in.Icon().Color(incColor).Scale(in.scale).Src(&icons.ContentAdd).Fn,
142 ).Fn,
143 ).Fn,
144 )
145 }
146 return out.Fn(gtx)
147 }
148