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