Added left arrow navigation for moving to parent directory or top of root (#43)

This commit is contained in:
Akshay Chhajed 2018-10-27 19:51:33 +05:30 committed by Alex Goodman
parent 8b08736178
commit b3c0e35c07

View File

@ -69,6 +69,9 @@ func (view *FileTreeView) Setup(v *gocui.View, header *gocui.View) error {
if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorUp() }); err != nil {
return err
}
if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowLeft, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorLeft() }); err != nil {
return err
}
if err := view.gui.SetKeybinding(view.Name, gocui.KeySpace, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleCollapse() }); err != nil {
return err
}
@ -192,6 +195,62 @@ func (view *FileTreeView) CursorUp() error {
return nil
}
//CursorLeft moves the cursor up until we reach the Parent Node or top of the tree
func (view *FileTreeView) CursorLeft() error {
var visitor func(*filetree.FileNode) error
var evaluator func(*filetree.FileNode) bool
var dfsCounter, newIndex uint
oldIndex := view.TreeIndex
parentPath := view.getAbsPositionNode().Parent.Path()
visitor = func(curNode *filetree.FileNode) error {
if strings.Compare(parentPath, curNode.Path()) == 0 {
newIndex = dfsCounter
}
dfsCounter++
return nil
}
var filterBytes []byte
var filterRegex *regexp.Regexp
read, err := Views.Filter.view.Read(filterBytes)
if read > 0 && err == nil {
regex, err := regexp.Compile(string(filterBytes))
if err == nil {
filterRegex = regex
}
}
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(visitor, evaluator)
if err != nil {
panic(err)
}
view.TreeIndex = newIndex
moveIndex := oldIndex - newIndex
if newIndex < view.bufferIndexLowerBound {
view.bufferIndexUpperBound = view.TreeIndex + view.height()
view.bufferIndexLowerBound = view.TreeIndex
}
if view.bufferIndex > moveIndex {
view.bufferIndex = view.bufferIndex - moveIndex
} else {
view.bufferIndex = 0
}
view.Update()
return view.Render()
}
// getAbsPositionNode determines the selected screen cursor's location in the file tree, returning the selected FileNode.
func (view *FileTreeView) getAbsPositionNode() (node *filetree.FileNode) {
var visitor func(*filetree.FileNode) error