117 lines
2.9 KiB
Go
117 lines
2.9 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/jroimartin/gocui"
|
|
)
|
|
|
|
// DetailsView holds the UI objects and data models for populating the bottom row. Specifically the pane that
|
|
// allows the user to filter the file tree by path.
|
|
type FilterView struct {
|
|
Name string
|
|
gui *gocui.Gui
|
|
view *gocui.View
|
|
header *gocui.View
|
|
headerStr string
|
|
maxLength int
|
|
hidden bool
|
|
}
|
|
|
|
// NewFilterView creates a new view object attached the the global [gocui] screen object.
|
|
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
|
|
}
|
|
|
|
// Setup initializes the UI concerns within the context of a global [gocui] view object.
|
|
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
|
|
|
|
view.Render()
|
|
|
|
return nil
|
|
}
|
|
|
|
// IsVisible indicates if the filter view pane is currently initialized
|
|
func (view *FilterView) IsVisible() bool {
|
|
if view == nil {
|
|
return false
|
|
}
|
|
return !view.hidden
|
|
}
|
|
|
|
// CursorDown moves the cursor down in the filter pane (currently indicates nothing).
|
|
func (view *FilterView) CursorDown() error {
|
|
return nil
|
|
}
|
|
|
|
// CursorUp moves the cursor up in the filter pane (currently indicates nothing).
|
|
func (view *FilterView) CursorUp() error {
|
|
return nil
|
|
}
|
|
|
|
// Edit intercepts the key press events in the filer view to update the file view in real time.
|
|
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()
|
|
}
|
|
}
|
|
|
|
// Update refreshes the state objects for future rendering (currently does nothing).
|
|
func (view *FilterView) Update() error {
|
|
return nil
|
|
}
|
|
|
|
// Render flushes the state objects to the screen. Currently this is the users path filter input.
|
|
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
|
|
})
|
|
return nil
|
|
}
|
|
|
|
// KeyHelp indicates all the possible actions a user can take while the current pane is selected.
|
|
func (view *FilterView) KeyHelp() string {
|
|
return Formatting.StatusControlNormal("▏Type to filter the file tree ")
|
|
}
|