From f229601e2dc0a7177775ae9334d494339600b89d Mon Sep 17 00:00:00 2001 From: Dominik Honnef Date: Thu, 30 Jun 2022 01:21:04 +0200 Subject: [PATCH] widget: consider size of indicator when limiting scrollbar dragging Signed-off-by: Dominik Honnef --- widget/list.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/widget/list.go b/widget/list.go index bd471782..fb56b7a8 100644 --- a/widget/list.go +++ b/widget/list.go @@ -89,6 +89,18 @@ func (s *Scrollbar) Layout(gtx layout.Context, axis layout.Axis, viewportStart, s.oldDragPos = normalizedDragOffset } s.delta += normalizedDragOffset - s.oldDragPos + + if viewportStart+s.delta < 0 { + // Adjust normalizedDragOffset - and thus the future s.oldDragPos - so that futile dragging up has to be + // countered with dragging down again. Otherwise, dragging up would have no effect, but dragging down would + // immediately start scrolling. We want the user to undo their ineffective drag first. + normalizedDragOffset -= viewportStart + s.delta + // Limit s.delta to the maximum amount scrollable + s.delta = -viewportStart + } else if viewportEnd+s.delta > 1 { + normalizedDragOffset += (1 - viewportEnd) - s.delta + s.delta = 1 - viewportEnd + } s.oldDragPos = normalizedDragOffset }