refactor(engine): name HUD popover Z-layers; replace raw arithmetic (M-24)

ZIndex(Z_HUD + 4) and ZIndex(Z_HUD + 5) across four sites in
hud_plugin.rs were magic-number expressions. Define named constants in
ui_theme:

  Z_HUD_POPOVER_BACKDROP = Z_HUD + 4  (fullscreen dismiss backdrop)
  Z_HUD_POPOVER          = Z_HUD + 5  (popover panel)

The score-delta floater (Z_HUD + 10) now uses the existing Z_HUD_TOP
constant, whose doc is updated to mention transient annotations.
Both new constants are added to the monotonic z-hierarchy test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-17 21:35:35 -07:00
parent c8878d6e8b
commit 4aafc0a53d
2 changed files with 19 additions and 9 deletions
+10 -7
View File
@@ -371,6 +371,9 @@ pub enum MenuOption {
/// Mirrors `ui_theme::Z_HUD` and is duplicated here only so the hud module /// Mirrors `ui_theme::Z_HUD` and is duplicated here only so the hud module
/// can use it as a `const` without a non-const expression in `ZIndex(...)`. /// can use it as a `const` without a non-const expression in `ZIndex(...)`.
const Z_HUD: i32 = crate::ui_theme::Z_HUD; const Z_HUD: i32 = crate::ui_theme::Z_HUD;
const Z_HUD_POPOVER_BACKDROP: i32 = crate::ui_theme::Z_HUD_POPOVER_BACKDROP;
const Z_HUD_POPOVER: i32 = crate::ui_theme::Z_HUD_POPOVER;
const Z_HUD_TOP: i32 = crate::ui_theme::Z_HUD_TOP;
/// Idle / hover / pressed colours shared by every action button. Aliased /// Idle / hover / pressed colours shared by every action button. Aliased
/// to the theme tokens so the HUD picks up palette changes for free. /// to the theme tokens so the HUD picks up palette changes for free.
@@ -1184,7 +1187,7 @@ fn spawn_modes_popover(
..default() ..default()
}, },
BackgroundColor(BG_ELEVATED), BackgroundColor(BG_ELEVATED),
ZIndex(Z_HUD + 5), ZIndex(Z_HUD_POPOVER),
)) ))
.with_children(|panel| { .with_children(|panel| {
for (option, label, tooltip) in rows { for (option, label, tooltip) in rows {
@@ -1211,8 +1214,8 @@ fn spawn_modes_popover(
} }
}); });
// Fullscreen transparent backdrop at Z_HUD+4 (below the popover at // Fullscreen transparent backdrop at Z_HUD_POPOVER_BACKDROP (below the
// Z_HUD+5) so tapping outside the panel light-dismisses it. // popover at Z_HUD_POPOVER) so tapping outside light-dismisses it.
commands.spawn(( commands.spawn((
ModesPopoverBackdrop, ModesPopoverBackdrop,
Button, Button,
@@ -1225,7 +1228,7 @@ fn spawn_modes_popover(
..default() ..default()
}, },
BackgroundColor(Color::NONE), BackgroundColor(Color::NONE),
ZIndex(Z_HUD + 4), ZIndex(Z_HUD_POPOVER_BACKDROP),
)); ));
} }
@@ -1382,7 +1385,7 @@ fn spawn_menu_popover(commands: &mut Commands, font_res: Option<&FontResource>)
..default() ..default()
}, },
BackgroundColor(BG_ELEVATED), BackgroundColor(BG_ELEVATED),
ZIndex(Z_HUD + 5), ZIndex(Z_HUD_POPOVER),
)) ))
.with_children(|panel| { .with_children(|panel| {
for (option, label, tooltip) in rows { for (option, label, tooltip) in rows {
@@ -1423,7 +1426,7 @@ fn spawn_menu_popover(commands: &mut Commands, font_res: Option<&FontResource>)
..default() ..default()
}, },
BackgroundColor(Color::NONE), BackgroundColor(Color::NONE),
ZIndex(Z_HUD + 4), ZIndex(Z_HUD_POPOVER_BACKDROP),
)); ));
} }
@@ -1797,7 +1800,7 @@ fn detect_score_change(
top: Val::Px(0.0), top: Val::Px(0.0),
..default() ..default()
}, },
ZIndex(Z_HUD + 10), ZIndex(Z_HUD_TOP),
Text::new(format!("+{delta}")), Text::new(format!("+{delta}")),
font, font,
TextColor(ACCENT_PRIMARY), TextColor(ACCENT_PRIMARY),
+9 -2
View File
@@ -401,8 +401,13 @@ pub const Z_BACKGROUND: i32 = -10;
pub const Z_PILE_MARKER: i32 = -1; pub const Z_PILE_MARKER: i32 = -1;
/// Base layer for HUD readouts (top-left). /// Base layer for HUD readouts (top-left).
pub const Z_HUD: i32 = 50; pub const Z_HUD: i32 = 50;
/// Action bar + popovers — above HUD readouts so dropdowns can overlap. /// Fullscreen transparent dismiss-backdrop spawned behind a HUD popover so
pub const Z_HUD_TOP: i32 = 60; /// tapping outside it light-dismisses the panel without blocking other input.
pub const Z_HUD_POPOVER_BACKDROP: i32 = Z_HUD + 4;
/// HUD popovers (Modes dropdown, etc.) — above the dismiss backdrop.
pub const Z_HUD_POPOVER: i32 = Z_HUD + 5;
/// Transient HUD annotations (score-delta floaters) — above popovers.
pub const Z_HUD_TOP: i32 = Z_HUD + 10;
pub const Z_MODAL_SCRIM: i32 = 200; pub const Z_MODAL_SCRIM: i32 = 200;
pub const Z_MODAL_PANEL: i32 = 210; pub const Z_MODAL_PANEL: i32 = 210;
/// Pause overlay outranks normal modals — pausing should always be on top. /// Pause overlay outranks normal modals — pausing should always be on top.
@@ -648,6 +653,8 @@ mod tests {
Z_BACKGROUND, Z_BACKGROUND,
Z_PILE_MARKER, Z_PILE_MARKER,
Z_HUD, Z_HUD,
Z_HUD_POPOVER_BACKDROP,
Z_HUD_POPOVER,
Z_HUD_TOP, Z_HUD_TOP,
Z_MODAL_SCRIM, Z_MODAL_SCRIM,
Z_MODAL_PANEL, Z_MODAL_PANEL,