@@ -76,6 +76,12 @@ func (view *FileTreeView) Setup(v *gocui.View, header *gocui.View) error {
76
76
if err := view .gui .SetKeybinding (view .Name , gocui .KeyArrowRight , gocui .ModNone , func (* gocui.Gui , * gocui.View ) error { return view .CursorRight () }); err != nil {
77
77
return err
78
78
}
79
+ if err := view .gui .SetKeybinding (view .Name , gocui .KeyPgdn , gocui .ModNone , func (* gocui.Gui , * gocui.View ) error { return view .PageDown () }); err != nil {
80
+ return err
81
+ }
82
+ if err := view .gui .SetKeybinding (view .Name , gocui .KeyPgup , gocui .ModNone , func (* gocui.Gui , * gocui.View ) error { return view .PageUp () }); err != nil {
83
+ return err
84
+ }
79
85
if err := view .gui .SetKeybinding (view .Name , gocui .KeySpace , gocui .ModNone , func (* gocui.Gui , * gocui.View ) error { return view .toggleCollapse () }); err != nil {
80
86
return err
81
87
}
@@ -283,6 +289,56 @@ func (view *FileTreeView) CursorRight() error {
283
289
return view .Render ()
284
290
}
285
291
292
+ // PageDown moves to next page putting the cursor on top
293
+ func (view * FileTreeView ) PageDown () error {
294
+ nextBufferIndexLowerBound := view .bufferIndexLowerBound + view .height ()
295
+ nextBufferIndexUpperBound := view .bufferIndexUpperBound + view .height ()
296
+
297
+ treeString := view .ViewTree .StringBetween (nextBufferIndexLowerBound , nextBufferIndexUpperBound , true )
298
+ lines := strings .Split (treeString , "\n " )
299
+
300
+ newLines := uint (len (lines )) - 1
301
+ if view .height () >= newLines {
302
+ nextBufferIndexLowerBound = view .bufferIndexLowerBound + newLines
303
+ nextBufferIndexUpperBound = view .bufferIndexUpperBound + newLines
304
+ }
305
+ view .bufferIndexLowerBound = nextBufferIndexLowerBound
306
+ view .bufferIndexUpperBound = nextBufferIndexUpperBound
307
+
308
+ if view .TreeIndex < nextBufferIndexLowerBound {
309
+ view .bufferIndex = 0
310
+ view .TreeIndex = nextBufferIndexLowerBound
311
+ } else {
312
+ view .bufferIndex = view .bufferIndex - newLines
313
+ }
314
+ return view .Render ()
315
+ }
316
+
317
+ // PageUp moves to previous page putting the cursor on top
318
+ func (view * FileTreeView ) PageUp () error {
319
+ nextBufferIndexLowerBound := view .bufferIndexLowerBound - view .height ()
320
+ nextBufferIndexUpperBound := view .bufferIndexUpperBound - view .height ()
321
+
322
+ treeString := view .ViewTree .StringBetween (nextBufferIndexLowerBound , nextBufferIndexUpperBound , true )
323
+ lines := strings .Split (treeString , "\n " )
324
+
325
+ newLines := uint (len (lines )) - 2
326
+ if view .height () >= newLines {
327
+ nextBufferIndexLowerBound = view .bufferIndexLowerBound - newLines
328
+ nextBufferIndexUpperBound = view .bufferIndexUpperBound - newLines
329
+ }
330
+ view .bufferIndexLowerBound = nextBufferIndexLowerBound
331
+ view .bufferIndexUpperBound = nextBufferIndexUpperBound
332
+
333
+ if view .TreeIndex > (nextBufferIndexUpperBound - 1 ) {
334
+ view .bufferIndex = 0
335
+ view .TreeIndex = nextBufferIndexLowerBound
336
+ } else {
337
+ view .bufferIndex = view .bufferIndex + newLines
338
+ }
339
+ return view .Render ()
340
+ }
341
+
286
342
// getAbsPositionNode determines the selected screen cursor's location in the file tree, returning the selected FileNode.
287
343
func (view * FileTreeView ) getAbsPositionNode () (node * filetree.FileNode ) {
288
344
var visitor func (* filetree.FileNode ) error
0 commit comments