beuvy 0.1.0

Facade crate for beuvy-runtime plus optional declarative UI authoring.
Documentation
use crate::runtime::state::{DeclarativeRefRects, DeclarativeResolvedRef};
use crate::value::UiValue;
use bevy::prelude::*;
use bevy::ui::{ComputedNode, UiGlobalTransform};

pub(crate) fn sync_declarative_ref_rects(
    mut rects: ResMut<DeclarativeRefRects>,
    refs: Query<(&DeclarativeResolvedRef, &ComputedNode, &UiGlobalTransform)>,
) {
    rects.clear();
    for (ref_id, computed, transform) in &refs {
        let rect = ui_rect_value(computed, transform);
        rects.set_rect(ref_id.0.clone(), rect);
    }
}

fn ui_rect_value(computed: &ComputedNode, transform: &UiGlobalTransform) -> UiValue {
    let (_, _, translation) = transform.to_scale_angle_translation();
    let scale = computed.inverse_scale_factor();
    let size = computed.size() * scale;
    let center = translation;
    let left = center.x - size.x * 0.5;
    let top = center.y - size.y * 0.5;
    UiValue::object([
        ("left", UiValue::from(left)),
        ("top", UiValue::from(top)),
        ("right", UiValue::from(left + size.x)),
        ("bottom", UiValue::from(top + size.y)),
        ("x", UiValue::from(left)),
        ("y", UiValue::from(top)),
        ("width", UiValue::from(size.x)),
        ("height", UiValue::from(size.y)),
    ])
}