dive-zfs/ui/filterview.go
2018-08-21 20:33:13 -04:00

122 lines
2.5 KiB
Go

package ui
import (
"fmt"
"github.com/jroimartin/gocui"
)
// with special thanks to https://gist.github.com/jroimartin/3b2e943a3811d795e0718b4a95b89bec
type FilterView struct {
Name string
gui *gocui.Gui
view *gocui.View
header *gocui.View
headerStr string
maxLength int
hidden bool
}
type Input struct {
name string
x, y int
w int
maxLength int
}
func NewFilterView(name string, gui *gocui.Gui) (filterview *FilterView) {
filterview = new(FilterView)
// populate main fields
filterview.Name = name
filterview.gui = gui
filterview.headerStr = "Path Filter: "
filterview.hidden = true
return filterview
}
func (view *FilterView) Setup(v *gocui.View, header *gocui.View) error {
// set view options
view.view = v
view.maxLength = 200
view.view.Frame = false
view.view.BgColor = gocui.AttrReverse
view.view.Editable = true
view.view.Editor = view
view.header = header
view.header.BgColor = gocui.AttrReverse
view.header.Editable = false
view.header.Wrap = false
view.header.Frame = false
// set keybindings
// if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorDown() }); err != nil {
// return err
// }
// if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorUp() }); err != nil {
// return err
// }
view.Render()
return nil
}
func (view *FilterView) IsVisible() bool {
if view == nil {return false}
return !view.hidden
}
func (view *FilterView) CursorDown() error {
return nil
}
func (view *FilterView) CursorUp() error {
return nil
}
func (view *FilterView) Edit(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
if !view.IsVisible() {
return
}
cx, _ := v.Cursor()
ox, _ := v.Origin()
limit := ox+cx+1 > view.maxLength
switch {
case ch != 0 && mod == 0 && !limit:
v.EditWrite(ch)
case key == gocui.KeySpace && !limit:
v.EditWrite(' ')
case key == gocui.KeyBackspace || key == gocui.KeyBackspace2:
v.EditDelete(true)
}
if Views.Tree != nil {
Views.Tree.Update()
Views.Tree.Render()
}
}
func (view *FilterView) KeyHelp() string {
return Formatting.StatusControlNormal("▏Type to filter the file tree ")
}
func (view *FilterView) Update() error {
return nil
}
func (view *FilterView) Render() error {
view.gui.Update(func(g *gocui.Gui) error {
// render the header
fmt.Fprintln(view.header, Formatting.Header(view.headerStr))
return nil
})
// todo: blerg
return nil
}