beuvy-runtime 0.1.0

A low-level Bevy UI kit with reusable controls and utility-class styling.
Documentation
use super::AddImage;
use crate::build_pending::UiBuildPending;
use crate::style::{apply_utility_patch, resolve_classes_with_fallback};
use bevy::prelude::*;

const DEFAULT_IMAGE_CLASS: &str = "image-root";

pub(super) fn add_image(
    mut commands: Commands,
    query: Query<(Entity, &AddImage)>,
    asset_server: Res<AssetServer>,
) {
    for (entity, add_image) in &query {
        let root_patch = resolve_classes_with_fallback(
            DEFAULT_IMAGE_CLASS,
            add_image.class.as_deref(),
            "image root",
        );
        let mut node = Node::default();
        apply_utility_patch(&mut node, &root_patch);

        let Ok(mut entity_commands) = commands.get_entity(entity) else {
            continue;
        };
        entity_commands
            .insert((
                Name::new(add_image.alt.clone().if_empty_then("image")),
                node,
                ImageNode::new(asset_server.load(add_image.src.clone())),
            ))
            .remove::<AddImage>()
            .remove::<UiBuildPending>();
    }
}

trait IfEmptyThen {
    fn if_empty_then(self, fallback: &str) -> String;
}

impl IfEmptyThen for String {
    fn if_empty_then(self, fallback: &str) -> String {
        if self.trim().is_empty() {
            fallback.to_string()
        } else {
            self
        }
    }
}