diff --git a/layout/list.go b/layout/list.go index bb9e320c..c2e46303 100644 --- a/layout/list.go +++ b/layout/list.go @@ -65,10 +65,10 @@ type Position struct { BeforeEnd bool // First is the index of the first visible child. First int - // Offset is the distance in pixels from the top edge to the child at index + // Offset is the distance in pixels from the leading edge to the child at index // First. Offset int - // OffsetLast is the signed distance in pixels from the bottom edge to the + // OffsetLast is the signed distance in pixels from the trailing edge to the // bottom edge of the child at index First+Count. OffsetLast int // Count is the number of visible children. @@ -95,6 +95,10 @@ func (l *List) init(gtx Context, len int) { l.children = l.children[:0] l.len = len l.update(gtx) + if l.Position.First < 0 { + l.Position.Offset = 0 + l.Position.First = 0 + } if l.scrollToEnd() || l.Position.First > len { l.Position.Offset = 0 l.Position.First = len diff --git a/layout/list_test.go b/layout/list_test.go index eb1da0f8..0f3814bc 100644 --- a/layout/list_test.go +++ b/layout/list_test.go @@ -13,6 +13,25 @@ import ( "gioui.org/op" ) +func TestListPositionExtremes(t *testing.T) { + var l List + gtx := Context{ + Ops: new(op.Ops), + Constraints: Exact(image.Pt(20, 10)), + } + const n = 3 + layout := func(_ Context, idx int) Dimensions { + if idx < 0 || idx >= n { + t.Errorf("list index %d out of bounds [0;%d]", idx, n-1) + } + return Dimensions{} + } + l.Position.First = -1 + l.Layout(gtx, n, layout) + l.Position.First = n + 1 + l.Layout(gtx, n, layout) +} + func TestEmptyList(t *testing.T) { var l List gtx := Context{