diff --git a/solitaire_engine/src/card_plugin.rs b/solitaire_engine/src/card_plugin.rs index e316f3b..9c90be6 100644 --- a/solitaire_engine/src/card_plugin.rs +++ b/solitaire_engine/src/card_plugin.rs @@ -1147,7 +1147,7 @@ fn add_android_corner_label( let bg_w = font_size * 2.0; let bg_h = font_size * 1.25; - // Background covers the PNG's baked-in small corner text. + // Background covers the PNG's baked-in small corner text (top-left). // Classic PNG cards have a white face, so the background must be white too. // (CARD_FACE_COLOUR is the Terminal theme's dark face colour — wrong here.) parent.spawn(( @@ -1163,6 +1163,20 @@ fn add_android_corner_label( 0.015, ), )); + // Cover the matching rotated baked-in text at the bottom-right corner. + parent.spawn(( + AndroidCornerBg, + Sprite { + color: Color::WHITE, + custom_size: Some(Vec2::new(bg_w, bg_h)), + ..default() + }, + Transform::from_xyz( + card_size.x / 2.0 - inset - bg_w / 2.0, + -card_size.y / 2.0 + inset + bg_h / 2.0, + 0.015, + ), + )); // Large rank+suit text drawn on top of the background. FiraMono must be // wired here explicitly — the suit glyphs (U+2660–U+2666) are not in diff --git a/solitaire_engine/src/hud_plugin.rs b/solitaire_engine/src/hud_plugin.rs index 32e420b..0bdd6c0 100644 --- a/solitaire_engine/src/hud_plugin.rs +++ b/solitaire_engine/src/hud_plugin.rs @@ -989,7 +989,7 @@ fn spawn_action_button( // centred with room to breathe. On desktop, keep the comfortable 48 dp // floor and 8 dp side padding. #[cfg(target_os = "android")] - let (pad, min_w, min_h) = (UiRect::axes(Val::Px(4.0), Val::Px(4.0)), Val::Px(44.0), Val::Px(44.0)); + let (pad, min_w, min_h) = (UiRect::axes(Val::Px(4.0), Val::Px(4.0)), Val::Px(52.0), Val::Px(44.0)); #[cfg(not(target_os = "android"))] let (pad, min_w, min_h) = (UiRect::axes(VAL_SPACE_2, VAL_SPACE_2), Val::Px(48.0), Val::Px(48.0)); diff --git a/solitaire_engine/src/layout.rs b/solitaire_engine/src/layout.rs index daa8e16..cfe1d1b 100644 --- a/solitaire_engine/src/layout.rs +++ b/solitaire_engine/src/layout.rs @@ -117,6 +117,7 @@ pub const HUD_BAND_HEIGHT: f32 = 112.0; /// /// Derivation (Android): `min_height 44 px` buttons /// + `padding.top 8 px` + `padding.bottom 8 px` outer bar padding = **60 px**. +/// /// Desktop: no persistent bottom bar, so 0. #[cfg(not(target_os = "android"))] const BOTTOM_BAR_HEIGHT: f32 = 0.0; diff --git a/solitaire_engine/src/radial_menu.rs b/solitaire_engine/src/radial_menu.rs index d973f09..978064c 100644 --- a/solitaire_engine/src/radial_menu.rs +++ b/solitaire_engine/src/radial_menu.rs @@ -473,8 +473,11 @@ fn radial_open_on_long_press( mut state: ResMut, ) { // Guard: only count while a touch is down, uncommitted, and radial is idle. - let active_id = drag.active_touch_id; - if active_id.is_none() || drag.committed || state.is_active() || paused.is_some_and(|p| p.0) { + let Some(active_id) = drag.active_touch_id else { + *hold_timer = 0.0; + return; + }; + if drag.committed || state.is_active() || paused.is_some_and(|p| p.0) { *hold_timer = 0.0; return; } @@ -487,7 +490,7 @@ fn radial_open_on_long_press( // Resolve current touch world position. let Some(touches) = touches else { return }; - let Some(touch) = touches.iter().find(|t| t.id() == active_id.unwrap()) else { + let Some(touch) = touches.iter().find(|t| t.id() == active_id) else { return; }; let Some((camera, cam_xf)) = cameras.single().ok() else { return };