From a635227c76c1a055bb1ef2c0d8d37b7334fb0476 Mon Sep 17 00:00:00 2001 From: ZoOL Date: Tue, 31 Dec 2024 15:11:05 +0800 Subject: [PATCH] fix show more --- src/game.rs | 181 +++++++++++++++++++++++++-------------------- src/game/dialog.rs | 2 +- 2 files changed, 102 insertions(+), 81 deletions(-) diff --git a/src/game.rs b/src/game.rs index 69324b4..dd77318 100644 --- a/src/game.rs +++ b/src/game.rs @@ -47,7 +47,7 @@ impl Plugin for SudokuPlugin { app.init_resource::() .init_resource::() .add_event::() - .add_systems(OnEnter(GameState::Playing), (setup_ui, init_cells).chain()) + .add_systems(OnEnter(GameState::Playing), setup_ui) .add_systems(OnExit(GameState::Playing), cleanup_game) .add_systems( Update, @@ -64,6 +64,7 @@ impl Plugin for SudokuPlugin { .add_observer(on_new_digit) .add_observer(on_new_candidate) .add_observer(check_conflict) + .add_observer(init_puzzle) .add_observer(find_hint) .add_observer(on_clean_cell) .add_observer(on_select_cell) @@ -73,8 +74,7 @@ impl Plugin for SudokuPlugin { .add_observer(on_reveal_cell) .add_observer(on_reveal_puzzle) .add_observer(on_check_cell) - .add_observer(on_check_puzzle) - .add_observer(on_show_more); + .add_observer(on_check_puzzle); } } @@ -82,7 +82,7 @@ impl Plugin for SudokuPlugin { pub struct SudokuManager { pub solution: Sudoku, pub solver: StrategySolver, - pub solved: bool, + pub is_solved: bool, } #[derive(Component)] @@ -164,6 +164,8 @@ fn setup_ui( }); }); }); + + commands.trigger(InitPuzzle); } fn toolbars( @@ -209,7 +211,7 @@ fn toolbars( } fn right_bar( - font_assets: &Res, + _font_assets: &Res, texture_assets: &Res, builder: &mut ChildBuilder, ) { @@ -272,14 +274,10 @@ fn right_bar( ..default() }, )) - .with_children(|builder| { - spawn_show_more(font_assets, builder); - }) - .observe( - |_trigger: Trigger>, mut commands: Commands| { - commands.trigger(ShowMore); - }, - ); + // .with_children(|builder| { + // spawn_show_more(font_assets, builder); + // }) + .observe(on_show_more); builder .spawn(( @@ -456,7 +454,11 @@ pub struct ManualCandidatesContainer; #[derive(Component)] pub struct AutoCandidatesContainer; -fn init_cells( +#[derive(Event)] +pub struct InitPuzzle; + +fn init_puzzle( + _ev: Trigger, mut commands: Commands, cell_background: Query<(Entity, &CellPosition)>, settings: Res, @@ -479,7 +481,7 @@ fn init_cells( commands.insert_resource(SudokuManager { solution, solver: solver.clone(), - solved: false, + is_solved: false, }); 'l: for (index, cell_state) in solver.grid_state().into_iter().enumerate() { @@ -503,6 +505,11 @@ fn init_cells( commands.entity(entity).insert(SelectedCell); } + commands + .entity(entity) + .remove::() + .remove::(); + continue 'l; } } @@ -664,7 +671,7 @@ fn check_solver( audio_assets: Res, settings: Res, ) { - if sudoku_manager.solved { + if sudoku_manager.is_solved { return; } @@ -682,7 +689,7 @@ fn check_solver( } if solved_count == 81 { - sudoku_manager.solved = true; + sudoku_manager.is_solved = true; if settings.play_sound_on_solve { audio @@ -883,7 +890,7 @@ fn update_game_time( settings: Res, sudoku_manager: Res, ) { - if !sudoku_manager.solved { + if !sudoku_manager.is_solved { game_timer.tick(time.delta()); } @@ -898,14 +905,10 @@ fn update_game_time( } } -#[derive(Event)] -pub struct ShowMore; - -fn spawn_show_more(font_assets: &Res, builder: &mut ChildBuilder) { +fn spawn_show_more(font_assets: &Res, builder: &mut ChildBuilder, is_solved: bool) { builder .spawn(( ShowMoreContainer, - Visibility::Hidden, Name::new("show-more-container"), Node { top: Val::Px(30.0), @@ -921,54 +924,65 @@ fn spawn_show_more(font_assets: &Res, builder: &mut ChildBuilder) { GlobalZIndex(99), )) .with_children(|builder| { - more_item( - font_assets, - builder, - "Hint", - |_: Trigger>, mut commands, _q_selected| { - commands.trigger(FindHint); - }, - ); - more_item( - font_assets, - builder, - "Check Cell", - |_: Trigger>, mut commands, q_selected| { - commands.trigger_targets(CheckCell, vec![*q_selected]); - }, - ); - more_item( - font_assets, - builder, - "Check Puzzle", - |_: Trigger>, mut commands, _q_selected| { - commands.trigger(CheckPuzzle); - }, - ); - more_item( - font_assets, - builder, - "Reveal Cell", - |_: Trigger>, mut commands, q_selected| { - commands.trigger_targets(RevealCell, vec![*q_selected]); - }, - ); - more_item( - font_assets, - builder, - "Reveal Puzzle", - |_: Trigger>, mut commands, _q_selected| { - commands.trigger(RevealPuzzle); - }, - ); - more_item( - font_assets, - builder, - "Reset Puzzle", - |_: Trigger>, mut commands, _q_selected| { - commands.trigger(ResetPuzzle); - }, - ); + if is_solved { + more_item( + font_assets, + builder, + "Reset Puzzle", + |_: Trigger>, mut commands, _q_selected| { + commands.trigger(InitPuzzle); + }, + ); + } else { + more_item( + font_assets, + builder, + "Hint", + |_: Trigger>, mut commands, _q_selected| { + commands.trigger(FindHint); + }, + ); + more_item( + font_assets, + builder, + "Check Cell", + |_: Trigger>, mut commands, q_selected| { + commands.trigger_targets(CheckCell, vec![*q_selected]); + }, + ); + more_item( + font_assets, + builder, + "Check Puzzle", + |_: Trigger>, mut commands, _q_selected| { + commands.trigger(CheckPuzzle); + }, + ); + more_item( + font_assets, + builder, + "Reveal Cell", + |_: Trigger>, mut commands, q_selected| { + commands.trigger_targets(RevealCell, vec![*q_selected]); + }, + ); + more_item( + font_assets, + builder, + "Reveal Puzzle", + |_: Trigger>, mut commands, _q_selected| { + commands.trigger(RevealPuzzle); + }, + ); + more_item( + font_assets, + builder, + "Reset Puzzle", + |_: Trigger>, mut commands, _q_selected| { + commands.trigger(ResetPuzzle); + }, + ); + } }); } @@ -1038,18 +1052,25 @@ fn more_item( struct ShowMoreContainer; fn on_show_more( - _trigger: Trigger, - mut q_more: Query<&mut Visibility, With>, + trigger: Trigger>, + q_more: Query>, mut opened: Local, + font_assets: Res, + mut commands: Commands, + sudoku_manager: Res, ) { - for mut vis in q_more.iter_mut() { - if opened.0 { - opened.0 = false; - *vis = Visibility::Hidden; - } else { - opened.0 = true; - *vis = Visibility::Visible; + let parent = trigger.entity(); + + if opened.0 { + opened.0 = false; + for entity in q_more.iter() { + commands.entity(entity).despawn_recursive(); } + } else { + opened.0 = true; + commands.entity(parent).with_children(|builder| { + spawn_show_more(&font_assets, builder, sudoku_manager.is_solved); + }); } } diff --git a/src/game/dialog.rs b/src/game/dialog.rs index 711af9c..c128ff2 100644 --- a/src/game/dialog.rs +++ b/src/game/dialog.rs @@ -347,7 +347,7 @@ fn on_pause_game( ) { let (entity, mut visibility) = q_dialog.into_inner(); if ev.event().0 { - if time.is_paused() || sudoku_manager.solved { + if time.is_paused() || sudoku_manager.is_solved { return; }