bevy_rectray 0.5.0

A minimal 2d layout system for bevy.
Documentation
use bevy::sprite::Anchor as BevyAnchor;
use bevy::{
    color::palettes::css,
    diagnostic::FrameTimeDiagnosticsPlugin,
    input::{keyboard::KeyboardInput, ButtonState},
    prelude::*,
    text::TextBounds,
};
use bevy_rectray::{
    Anchor, AnchorDirection, Dimension, OutOfFrameBehavior, RectrayCursor, RectrayFrame,
    RectrayPlugin, RectrayWindow, SyncDimension, Transform2D,
};
pub fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(FrameTimeDiagnosticsPlugin::default())
        .add_systems(Startup, init)
        .add_systems(Update, mode_switch)
        .add_plugins(RectrayPlugin)
        .run();
}

#[derive(Debug, Component)]
pub struct Tooltip;

pub fn init(mut commands: Commands) {
    commands.spawn(Camera2d);

    commands
        .spawn((RectrayFrame::default(), RectrayWindow))
        .with_children(|builder| {
            builder
                .spawn((
                    RectrayCursor,
                    Sprite {
                        color: css::RED.into(),
                        ..Default::default()
                    },
                    SyncDimension::FromDimension,
                    Transform2D::IDENTITY,
                ))
                .with_children(|builder| {
                    builder
                        .spawn((
                            Sprite {
                                color: css::GOLD.into(),
                                custom_size: Some(Vec2::new(200., 100.)),
                                ..Default::default()
                            },
                            SyncDimension::ToDimension,
                            Transform2D {
                                anchor: Anchor::TOP_LEFT,
                                ..Default::default()
                            },
                            OutOfFrameBehavior::Nudge,
                            Tooltip,
                        ))
                        .with_children(|builder| {
                            builder.spawn((
                                Text2d::new(
                                    "Press 'space' to switch between nudge and anchor swap mode.",
                                ),
                                TextBounds::new(200., 100.),
                                BevyAnchor::TOP_LEFT,
                                TextColor(css::RED.into()),
                                Transform2D {
                                    anchor: Anchor::TOP_LEFT,
                                    ..Default::default()
                                },
                            ));
                        });
                });
        });
}

pub fn mode_switch(
    mut events: MessageReader<KeyboardInput>,
    mut cursor: Single<&mut Dimension, With<RectrayCursor>>,
    mut tooltip: Single<&mut OutOfFrameBehavior, With<Tooltip>>,
) {
    for press in events.read() {
        if press.state == ButtonState::Pressed && press.key_code == KeyCode::Space {
            match &**tooltip {
                OutOfFrameBehavior::AnchorSwap { .. } => {
                    cursor.0 = Vec2::new(0., 0.);
                    **tooltip = OutOfFrameBehavior::Nudge;
                }
                _ => {
                    cursor.0 = Vec2::new(20., 20.);
                    **tooltip = OutOfFrameBehavior::anchor_swap(&[
                        AnchorDirection::RB,
                        AnchorDirection::LB,
                        AnchorDirection::RT,
                        AnchorDirection::LT,
                    ])
                }
            }
        }
    }
}