From 27f6e7e8e6eb1b6c42c3aa9d46931bb98e6a5736 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:47:22 +0000 Subject: [PATCH] fix(ui): replace unsafe unwrap on child text components In Bevy UI button interaction systems, an unsafe `.unwrap()` and direct array indexing (`children[0]`) was used to access the text components. This could cause panics if a button's layout lacked a single text child entity. This commit updates `sequence_control_button_system`, `curriculum_toggle_system`, `mode_toggle_system`, and `rhythm_mode_toggle_system` to use safe `let-else` destructuring and error handling. Now, interactions gracefully skip without panicking if the child text is missing. Co-authored-by: dynamikdev <717692+dynamikdev@users.noreply.github.com> --- src/ui/systems.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ui/systems.rs b/src/ui/systems.rs index 88e2ffb..7f1fbf7 100644 --- a/src/ui/systems.rs +++ b/src/ui/systems.rs @@ -28,7 +28,8 @@ pub fn sequence_control_button_system( mut rhythm_state: ResMut, ) { for (interaction, mut background_color, children) in &mut interaction_query { - let mut text = text_query.get_mut(children[0]).unwrap(); + let Some(&child) = children.first() else { continue; }; + let Ok(mut text) = text_query.get_mut(child) else { continue; }; match *interaction { Interaction::Pressed => { sequence_state.running = !sequence_state.running; @@ -67,7 +68,8 @@ pub fn curriculum_toggle_system( mut sequence_state: ResMut, ) { for (interaction, mut background_color, children) in &mut interaction_query { - let mut text = text_query.get_mut(children[0]).unwrap(); + let Some(&child) = children.first() else { continue; }; + let Ok(mut text) = text_query.get_mut(child) else { continue; }; match *interaction { Interaction::Pressed => { curriculum_state.is_visible = !curriculum_state.is_visible; @@ -102,7 +104,8 @@ pub fn mode_toggle_system( mut sequence_state: ResMut, ) { for (interaction, mut background_color, children) in &mut interaction_query { - let mut text = text_query.get_mut(children[0]).unwrap(); + let Some(&child) = children.first() else { continue; }; + let Ok(mut text) = text_query.get_mut(child) else { continue; }; match *interaction { Interaction::Pressed => { sequence_state.mode = match sequence_state.mode { @@ -146,7 +149,8 @@ pub fn rhythm_mode_toggle_system( mut rhythm_state: ResMut, ) { for (interaction, mut background_color, children) in &mut interaction_query { - let mut text = text_query.get_mut(children[0]).unwrap(); + let Some(&child) = children.first() else { continue; }; + let Ok(mut text) = text_query.get_mut(child) else { continue; }; match *interaction { Interaction::Pressed => { rhythm_state.mode = match rhythm_state.mode {