This commit is contained in:
Will Murphy 2018-06-24 13:48:26 -04:00
parent 348e88e70b
commit 63332d4042
3 changed files with 60 additions and 11 deletions

@ -3,7 +3,6 @@ package ui
import (
"fmt"
"github.com/fatih/color"
"github.com/jroimartin/gocui"
)
@ -39,7 +38,7 @@ func (view *CommandView) Setup(v *gocui.View) error {
view.view = v
view.view.Frame = false
view.view.BgColor = gocui.ColorDefault + gocui.AttrReverse
view.view.Editable = true
// 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
@ -76,10 +75,7 @@ func (i *CommandView) Edit(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modi
}
func (view *CommandView) KeyHelp() string {
control := color.New(color.Bold).SprintFunc()
return control("[^C]") + ": Quit " +
control("[^Space]") + ": Switch View "
return "Type string to filter"
}
func (view *CommandView) Render() error {

@ -3,6 +3,7 @@ package ui
import (
"errors"
"fmt"
"regexp"
"strings"
@ -141,12 +142,26 @@ func (view *FileTreeView) getAbsPositionNode() (node *filetree.FileNode) {
}
return nil
}
evaluator = func(curNode *filetree.FileNode) bool {
return !curNode.Parent.Data.ViewInfo.Collapsed && !curNode.Data.ViewInfo.Hidden
var filterBytes []byte
var filterRegex *regexp.Regexp
read, err := Views.Command.view.Read(filterBytes)
if read > 0 && err == nil {
regex, err := regexp.Compile(string(filterBytes))
if err == nil {
filterRegex = regex
}
}
err := view.ModelTree.VisitDepthParentFirst(visiter, evaluator)
evaluator = func(curNode *filetree.FileNode) bool {
regexMatch := true
if filterRegex != nil {
match := filterRegex.Find([]byte(curNode.Path()))
regexMatch = match != nil
}
return !curNode.Parent.Data.ViewInfo.Collapsed && !curNode.Data.ViewInfo.Hidden && regexMatch
}
err = view.ModelTree.VisitDepthParentFirst(visiter, evaluator)
if err != nil {
panic(err)
}
@ -170,10 +185,33 @@ func (view *FileTreeView) toggleShowDiffType(diffType filetree.DiffType) error {
return view.Render()
}
func filterRegex() *regexp.Regexp {
if Views.Command == nil || Views.Command.view == nil {
return nil
}
var filterBytes []byte
read, err := Views.Command.view.Read(filterBytes)
if read > 0 && err == nil {
regex, err := regexp.Compile(string(filterBytes))
if err == nil {
return regex
}
}
if read > 0 && err != nil {
panic(err)
}
return nil
}
func (view *FileTreeView) updateViewTree() {
regex := filterRegex()
// keep the view selection in parity with the current DiffType selection
view.ModelTree.VisitDepthChildFirst(func(node *filetree.FileNode) error {
node.Data.ViewInfo.Hidden = view.HiddenDiffTypes[node.Data.DiffType]
if regex != nil {
match := regex.Find([]byte(node.Path()))
node.Data.ViewInfo.Hidden = match != nil
}
return nil
}, nil)

@ -42,6 +42,18 @@ func toggleView(g *gocui.Gui, v *gocui.View) error {
return err
}
func focusFilterView(g *gocui.Gui, v *gocui.View) error {
_, err := g.SetCurrentView(Views.Command.Name)
Render()
return err
}
func returnToTreeView(g *gocui.Gui, v *gocui.View) error {
_, err := g.SetCurrentView(Views.Tree.Name)
Render()
return err
}
func CursorDown(g *gocui.Gui, v *gocui.View) error {
cx, cy := v.Cursor()
@ -90,7 +102,10 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("main", gocui.KeyCtrlSpace, gocui.ModNone, toggleView); err != nil {
return err
}
if err := g.SetKeybinding("command", gocui.KeyCtrlSlash, gocui.ModNone, toggleView); err != nil {
if err := g.SetKeybinding("", gocui.KeyCtrlSlash, gocui.ModNone, focusFilterView); err != nil {
return err
}
if err := g.SetKeybinding("command", gocui.KeyEnter, gocui.ModNone, returnToTreeView); err != nil {
return err
}