From 63332d40429c5cd42ed99eed2ef2d13038e5eac8 Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Sun, 24 Jun 2018 13:48:26 -0400 Subject: [PATCH] wip --- ui/commandview.go | 8 ++------ ui/filetreeview.go | 46 ++++++++++++++++++++++++++++++++++++++++++---- ui/ui.go | 17 ++++++++++++++++- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/ui/commandview.go b/ui/commandview.go index 55d21ef..d94e471 100644 --- a/ui/commandview.go +++ b/ui/commandview.go @@ -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 { diff --git a/ui/filetreeview.go b/ui/filetreeview.go index 3b51195..774fb74 100644 --- a/ui/filetreeview.go +++ b/ui/filetreeview.go @@ -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) diff --git a/ui/ui.go b/ui/ui.go index 410cf6b..e3d0136 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -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 }