input_popup.go

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