Add page functions for FileTreeView (#53)

This commit is contained in:
Akshay Chhajed 2018-10-31 22:40:42 +05:30 committed by Alex Goodman
parent f3f2ec9a8c
commit 81cbb143da

View File

@ -76,6 +76,12 @@ func (view *FileTreeView) Setup(v *gocui.View, header *gocui.View) error {
if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowRight, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorRight() }); err != nil {
return err
}
if err := view.gui.SetKeybinding(view.Name, gocui.KeyPgdn, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.PageDown() }); err != nil {
return err
}
if err := view.gui.SetKeybinding(view.Name, gocui.KeyPgup, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.PageUp() }); 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
}
@ -283,6 +289,56 @@ func (view *FileTreeView) CursorRight() error {
return view.Render()
}
// PageDown moves to next page putting the cursor on top
func (view *FileTreeView) PageDown() error {
nextBufferIndexLowerBound := view.bufferIndexLowerBound + view.height()
nextBufferIndexUpperBound := view.bufferIndexUpperBound + view.height()
treeString := view.ViewTree.StringBetween(nextBufferIndexLowerBound, nextBufferIndexUpperBound, true)
lines := strings.Split(treeString, "\n")
newLines := uint(len(lines)) - 1
if view.height() >= newLines {
nextBufferIndexLowerBound = view.bufferIndexLowerBound + newLines
nextBufferIndexUpperBound = view.bufferIndexUpperBound + newLines
}
view.bufferIndexLowerBound = nextBufferIndexLowerBound
view.bufferIndexUpperBound = nextBufferIndexUpperBound
if view.TreeIndex < nextBufferIndexLowerBound {
view.bufferIndex = 0
view.TreeIndex = nextBufferIndexLowerBound
} else {
view.bufferIndex = view.bufferIndex - newLines
}
return view.Render()
}
// PageUp moves to previous page putting the cursor on top
func (view *FileTreeView) PageUp() error {
nextBufferIndexLowerBound := view.bufferIndexLowerBound - view.height()
nextBufferIndexUpperBound := view.bufferIndexUpperBound - view.height()
treeString := view.ViewTree.StringBetween(nextBufferIndexLowerBound, nextBufferIndexUpperBound, true)
lines := strings.Split(treeString, "\n")
newLines := uint(len(lines)) - 2
if view.height() >= newLines {
nextBufferIndexLowerBound = view.bufferIndexLowerBound - newLines
nextBufferIndexUpperBound = view.bufferIndexUpperBound - newLines
}
view.bufferIndexLowerBound = nextBufferIndexLowerBound
view.bufferIndexUpperBound = nextBufferIndexUpperBound
if view.TreeIndex > (nextBufferIndexUpperBound - 1) {
view.bufferIndex = 0
view.TreeIndex = nextBufferIndexLowerBound
} else {
view.bufferIndex = view.bufferIndex + newLines
}
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