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