input_popup.go

  1package termui
  2
  3import (
  4	"io/ioutil"
  5
  6	"github.com/jroimartin/gocui"
  7)
  8
  9const inputPopupView = "inputPopupView"
 10
 11// inputPopup is a simple popup with an input field
 12type inputPopup struct {
 13	active  bool
 14	title   string
 15	preload string
 16	c       chan string
 17}
 18
 19func newInputPopup() *inputPopup {
 20	return &inputPopup{}
 21}
 22
 23func (ip *inputPopup) keybindings(g *gocui.Gui) error {
 24	// Close
 25	if err := g.SetKeybinding(inputPopupView, gocui.KeyEsc, gocui.ModNone, ip.close); err != nil {
 26		return err
 27	}
 28
 29	// Validate
 30	if err := g.SetKeybinding(inputPopupView, gocui.KeyEnter, gocui.ModNone, ip.validate); err != nil {
 31		return err
 32	}
 33
 34	return nil
 35}
 36
 37func (ip *inputPopup) layout(g *gocui.Gui) error {
 38	if !ip.active {
 39		return nil
 40	}
 41
 42	maxX, maxY := g.Size()
 43
 44	width := minInt(30, maxX)
 45	height := 2
 46	x0 := (maxX - width) / 2
 47	y0 := (maxY - height) / 2
 48
 49	v, err := g.SetView(inputPopupView, x0, y0, x0+width, y0+height)
 50	if err != nil {
 51		if err != gocui.ErrUnknownView {
 52			return err
 53		}
 54
 55		v.Frame = true
 56		v.Title = ip.title
 57		v.Editable = true
 58		v.Write([]byte(ip.preload))
 59	}
 60
 61	if _, err := g.SetCurrentView(inputPopupView); err != nil {
 62		return err
 63	}
 64
 65	return nil
 66}
 67
 68func (ip *inputPopup) close(g *gocui.Gui, v *gocui.View) error {
 69	ip.title = ""
 70	ip.active = false
 71	return g.DeleteView(inputPopupView)
 72}
 73
 74func (ip *inputPopup) validate(g *gocui.Gui, v *gocui.View) error {
 75	ip.title = ""
 76
 77	content, err := ioutil.ReadAll(v)
 78	if err != nil {
 79		return err
 80	}
 81
 82	ip.title = ""
 83	ip.active = false
 84	err = g.DeleteView(inputPopupView)
 85	if err != nil {
 86		return err
 87	}
 88
 89	ip.c <- string(content)
 90
 91	return nil
 92}
 93
 94func (ip *inputPopup) ActivateWithContent(title string, content string) <-chan string {
 95	ip.preload = content
 96	return ip.Activate(title)
 97}
 98
 99func (ip *inputPopup) Activate(title string) <-chan string {
100	ip.title = title
101	ip.active = true
102	ip.c = make(chan string)
103	return ip.c
104}