Merge branch '57-exit-popups-with-escape' into 'dev'

Exit popups with Escape

See merge request softwaregrundprojekt/2025-2026/einzelprojekt/tutorium-moritz/bernroider-dominik/bernroider-dominik!29
This commit is contained in:
Dominik Bernroider
2025-12-08 13:56:35 +00:00
10 changed files with 112 additions and 8 deletions

View File

@@ -24,10 +24,10 @@
rust-toolchain = with fenix.packages.${system}; rust-toolchain = with fenix.packages.${system};
combine [ combine [
beta.rustc stable.rustc
beta.cargo stable.cargo
beta.rust-src stable.rust-src
beta.rust-analyzer stable.rust-analyzer
]; ];
bevyDeps = with pkgs; [ bevyDeps = with pkgs; [

View File

@@ -1,5 +1,6 @@
use crate::features::phase::components::TimerSettings; use crate::features::phase::components::TimerSettings;
use crate::features::savegame::messages::SavegameDumpMessage; use crate::features::savegame::messages::SavegameDumpMessage;
use crate::features::ui::messages::ClosePopupMessage;
use crate::features::{inventory, shop}; use crate::features::{inventory, shop};
use crate::prelude::*; use crate::prelude::*;
use components::*; use components::*;
@@ -16,11 +17,27 @@ impl Plugin for HudPlugin {
app.add_systems(OnExit(AppState::GameScreen), cleanup); app.add_systems(OnExit(AppState::GameScreen), cleanup);
app.add_systems( app.add_systems(
Update, Update,
(update_status, buttons, update_timer_settings).run_if(in_state(AppState::GameScreen)), (update_status, buttons, update_timer_settings, close_popup)
.run_if(in_state(AppState::GameScreen)),
); );
} }
} }
fn close_popup(
mut commands: Commands,
mut close_popup_reader: MessageReader<ClosePopupMessage>,
root_query: Query<(Entity, &RootMarker)>,
) {
for _ in close_popup_reader.read() {
for (entity, root) in root_query.iter() {
match *root {
RootMarker::Settings => commands.entity(entity).despawn(),
_ => {}
}
}
}
}
fn setup(mut commands: Commands) { fn setup(mut commands: Commands) {
commands.spawn(( commands.spawn((
RootMarker::Status, RootMarker::Status,

View File

@@ -3,6 +3,7 @@ use crate::features::{
phase::messages::{NextPhaseMessage, PhaseTimerPauseMessage}, phase::messages::{NextPhaseMessage, PhaseTimerPauseMessage},
pom::messages::InvalidMoveMessage, pom::messages::InvalidMoveMessage,
shop::ui::open_shop, shop::ui::open_shop,
ui::messages::ClosePopupMessage,
}; };
use crate::prelude::*; use crate::prelude::*;
use bevy::input::mouse::MouseButton; use bevy::input::mouse::MouseButton;
@@ -38,6 +39,9 @@ impl Plugin for InputPlugin {
app.add_systems(Update, next_phase.run_if(in_state(AppState::GameScreen))); app.add_systems(Update, next_phase.run_if(in_state(AppState::GameScreen)));
app.add_systems(Update, shop_keybind.run_if(in_state(AppState::GameScreen))); app.add_systems(Update, shop_keybind.run_if(in_state(AppState::GameScreen)));
app.add_message::<ClosePopupMessage>();
app.add_systems(Update, popup_keybind);
} }
} }
@@ -163,3 +167,12 @@ fn shop_keybind(
open_shop(&mut commands, &game_config, &asset_server); open_shop(&mut commands, &game_config, &asset_server);
} }
} }
fn popup_keybind(
mut close_popup_messages: MessageWriter<ClosePopupMessage>,
keys: Res<ButtonInput<KeyCode>>,
) {
if keys.just_pressed(KeyCode::Escape) {
close_popup_messages.write(ClosePopupMessage);
}
}

View File

@@ -1,3 +1,4 @@
use crate::features::ui::messages::ClosePopupMessage;
use crate::{features::inventory::ui::open_inventory, prelude::*}; use crate::{features::inventory::ui::open_inventory, prelude::*};
use components::*; use components::*;
@@ -10,13 +11,30 @@ impl Plugin for InventoryPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.init_resource::<Inventory>(); app.init_resource::<Inventory>();
app.add_systems(Update, buttons.run_if(in_state(AppState::GameScreen))); app.add_systems(
Update,
(buttons, close_popup).run_if(in_state(AppState::GameScreen)),
);
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
app.add_systems(Update, debug_modify_berries); app.add_systems(Update, debug_modify_berries);
} }
} }
fn close_popup(
mut commands: Commands,
mut close_popup_reader: MessageReader<ClosePopupMessage>,
root_query: Query<(Entity, &RootMarker)>,
) {
for _ in close_popup_reader.read() {
for (entity, root) in root_query.iter() {
match *root {
RootMarker::Inventory => commands.entity(entity).despawn(),
}
}
}
}
fn buttons( fn buttons(
mut commands: Commands, mut commands: Commands,
mut interaction_query: Query<(&Interaction, &ButtonType), (Changed<Interaction>, With<Button>)>, mut interaction_query: Query<(&Interaction, &ButtonType), (Changed<Interaction>, With<Button>)>,

View File

@@ -1,4 +1,5 @@
use crate::features::pom::actions::InteractionAction; use crate::features::pom::actions::InteractionAction;
use crate::features::ui::messages::ClosePopupMessage;
use crate::features::ui::utils::ui_blocks; use crate::features::ui::utils::ui_blocks;
use crate::prelude::*; use crate::prelude::*;
use bevy::window::PrimaryWindow; use bevy::window::PrimaryWindow;
@@ -147,3 +148,15 @@ pub fn buttons(
} }
} }
} }
pub fn close_context_menu(
mut commands: Commands,
mut close_popup_reader: MessageReader<ClosePopupMessage>,
root_query: Query<Entity, With<RootMarker>>,
) {
for _ in close_popup_reader.read() {
for entity in root_query.iter() {
commands.entity(entity).despawn();
}
}
}

View File

@@ -18,5 +18,9 @@ impl Plugin for PomUiPlugin {
Update, Update,
context_menu::buttons.run_if(in_state(AppState::GameScreen)), context_menu::buttons.run_if(in_state(AppState::GameScreen)),
); );
app.add_systems(
Update,
context_menu::close_context_menu.run_if(in_state(AppState::GameScreen)),
);
} }
} }

View File

@@ -1,6 +1,8 @@
use crate::features::phase::components::{SessionTracker, TimerSettings}; use crate::features::phase::components::{SessionTracker, TimerSettings};
use crate::features::savegame::ui::load_popup_handler; use crate::features::savegame::ui::load_popup_handler;
use crate::features::ui::messages::ClosePopupMessage;
use crate::prelude::*; use crate::prelude::*;
use components::*;
use messages::*; use messages::*;
use std::fs::File; use std::fs::File;
use std::io::{Read, Write}; use std::io::{Read, Write};
@@ -19,7 +21,21 @@ impl Plugin for SavegamePlugin {
app.add_systems(Update, dump_savegame.run_if(in_state(AppState::GameScreen))); app.add_systems(Update, dump_savegame.run_if(in_state(AppState::GameScreen)));
app.add_systems(Update, load_savegame.run_if(in_state(AppState::GameScreen))); app.add_systems(Update, load_savegame.run_if(in_state(AppState::GameScreen)));
app.add_systems(Update, load_popup_handler); app.add_systems(Update, (load_popup_handler, close_popup));
}
}
fn close_popup(
mut commands: Commands,
mut close_popup_reader: MessageReader<ClosePopupMessage>,
root_query: Query<(Entity, &RootMarker)>,
) {
for _ in close_popup_reader.read() {
for (entity, root) in root_query.iter() {
match *root {
RootMarker::PopupSavegameLoad => commands.entity(entity).despawn(),
}
}
} }
} }

View File

@@ -1,3 +1,4 @@
use crate::features::ui::messages::ClosePopupMessage;
use crate::prelude::*; use crate::prelude::*;
use components::*; use components::*;
use ui::open_shop; use ui::open_shop;
@@ -9,7 +10,24 @@ pub struct ShopPlugin;
impl Plugin for ShopPlugin { impl Plugin for ShopPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems(Update, buttons.run_if(in_state(AppState::GameScreen))); app.add_systems(
Update,
(buttons, close_popup).run_if(in_state(AppState::GameScreen)),
);
}
}
fn close_popup(
mut commands: Commands,
mut close_popup_reader: MessageReader<ClosePopupMessage>,
root_query: Query<(Entity, &RootMarker)>,
) {
for _ in close_popup_reader.read() {
for (entity, root) in root_query.iter() {
match *root {
RootMarker::Shop => commands.entity(entity).despawn(),
}
}
} }
} }

View File

@@ -0,0 +1,4 @@
use crate::prelude::*;
#[derive(Message)]
pub struct ClosePopupMessage;

View File

@@ -3,6 +3,7 @@ use bevy::{input::mouse::*, picking::hover::HoverMap};
pub mod components; pub mod components;
pub mod consts; pub mod consts;
pub mod messages;
pub mod ui; pub mod ui;
pub mod utils; pub mod utils;