feat: close popups with escape key
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>)>,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
4
src/features/ui/messages.rs
Normal file
4
src/features/ui/messages.rs
Normal file
@@ -0,0 +1,4 @@
|
||||
use crate::prelude::*;
|
||||
|
||||
#[derive(Message)]
|
||||
pub struct ClosePopupMessage;
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user