1package termui
2
3import (
4 "io/ioutil"
5
6 "github.com/jesseduffield/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, 0)
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}