Compare commits

3 Commits

Author SHA1 Message Date
ea9055e46c (autoformat) 2025-08-30 09:24:38 -05:00
be9cb3fe69 Fix: pass the machine ID through, not PLACEHOLDER
Oops. Yay for rushed work.
2025-08-30 09:23:59 -05:00
6fb3539329 Use hook on FuelGauge to show text on first spawn
There is an on-add hook that can be used to maintain invariants. I'll
use it to ensure the label text always gets the current fuel value upon
spawning the widget, regardless of whether or not the caller remembers
to set it up themselves.
2025-08-30 09:21:57 -05:00
4 changed files with 31 additions and 8 deletions

View File

@@ -2,9 +2,7 @@ use bevy::{color::palettes::css::*, prelude::*, window::WindowResolution};
use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin};
use crate::{
game::{
machines::{CuttingMachine, FlippingMachine, RotatingMachine, TransposingMachine},
},
game::machines::{CuttingMachine, FlippingMachine, RotatingMachine, TransposingMachine},
resources::UiTheme,
widgets::SpawnUi,
};

View File

@@ -1,9 +1,15 @@
use bevy::{color::palettes::css::*, prelude::*, ui::Val::*};
use bevy::{
color::palettes::css::*,
ecs::{component::HookContext, world::DeferredWorld},
prelude::*,
ui::Val::*,
};
use crate::game::consumables::{Fuel, FuelChanged};
#[derive(Component)]
#[require(Label)]
#[component(on_add = FuelGauge::refresh_label)]
pub struct FuelGauge(Entity);
impl FuelGauge {
@@ -41,4 +47,23 @@ impl FuelGauge {
);
label.0 = format!("Fuel: {}", fuel.0);
}
fn refresh_label(mut world: DeferredWorld, ctx: HookContext) {
// Get the machine ID from the FuelGauge component.
let Some(machine_id) = world.get::<FuelGauge>(ctx.entity).map(|fg| fg.0) else {
panic!("Couldn't get a FuelGauge during it's on-add hook run!");
};
// and fuel level
let Some(fuel) = world.get::<Fuel>(machine_id).map(|lvl| lvl.0) else {
// TODO: Maybe don't panic and just emit a warning.
panic!("Couldn't get a Fuel for a machine during a FuelGauge on-add hook.");
};
// Get an excl ref to the Text component so we can redraw its text
let Some(mut label) = world.get_mut::<Text>(ctx.entity) else {
panic!()
};
label.0 = format!("Fuel: {}", fuel);
}
}

View File

@@ -52,7 +52,7 @@ impl SpawnUi for RotatingMachine {
fn spawn_ui(mut commands: Commands, theme: Res<UiTheme>, machine_id: Entity) {
let base_entity = machine_ui_base(&mut commands, "Rotating Machine", &theme);
commands.entity(base_entity).with_children(|commands| {
commands.spawn(FuelGauge::bundle(Entity::PLACEHOLDER));
commands.spawn(FuelGauge::bundle(machine_id));
// Center panel (placeholder for input-output rotation)
commands.spawn((
@@ -87,7 +87,7 @@ impl SpawnUi for FlippingMachine {
fn spawn_ui(mut commands: Commands, theme: Res<UiTheme>, machine_id: Entity) {
let base_entity = machine_ui_base(&mut commands, "Flipping Machine", &theme);
commands.entity(base_entity).with_children(|commands| {
commands.spawn(FuelGauge::bundle(Entity::PLACEHOLDER));
commands.spawn(FuelGauge::bundle(machine_id));
// Center panel (placeholder)
commands.spawn((
@@ -122,7 +122,7 @@ impl SpawnUi for TransposingMachine {
fn spawn_ui(mut commands: Commands, theme: Res<UiTheme>, machine_id: Entity) {
let base_entity = machine_ui_base(&mut commands, "Transposing Machine", &theme);
commands.entity(base_entity).with_children(|commands| {
commands.spawn(FuelGauge::bundle(Entity::PLACEHOLDER));
commands.spawn(FuelGauge::bundle(machine_id));
// Center panel (placeholder)
commands.spawn((