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}