summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/jesseduffield/gocui/scrollbar.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/jesseduffield/gocui/scrollbar.go')
-rw-r--r--vendor/github.com/jesseduffield/gocui/scrollbar.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/vendor/github.com/jesseduffield/gocui/scrollbar.go b/vendor/github.com/jesseduffield/gocui/scrollbar.go
new file mode 100644
index 000000000..3bdb4a45c
--- /dev/null
+++ b/vendor/github.com/jesseduffield/gocui/scrollbar.go
@@ -0,0 +1,33 @@
+package gocui
+
+import "math"
+
+// returns start and height of scrollbar
+// `max` is the maximum possible value of `position`
+func calcScrollbar(listSize int, pageSize int, position int, scrollAreaSize int) (int, int) {
+ height := calcScrollbarHeight(listSize, pageSize, scrollAreaSize)
+ // assume we can't scroll past the last item
+ maxPosition := listSize - pageSize
+ if maxPosition <= 0 {
+ return 0, height
+ }
+ if position == maxPosition {
+ return scrollAreaSize - height, height
+ }
+ // we only want to show the scrollbar at the top or bottom positions if we're at the end. Hence the .Ceil (for moving the scrollbar once we scroll down) and the -1 (for pretending there's a smaller range than we actually have, with the above condition ensuring we snap to the bottom once we're at the end of the list)
+ start := int(math.Ceil(((float64(position) / float64(maxPosition)) * float64(scrollAreaSize-height-1))))
+ return start, height
+}
+
+func calcScrollbarHeight(listSize int, pageSize int, scrollAreaSize int) int {
+ if pageSize >= listSize {
+ return scrollAreaSize
+ }
+ height := int((float64(pageSize) / float64(listSize)) * float64(scrollAreaSize))
+ minHeight := 2
+ if height < minHeight {
+ return minHeight
+ }
+
+ return height
+}