From 3efb0e5fde4f98cd2094a40ae4b5cd7f0aebcebc Mon Sep 17 00:00:00 2001 From: 2ro <17595647+2ro@users.noreply.github.com> Date: Sun, 5 Jul 2026 22:05:56 -0400 Subject: [PATCH] goblin: fix Settings scroll extent so the page reaches its foot (Android) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause found by diffing against upstream GRIM, which does not have the bug: GRIM gives every ScrollArea a distinct id_salt (e.g. "wallet_list_scroll", "wallet_tab_content_scroll"); our goblin surface created fifteen unsalted ScrollArea::vertical() — Settings Main and every settings sub-page render theirs at the same position in the same parent Ui, so they all resolved to the SAME egui scroll-state id. Scroll offset and remembered content extents collided across pages, clamping the Settings list's maximum scroll to another (shorter) page's extent: the page stopped scrolling before its real end and the bottom items — including the wallet-management foot (Switch wallet / Lock / Advanced), i.e. the way out — were unreachable on the phone. This one root cause covers both user reports ("Settings bottom cut off" and "can't exit"). Every goblin ScrollArea now carries a unique id_salt, matching GRIM's convention, so each page keeps its own scroll state and traverses to its true bottom. Back-press behavior is deliberately untouched. --- src/gui/views/goblin/mod.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/gui/views/goblin/mod.rs b/src/gui/views/goblin/mod.rs index bdfcfc6b..f4230220 100644 --- a/src/gui/views/goblin/mod.rs +++ b/src/gui/views/goblin/mod.rs @@ -1034,6 +1034,7 @@ impl GoblinWalletView { ) { let data = wallet.get_data(); ScrollArea::vertical() + .id_salt("goblin_home_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -1517,6 +1518,7 @@ impl GoblinWalletView { return; }; ScrollArea::vertical() + .id_salt("goblin_receipt_scroll") .auto_shrink([false; 2]) .show(ui, |ui| { ui.add_space(8.0); @@ -1864,6 +1866,7 @@ impl GoblinWalletView { close = true; } ScrollArea::vertical() + .id_salt("goblin_profile_scroll") .auto_shrink([false; 2]) .show(ui, |ui| { ui.add_space(8.0); @@ -2083,6 +2086,7 @@ impl GoblinWalletView { } ScrollArea::vertical() + .id_salt("goblin_activity_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -2331,6 +2335,7 @@ impl GoblinWalletView { close = true; } ScrollArea::vertical() + .id_salt("goblin_approve_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -2761,6 +2766,7 @@ impl GoblinWalletView { ); ui.add_space(6.0); ScrollArea::vertical() + .id_salt("goblin_settings_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3191,6 +3197,7 @@ impl GoblinWalletView { return; } ScrollArea::vertical() + .id_salt("goblin_pairing_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3247,6 +3254,7 @@ impl GoblinWalletView { } let current = crate::AppConfig::locale().unwrap_or_else(|| rust_i18n::locale().to_string()); ScrollArea::vertical() + .id_salt("goblin_language_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3290,6 +3298,7 @@ impl GoblinWalletView { return; } ScrollArea::vertical() + .id_salt("goblin_privacy_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3354,6 +3363,7 @@ impl GoblinWalletView { { let adv = &mut self.advanced; ScrollArea::vertical() + .id_salt("goblin_advanced_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3712,6 +3722,7 @@ impl GoblinWalletView { return; } ScrollArea::vertical() + .id_salt("goblin_node_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3855,6 +3866,7 @@ impl GoblinWalletView { return; } ScrollArea::vertical() + .id_salt("goblin_relays_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -3937,6 +3949,7 @@ impl GoblinWalletView { return; } ScrollArea::vertical() + .id_salt("goblin_slatepack_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -4109,6 +4122,7 @@ impl GoblinWalletView { return; } ScrollArea::vertical() + .id_salt("goblin_nips_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { @@ -4891,6 +4905,7 @@ impl GoblinWalletView { let identities = wallet.nostr_identities(); ScrollArea::vertical() + .id_salt("goblin_identities_scroll") .auto_shrink([false; 2]) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| {