notation_bevy_utils 0.4.2

Fun notation - bevy utils
use bevy::prelude::*;

use crate::prelude::{
    LayoutAnchor, LayoutConstraint, LayoutData, LayoutEnv, LayoutQuery, LayoutSize, View, ViewQuery,
};

pub trait VBoxCell<TE: LayoutEnv>: View<TE> {
    fn order(&self) -> usize {
        0
    }
}

#[derive(Clone, Debug, Component)]
pub struct VBoxCellData {
    pub index: usize,
}
pub trait VBoxView<TE: LayoutEnv, TC: VBoxCell<TE>>: View<TE> {
    fn sort_cells(&self) -> bool {
        false
    }
    fn do_layout(
        &self,
        commands: &mut Commands,
        engine: &TE,
        layout_query: &mut LayoutQuery,
        cell_query: &ViewQuery<TC>,
        entity: Entity,
        data: LayoutData,
    ) {
        let mut cells = engine.get_children(cell_query, entity);
        if self.sort_cells() {
            cells.sort_by(|a, b| a.view.order().cmp(&b.view.order()));
        }
        let mut y = 0.0;
        let mut height = data.size.height;
        for (index, cell) in cells.iter().enumerate() {
            let cell_constraint = LayoutConstraint::new(LayoutSize::new(data.size.width, height));
            let cell_size = cell.view.calc_size(engine, cell_constraint);
            cell.set_layout_data(
                layout_query,
                data.new_child(LayoutAnchor::TOP_LEFT, Vec2::new(0.0, y), cell_size),
            );
            commands.entity(cell.entity).insert(VBoxCellData { index });
            y -= cell_size.height;
            height -= cell_size.height;
        }
    }
}