Add dirlist scrolling

Should fix #402
This commit is contained in:
Jeffas 2020-05-30 21:27:27 +01:00 committed by Reto Brunner
parent a69399a138
commit 3877b1aa71
1 changed files with 35 additions and 3 deletions

View File

@ -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
}
}