feat(engine): add Undo, Pause, Help UI buttons in HUD action bar
Continues the UI-first pass started by the New Game button. Per the design principle in CLAUDE.md / ARCHITECTURE.md §1, every player action must be reachable from a visible UI control with the keyboard shortcut as an optional accelerator. Refactor the single New Game button into a flex-row "action bar" anchored top-right with four buttons: Undo, Pause, Help, New Game (left → right; New Game rightmost as the most consequential action). Plumbing: - New `PauseRequestEvent` and `HelpRequestEvent` in events.rs. - pause_plugin::toggle_pause reads either Esc or PauseRequestEvent so the button and the keyboard accelerator drive the same code path (with the existing drag / game-over / selection guards). - help_plugin::toggle_help_screen reads either F1 or HelpRequestEvent; also fix the stale module-doc claim that H toggles help (it's F1 — H is bound to hint cycle in input_plugin). - hud_plugin now spawns four ActionButton-marked buttons via a ChildSpawnerCommands helper, with one click handler per button firing its respective request event. A single paint_action_buttons system covers hover/pressed colour for all of them via the shared ActionButton marker. The click handlers defensively re-register their request events so the plugin works in isolation under MinimalPlugins (tests). add_message is idempotent. - ARCHITECTURE.md HudPlugin row updated to call out the action bar. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,30 +1,39 @@
|
||||
//! Toggleable on-screen help / cheat sheet showing keyboard bindings.
|
||||
//!
|
||||
//! Press **F1** to toggle. Listed shortcuts are grouped by intent —
|
||||
//! Reachable from the HUD "Help" button (per the UI-first principle); `F1`
|
||||
//! is an optional accelerator. Listed shortcuts are grouped by intent —
|
||||
//! gameplay, modes, and overlays.
|
||||
|
||||
use bevy::prelude::*;
|
||||
|
||||
use crate::events::HelpRequestEvent;
|
||||
|
||||
/// Marker on the help overlay root node.
|
||||
#[derive(Component, Debug)]
|
||||
pub struct HelpScreen;
|
||||
|
||||
/// Spawns and despawns the help/controls overlay shown when the player presses H (or the help button).
|
||||
/// All hotkeys and gesture guides live here.
|
||||
/// Spawns and despawns the help / controls overlay shown when the player
|
||||
/// clicks the "Help" HUD button or presses `F1`. All hotkeys and gesture
|
||||
/// guides live here.
|
||||
pub struct HelpPlugin;
|
||||
|
||||
impl Plugin for HelpPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(Update, toggle_help_screen);
|
||||
app.add_message::<HelpRequestEvent>()
|
||||
.add_systems(Update, toggle_help_screen);
|
||||
}
|
||||
}
|
||||
|
||||
fn toggle_help_screen(
|
||||
mut commands: Commands,
|
||||
keys: Res<ButtonInput<KeyCode>>,
|
||||
mut requests: MessageReader<HelpRequestEvent>,
|
||||
screens: Query<Entity, With<HelpScreen>>,
|
||||
) {
|
||||
if !keys.just_pressed(KeyCode::F1) {
|
||||
// Either F1 or a click on the HUD "Help" button (which fires
|
||||
// HelpRequestEvent) toggles the overlay.
|
||||
let button_clicked = requests.read().count() > 0;
|
||||
if !keys.just_pressed(KeyCode::F1) && !button_clicked {
|
||||
return;
|
||||
}
|
||||
if let Ok(entity) = screens.single() {
|
||||
|
||||
Reference in New Issue
Block a user