aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/dirlist.go
diff options
context:
space:
mode:
authorJeffas <dev@jeffas.io>2020-06-09 19:49:23 +0100
committerReto Brunner <reto@labrat.space>2020-06-09 20:50:28 +0200
commitc6f4d7badd4cb36067f0e76198630a3d0f9e7ce9 (patch)
treeb429620f599eee7b5efc04b528ff9e3acfca0278 /widgets/dirlist.go
parent543510f5c146aa6e4d3344ec7d109ad7945fa106 (diff)
downloadaerc-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.
Diffstat (limited to 'widgets/dirlist.go')
-rw-r--r--widgets/dirlist.go38
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) {