enum.go raw
1 package gel
2
3 import (
4 "image"
5
6 "github.com/p9c/gio/gesture"
7 "github.com/p9c/gio/io/pointer"
8 l "github.com/p9c/gio/layout"
9 "github.com/p9c/gio/op"
10 )
11
12 type Enum struct {
13 value string
14 changed bool
15 clicks []gesture.Click
16 values []string
17 hook func(value string)
18 }
19
20 func (w *Window) Enum() *Enum {
21 return &Enum{hook: func(string) {}}
22 }
23
24 func (e *Enum) Value() string {
25 return e.value
26 }
27
28 func (e *Enum) SetValue(value string) *Enum {
29 e.value = value
30 return e
31 }
32
33 func (e *Enum) SetOnChange(hook func(value string)) *Enum {
34 e.hook = hook
35 return e
36 }
37
38 func index(vs []string, t string) int {
39 for i, v := range vs {
40 if v == t {
41 return i
42 }
43 }
44 return -1
45 }
46
47 // Changed reports whether Value has changed by user interaction since the last call to Changed.
48 func (e *Enum) Changed() bool {
49 changed := e.changed
50 e.changed = false
51 return changed
52 }
53
54 // Fn adds the event handler for key.
55 func (e *Enum) Fn(gtx l.Context, key string) l.Dimensions {
56 defer op.Save(gtx.Ops).Load()
57 pointer.Rect(image.Rectangle{Max: gtx.Constraints.Min}).Add(gtx.Ops)
58
59 if index(e.values, key) == -1 {
60 e.values = append(e.values, key)
61 e.clicks = append(e.clicks, gesture.Click{})
62 e.clicks[len(e.clicks)-1].Add(gtx.Ops)
63 } else {
64 idx := index(e.values, key)
65 clk := &e.clicks[idx]
66 for _, ev := range clk.Events(gtx) {
67 switch ev.Type {
68 case gesture.TypeClick:
69 if niew := e.values[idx]; niew != e.value {
70 e.value = niew
71 e.changed = true
72 e.hook(e.value)
73 }
74 }
75 }
76 clk.Add(gtx.Ops)
77 }
78
79 return l.Dimensions{Size: gtx.Constraints.Min}
80 }
81