main.go raw
1 package main
2
3 import (
4 "sort"
5
6 l "github.com/p9c/gio/layout"
7 "github.com/atotto/clipboard"
8 "github.com/p9c/interrupt"
9 "github.com/p9c/qu"
10
11 "github.com/p9c/gel/icons"
12
13 "github.com/p9c/gel"
14 )
15
16 type State struct {
17 *gel.Window
18 }
19
20 func NewState(quit qu.C) *State {
21 return &State{
22 Window: gel.NewWindowP9(quit),
23 }
24 }
25
26 func main() {
27 quit := qu.T()
28 state := NewState(quit)
29 var e error
30 rootWidget := state.rootWidget()
31 if e = state.Window.
32 Size(48, 32).
33 Title("icons chooser").
34 Open().
35 Run(rootWidget, func() {
36 interrupt.Request()
37 quit.Q()
38 }, quit,
39 ); E.Chk(e) {
40
41 }
42 }
43
44 type (
45 iconInfo struct {
46 name string
47 data *[]byte
48 }
49 iconsInfo []iconInfo
50 )
51
52 func (ii iconsInfo) Len() int { return len(ii) }
53 func (ii iconsInfo) Less(i, j int) bool { return ii[i].name < ii[j].name }
54 func (ii iconsInfo) Swap(i, j int) { ii[i], ii[j] = ii[j], ii[i] }
55
56 func (s *State) rootWidget() (o l.Widget) {
57 lis := s.WidgetPool.GetList()
58 ow := make(iconsInfo, len(icons.Material))
59 counter := 0
60 for i, x := range icons.Material {
61 ow[counter] = iconInfo{i, x}
62 counter++
63 }
64 sort.Sort(ow)
65 clicks := make([]*gel.Clickable, len(ow))
66 for i := range ow {
67 clicks[i] = s.WidgetPool.GetClickable()
68 }
69 le := func(gtx l.Context, index int) l.Dimensions {
70 clicks[index].SetClick(func() {
71 var e error
72 if e = clipboard.WriteAll("icons." + ow[index].name); E.Chk(e) {
73 }
74 },
75 )
76 return s.Flex().AlignStart().
77 // Rigid(s.Inset(0.5, gel.EmptySpace(0, 0)).Fn).
78 Rigid(
79 s.ButtonLayout(clicks[index]).Embed(
80 s.Flex().AlignMiddle().
81 Rigid(
82 s.Icon().
83 Scale(gel.Scales["H3"]).
84 Color("DocText").
85 Src(ow[index].data).
86 Fn,
87 ).
88 Rigid(
89 s.Body1(ow[index].name).Fn,
90 ).Fn,
91 ).Background("PanelBg").Fn,
92 ).
93 Fn(gtx)
94 }
95 return s.VFlex().AlignStart().
96 Rigid(s.Fill("DocBg", l.Center, 0, 0,
97 s.Inset(0.5,
98 s.Flex().AlignStart().
99 Rigid(
100 s.H4("material icons").Fn,
101 ).
102 Rigid(s.Inset(0.5, gel.EmptySpace(0, 0)).Fn).
103 Flexed(1,
104 s.Body1("click to copy icon's variable name").Fn,
105 ).Fn,
106 ).Fn,
107 ).Fn,
108 ).
109 Flexed(1,
110 s.Inset(0.25,
111 lis.Vertical().Length(len(ow)).ListElement(le).Fn,
112 ).Fn,
113 ).
114 Fn
115 }
116