aboutsummaryrefslogtreecommitdiffstats
path: root/termui/input_popup.go
diff options
context:
space:
mode:
Diffstat (limited to 'termui/input_popup.go')
-rw-r--r--termui/input_popup.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/termui/input_popup.go b/termui/input_popup.go
new file mode 100644
index 00000000..00e602e5
--- /dev/null
+++ b/termui/input_popup.go
@@ -0,0 +1,96 @@
+package termui
+
+import (
+ "io/ioutil"
+
+ "github.com/jroimartin/gocui"
+)
+
+const inputPopupView = "inputPopupView"
+
+type inputPopup struct {
+ active bool
+ title string
+ c chan string
+}
+
+func newInputPopup() *inputPopup {
+ return &inputPopup{}
+}
+
+func (ip *inputPopup) keybindings(g *gocui.Gui) error {
+ // Close
+ if err := g.SetKeybinding(inputPopupView, gocui.KeyEsc, gocui.ModNone, ip.close); err != nil {
+ return err
+ }
+
+ // Validate
+ if err := g.SetKeybinding(inputPopupView, gocui.KeyEnter, gocui.ModNone, ip.validate); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (ip *inputPopup) layout(g *gocui.Gui) error {
+ if !ip.active {
+ return nil
+ }
+
+ maxX, maxY := g.Size()
+
+ width := minInt(30, maxX)
+ height := 2
+ x0 := (maxX - width) / 2
+ y0 := (maxY - height) / 2
+
+ v, err := g.SetView(inputPopupView, x0, y0, x0+width, y0+height)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+
+ v.Frame = true
+ v.Title = ip.title
+ v.Editable = true
+ }
+
+ if _, err := g.SetCurrentView(inputPopupView); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (ip *inputPopup) close(g *gocui.Gui, v *gocui.View) error {
+ ip.title = ""
+ ip.active = false
+ return g.DeleteView(inputPopupView)
+}
+
+func (ip *inputPopup) validate(g *gocui.Gui, v *gocui.View) error {
+ ip.title = ""
+
+ content, err := ioutil.ReadAll(v)
+ if err != nil {
+ return err
+ }
+
+ ip.title = ""
+ ip.active = false
+ err = g.DeleteView(inputPopupView)
+ if err != nil {
+ return err
+ }
+
+ ip.c <- string(content)
+
+ return nil
+}
+
+func (ip *inputPopup) Activate(title string) <-chan string {
+ ip.title = title
+ ip.active = true
+ ip.c = make(chan string)
+ return ip.c
+}