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}