about summary refs log tree commit diff stats
path: root/widgets
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
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')
-rw-r--r--widgets/dirlist.go38
1 files changed, 36 insertions, 2 deletions
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index 418d2ea..f12631b 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) {