feat: close popups with escape key

This commit is contained in:
demenik
2025-12-08 14:52:58 +01:00
parent 4f41d89f63
commit 881300e0a6
9 changed files with 108 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
use crate::features::phase::components::TimerSettings;
use crate::features::savegame::messages::SavegameDumpMessage;
use crate::features::ui::messages::ClosePopupMessage;
use crate::features::{inventory, shop};
use crate::prelude::*;
use components::*;
@@ -16,11 +17,27 @@ impl Plugin for HudPlugin {
app.add_systems(OnExit(AppState::GameScreen), cleanup);
app.add_systems(
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) {
commands.spawn((
RootMarker::Status,

View File

@@ -3,6 +3,7 @@ use crate::features::{
phase::messages::{NextPhaseMessage, PhaseTimerPauseMessage},
pom::messages::InvalidMoveMessage,
shop::ui::open_shop,
ui::messages::ClosePopupMessage,
};
use crate::prelude::*;
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, 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);
}
}
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 components::*;
@@ -10,13 +11,30 @@ impl Plugin for InventoryPlugin {
fn build(&self, app: &mut App) {
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)]
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(
mut commands: Commands,
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::ui::messages::ClosePopupMessage;
use crate::features::ui::utils::ui_blocks;
use crate::prelude::*;
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,
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::savegame::ui::load_popup_handler;
use crate::features::ui::messages::ClosePopupMessage;
use crate::prelude::*;
use components::*;
use messages::*;
use std::fs::File;
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, 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 components::*;
use ui::open_shop;
@@ -9,7 +10,24 @@ pub struct ShopPlugin;
impl Plugin for ShopPlugin {
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 consts;
pub mod messages;
pub mod ui;
pub mod utils;