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		_, err = v.Write([]byte(ip.preload))
 59		if err != nil {
 60			return err
 61		}
 62	}
 63
 64	if _, err := g.SetCurrentView(inputPopupView); err != nil {
 65		return err
 66	}
 67
 68	return nil
 69}
 70
 71func (ip *inputPopup) close(g *gocui.Gui, v *gocui.View) error {
 72	ip.title = ""
 73	ip.active = false
 74	return g.DeleteView(inputPopupView)
 75}
 76
 77func (ip *inputPopup) validate(g *gocui.Gui, v *gocui.View) error {
 78	ip.title = ""
 79
 80	content, err := ioutil.ReadAll(v)
 81	if err != nil {
 82		return err
 83	}
 84
 85	ip.title = ""
 86	ip.active = false
 87	err = g.DeleteView(inputPopupView)
 88	if err != nil {
 89		return err
 90	}
 91
 92	ip.c <- string(content)
 93
 94	return nil
 95}
 96
 97func (ip *inputPopup) ActivateWithContent(title string, content string) <-chan string {
 98	ip.preload = content
 99	return ip.Activate(title)
100}
101
102func (ip *inputPopup) Activate(title string) <-chan string {
103	ip.title = title
104	ip.active = true
105	ip.c = make(chan string)
106	return ip.c
107}