Scroll the launcher page so the footer stops covering the panel - #369
Merged
Conversation
pmarcus93
force-pushed
the
launcher-page-scroll
branch
from
July 29, 2026 03:14
3107180 to
234a3be
Compare
Owner
|
can u update ur branch |
On a window too short for the stacked single-column layout -- a phone, or a narrow desktop window -- the ROM / SAVE FILES / Play / SAVE SLOT stack ran past the bottom of the window while the footer stayed pinned there and drew over it. Nothing clipped the panel and nothing scrolled it, so the overflow was unreachable. Everything under the tab bar (panel, updater banner, footer) is now one scrolling column, used only when it is taller than the room below the tab bar. The strip, logo and tab bar stay pinned, so navigation is always on screen, and the footer is laid out downward from footerTop right after the content instead of upward from the window bottom. - RomImporter.pageScrollFor is the whole decision, pure and covered by tests/engine/launcher_page_scroll.lua. A window that grows back drags the offset down with it, so the page never stays parked past its own end. - The panels return their natural height as they draw, so the measurement is the previous frame's: the same one-frame settle the slot and mod lists already rely on. - One scroll axis at a time. While the page scrolls, the panels draw paged: the slot and mod lists take their natural height, keep no inner scroll region and report a max of 0, so wheel, right stick and drag all move the page. Two-column layouts do not overflow, paged stays false, and every one of these behaves exactly as before. - inside() and _ptIn() reject a rect that scrolled out of the viewport, so a control that slid under the tab bar cannot be clicked through it. Tab chips are pinned and exempt. pageScroll resets on a tab change. Android had no scroll gesture at all: the launcher is handed no move events (main.lua forwards neither touchmoved nor mousemoved while it is up) and its mouse emulation was never trusted, which is what "no reliable pointer polling" referred to. That was survivable while every scroll region was an inner list, and useless once the page itself scrolls, since a phone is exactly where it overflows. love.touch is pollable, so _pointerHold reads the first active touch there and hands _updateSlotDrag the same (held, y) pair the mouse gives on desktop. Slot rows and mod toggles consequently arm on press and commit on release on Android too, matching desktop, so a swipe that starts on a card scrolls instead of selecting it. All of it is gated on touchPollable: without love.touch every Android path is exactly what it was. conf.lua also grows minwidth/minheight (480x360) for the desktop window, under which the cards stop being readable. Mobile is fullscreen and ignores it. Verified on the Android emulator (1080x2400) against a build of the parent commit: before, the footer painted over the SAVE SLOT card with no way to reach it; after, the page pans by touch and the footer is reachable and intact.
pmarcus93
force-pushed
the
launcher-page-scroll
branch
from
July 29, 2026 15:54
234a3be to
cc67be3
Compare
Author
|
Thanks, @bryanthaboi! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem
On a window too short for the stacked single-column layout (a phone, or a narrow desktop window), the ROM / SAVE FILES / Play / SAVE SLOT stack runs past the bottom of the window. The footer stays pinned there and draws over it: nothing clips the panel and nothing scrolls it, so everything below the fold is unreachable.
On a 420x820 window the panel wants ~647px and the content region offers ~441px, so roughly 200px of it is simply lost behind the footer.
The change
Everything under the tab bar (panel, updater banner, footer) becomes one scrolling column, used only when it is taller than the room below the tab bar. The strip, logo and tab bar stay pinned, so navigation is always on screen, and the footer is laid out downward from
footerTopright after the content instead of upward from the window bottom.RomImporter.pageScrollForis the whole decision, pure and covered bytests/engine/launcher_page_scroll.lua. A window that grows back drags the offset down with it, so the page never stays parked past its own end.paged: the slot and mod lists take their natural height, keep no inner scroll region and report a max of 0, so wheel, right stick and drag all move the page and never fight a list for the same gesture. Two-column layouts do not overflow,pagedstays false, and every one of these behaves exactly as before.inside()and_ptIn()reject a rect that scrolled out of the viewport, so a control that slid under the tab bar cannot be clicked through it. Tab chips arepinnedand exempt.pageScrollresets on a tab change.Android needed an input path first
Android had no scroll gesture at all. The launcher is handed no move events (
main.luaforwards neithertouchmovednormousemovedwhile it is up) and its mouse emulation was never trusted, which is what "no reliable pointer polling" referred to. That was survivable while every scroll region was an inner list with a wheel alternative, and useless once the page itself is what scrolls, since a phone is exactly where it overflows.love.touchis pollable, so_pointerHoldreads the first active touch there and hands_updateSlotDragthe same(held, y)pair the mouse gives on desktop. Slot rows and mod toggles consequently arm on press and commit on release on Android too, matching desktop, so a swipe that starts on a card scrolls instead of selecting it. All of it is gated ontouchPollable: withoutlove.touch, every Android path is exactly what it was.Window floor
conf.luagrowsminwidth/minheight(480x360) for the desktop window, under which the cards stop being readable at all. Mobile is fullscreen and ignores it.Verification
scripts/test.sh --quickpasses, including the new engine-tier suite.Screenshots
Android
Current build on a Galaxy S26 Ultra (unscrollable, logo on top of other elements):
Fixed build on the simulator (scrollable):
MacOS
Current build on a narrow window, same problems as the Android version (unscrollable, logo on top of other elements):
Dev build (fixed):