diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/dirlist.go | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 600b38c..418d2ea 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -26,6 +26,7 @@ type DirectoryList struct { logger *log.Logger selecting string selected string + scroll int spinner *Spinner worker *types.Worker } @@ -207,11 +208,17 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { return } - row := 0 - for _, name := range dirlist.dirs { + dirlist.ensureScroll(ctx.Height()) + + for i, name := range dirlist.dirs { + if i < dirlist.scroll { + continue + } + row := i - dirlist.scroll if row >= ctx.Height() { break } + style := tcell.StyleDefault if name == dirlist.selected { style = style.Reverse(true) @@ -226,7 +233,32 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { }) ctx.Printf(0, row, style, dirString) - row++ + } +} + +func (dirlist *DirectoryList) ensureScroll(h int) { + selectingIdx := findString(dirlist.dirs, dirlist.selecting) + + maxScroll := len(dirlist.dirs) - h + if maxScroll < 0 { + maxScroll = 0 + } + + if selectingIdx >= dirlist.scroll && selectingIdx < dirlist.scroll+h { + if dirlist.scroll > maxScroll { + dirlist.scroll = maxScroll + } + return + } + + if selectingIdx >= dirlist.scroll+h { + dirlist.scroll = selectingIdx - h + 1 + } else if selectingIdx < dirlist.scroll { + dirlist.scroll = selectingIdx + } + + if dirlist.scroll > maxScroll { + dirlist.scroll = maxScroll } } |