nightshade 0.13.0

A cross-platform data-oriented game engine.
Documentation
use crate::ecs::ui::builder::UiTreeBuilder;
use crate::ecs::ui::components::*;

pub struct TileBuilder<'t, 'a> {
    pub(super) tree: &'t mut UiTreeBuilder<'a>,
    pub(super) container: freecs::Entity,
}

impl<'t, 'a> TileBuilder<'t, 'a> {
    pub fn add_text(&mut self, text: impl Into<String>) -> usize {
        self.tree.world_mut().resources.text_cache.add_text(text)
    }

    pub fn pane(&mut self, title: &str) -> Option<(TileId, freecs::Entity)> {
        self.tree
            .world_mut()
            .ui_tile_add_pane(self.container, title)
    }

    pub fn pane_sibling(
        &mut self,
        sibling: TileId,
        title: &str,
    ) -> Option<(TileId, freecs::Entity)> {
        let tabs_id = match self.tree.world_mut().ui.get_ui_widget_state(self.container) {
            Some(UiWidgetState::TileContainer(data)) => data.find_parent_tabs(sibling)?,
            _ => return None,
        };
        self.tree
            .world_mut()
            .ui_tile_add_pane_to(self.container, tabs_id, title)
    }

    pub fn split_from(
        &mut self,
        pane: TileId,
        direction: SplitDirection,
        ratio: f32,
        title: &str,
    ) -> Option<(TileId, freecs::Entity)> {
        let target = match self.tree.world_mut().ui.get_ui_widget_state(self.container) {
            Some(UiWidgetState::TileContainer(data)) => {
                data.find_parent_tabs(pane).unwrap_or(data.root)
            }
            _ => return None,
        };
        self.tree
            .world_mut()
            .ui_tile_split(self.container, target, direction, ratio, title)
    }

    pub fn content(
        &mut self,
        content_entity: freecs::Entity,
        f: impl FnOnce(&mut UiTreeBuilder<'a>),
    ) {
        self.tree.push_parent(content_entity);
        f(self.tree);
        self.tree.pop_parent();
    }
}