diff options
author | Jeffas <dev@jeffas.io> | 2020-06-09 19:49:23 +0100 |
---|---|---|
committer | Reto Brunner <reto@labrat.space> | 2020-06-09 20:50:28 +0200 |
commit | c6f4d7badd4cb36067f0e76198630a3d0f9e7ce9 (patch) | |
tree | b429620f599eee7b5efc04b528ff9e3acfca0278 | |
parent | 543510f5c146aa6e4d3344ec7d109ad7945fa106 (diff) | |
download | aerc-c6f4d7badd4cb36067f0e76198630a3d0f9e7ce9.tar.gz |
Add dirlist scrollbar
This mimics the scrollbar implementation from the completion popover.
Only showing it when necessary and adapting the dirlist strings
appropriately.
-rw-r--r-- | widgets/dirlist.go | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 418d2eaf..f12631b7 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -3,6 +3,7 @@ package widgets import ( "fmt" "log" + "math" "regexp" "sort" @@ -210,6 +211,20 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { dirlist.ensureScroll(ctx.Height()) + needScrollbar := true + percentVisible := float64(ctx.Height()) / float64(len(dirlist.dirs)) + if percentVisible >= 1.0 { + needScrollbar = false + } + + textWidth := ctx.Width() + if needScrollbar { + textWidth -= 1 + } + if textWidth < 0 { + textWidth = 0 + } + for i, name := range dirlist.dirs { if i < dirlist.scroll { continue @@ -226,14 +241,33 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { style = style.Reverse(true) style = style.Foreground(tcell.ColorGray) } - ctx.Fill(0, row, ctx.Width(), 1, ' ', style) + ctx.Fill(0, row, textWidth, 1, ' ', style) - dirString := dirlist.getDirString(name, ctx.Width(), func() string { + dirString := dirlist.getDirString(name, textWidth, func() string { return dirlist.getRUEString(name) }) ctx.Printf(0, row, style, dirString) } + + if needScrollbar { + scrollBarCtx := ctx.Subcontext(ctx.Width()-1, 0, 1, ctx.Height()) + dirlist.drawScrollbar(scrollBarCtx, percentVisible) + } +} + +func (dirlist *DirectoryList) drawScrollbar(ctx *ui.Context, percentVisible float64) { + gutterStyle := tcell.StyleDefault + pillStyle := tcell.StyleDefault.Reverse(true) + + // gutter + ctx.Fill(0, 0, 1, ctx.Height(), ' ', gutterStyle) + + // pill + pillSize := int(math.Ceil(float64(ctx.Height()) * percentVisible)) + percentScrolled := float64(dirlist.scroll) / float64(len(dirlist.dirs)) + pillOffset := int(math.Floor(float64(ctx.Height()) * percentScrolled)) + ctx.Fill(0, pillOffset, 1, pillSize, ' ', pillStyle) } func (dirlist *DirectoryList) ensureScroll(h int) { |