From 0c6d70732539dcea940805610214ff6bf8cfefd4 Mon Sep 17 00:00:00 2001 From: Joe Julian Date: Mon, 6 Apr 2026 00:04:38 -0700 Subject: [PATCH] Fix Android group browser scrolling --- main.go | 40 +++++++++++++++------------------------- main_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/main.go b/main.go index afb5db1..6a43942 100644 --- a/main.go +++ b/main.go @@ -5624,32 +5624,22 @@ func (u *ui) groupBar(gtx layout.Context) layout.Dimensions { if atRoot { u.phoneGroupBrowserExpanded = true } - return layout.Flex{Axis: layout.Vertical}.Layout(gtx, - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - if len(groups) == 0 { - return layout.Dimensions{} - } - maxY := gtx.Dp(unit.Dp(168)) - if gtx.Constraints.Max.Y > maxY { - gtx.Constraints.Max.Y = maxY - } - if gtx.Constraints.Min.Y > gtx.Constraints.Max.Y { - gtx.Constraints.Min.Y = gtx.Constraints.Max.Y - } - return material.List(u.theme, &u.groupList).Layout(gtx, len(groups), func(gtx layout.Context, i int) layout.Dimensions { - idx := i - name := groups[i] - return layout.Inset{Bottom: unit.Dp(6)}.Layout(gtx, func(gtx layout.Context) layout.Dimensions { - for u.groupClicks[idx].Clicked(gtx) { - u.state.EnterGroup(name) - u.currentPath = append([]string(nil), u.state.CurrentPath...) - u.filter() - } - return tonedButton(gtx, u.theme, &u.groupClicks[idx], name) - }) + children := make([]layout.FlexChild, 0, len(groups)) + for i := range groups { + idx := i + name := groups[i] + children = append(children, layout.Rigid(func(gtx layout.Context) layout.Dimensions { + return layout.Inset{Bottom: unit.Dp(6)}.Layout(gtx, func(gtx layout.Context) layout.Dimensions { + for u.groupClicks[idx].Clicked(gtx) { + u.state.EnterGroup(name) + u.currentPath = append([]string(nil), u.state.CurrentPath...) + u.filter() + } + return tonedButton(gtx, u.theme, &u.groupClicks[idx], name) }) - }), - ) + })) + } + return layout.Flex{Axis: layout.Vertical}.Layout(gtx, children...) } return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(func(gtx layout.Context) layout.Dimensions { diff --git a/main_test.go b/main_test.go index 470f58a..297a289 100644 --- a/main_test.go +++ b/main_test.go @@ -775,6 +775,37 @@ func TestUIPhoneGroupBrowserToggleDoesNotChangeCurrentGroupToolsState(t *testing } } +func TestUIPhoneGroupBarDoesNotClampScrollableContentHeight(t *testing.T) { + t.Parallel() + + u := newUIWithModel("phone", vault.Model{ + Groups: [][]string{ + {"Crew"}, + {"Crew", "One"}, + {"Crew", "Two"}, + {"Crew", "Three"}, + {"Crew", "Four"}, + {"Crew", "Five"}, + {"Crew", "Six"}, + {"Crew", "Seven"}, + {"Crew", "Eight"}, + }, + }) + u.setCurrentPath([]string{"Crew"}) + + ops := new(op.Ops) + gtx := layout.Context{ + Ops: ops, + Constraints: layout.Exact(image.Pt(1080, 2400)), + } + + dims := u.groupBar(gtx) + minOldCap := gtx.Dp(unit.Dp(220)) + if dims.Size.Y <= minOldCap { + t.Fatalf("groupBar() phone height = %d, want > %d to avoid nested-scroll clamp", dims.Size.Y, minOldCap) + } +} + func TestUIPhoneStartsWithGroupToolsCollapsed(t *testing.T) { t.Parallel()