89 lines
1.6 KiB
Go
89 lines
1.6 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/jroimartin/gocui"
|
|
)
|
|
|
|
type TXSearch struct {
|
|
gui *gocui.Gui
|
|
|
|
opened bool
|
|
txid string
|
|
cb func(string) error
|
|
}
|
|
|
|
func NewTXSearch(gui *gocui.Gui) *TXSearch {
|
|
ts := &TXSearch{gui: gui}
|
|
return ts
|
|
}
|
|
|
|
func (s *TXSearch) Callback(fn func(txId string) error) {
|
|
s.cb = fn
|
|
}
|
|
|
|
func (s *TXSearch) SetKeybinding() {
|
|
s.gui.SetKeybinding("", 'f', gocui.ModNone, func(*gocui.Gui, *gocui.View) error {
|
|
s.gui.DeleteKeybinding("", 'f', gocui.ModNone)
|
|
s.Open()
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func (s *TXSearch) Layout(g *gocui.Gui) error {
|
|
name := "tx_search"
|
|
if !s.opened {
|
|
g.Cursor = false
|
|
g.DeleteView(name)
|
|
return nil
|
|
}
|
|
|
|
g.Cursor = true
|
|
x, y := g.Size()
|
|
v, err := g.SetView(name, x/2-35, y/2-1, x/2+35, y/2+1)
|
|
if err != nil {
|
|
if err != gocui.ErrUnknownView {
|
|
return err
|
|
}
|
|
v.Title = "Track transaction (txid)"
|
|
v.Editable = true
|
|
g.SetCurrentView(name)
|
|
v.Editor = gocui.EditorFunc(s.editFn)
|
|
v.Autoscroll = false
|
|
fmt.Fprintf(v, "%s", s.txid)
|
|
v.SetCursor(len(s.txid), 0)
|
|
|
|
g.SetKeybinding(v.Name(), gocui.KeyEsc, gocui.ModNone, func(*gocui.Gui, *gocui.View) error {
|
|
s.Close()
|
|
return nil
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *TXSearch) editFn(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
|
|
switch key {
|
|
case gocui.KeyEnter:
|
|
if id := s.txid; id != "" {
|
|
s.cb(id)
|
|
}
|
|
s.Close()
|
|
case gocui.KeyArrowDown, gocui.KeyArrowUp:
|
|
return
|
|
}
|
|
|
|
gocui.DefaultEditor.Edit(v, key, ch, mod)
|
|
s.txid, _ = v.Line(0)
|
|
}
|
|
|
|
func (s *TXSearch) Open() {
|
|
s.opened = true
|
|
}
|
|
|
|
func (s *TXSearch) Close() {
|
|
s.SetKeybinding()
|
|
s.opened = false
|
|
}
|