main.go raw

   1  package main
   2  
   3  import (
   4  	"sort"
   5  
   6  	l "github.com/p9c/p9/pkg/gel/gio/layout"
   7  	"github.com/atotto/clipboard"
   8  	"github.com/p9c/p9/pkg/interrupt"
   9  	"github.com/p9c/p9/pkg/qu"
  10  
  11  	"github.com/p9c/p9/pkg/gel/icons"
  12  
  13  	"github.com/p9c/p9/pkg/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