use std::borrow::Cow;
use bevy::core::Name;
use bevy::ecs::{entity::Entity, prelude::Component};
#[cfg(feature = "bevy_reflect")]
use bevy::reflect::Reflect;
#[derive(Component)]
pub struct NavMarker<T: Component>(pub T);
#[doc(alias = "NavMenu")]
#[derive(Component, Debug, Clone)]
pub enum MenuBuilder {
NamedParent(Name),
EntityParent(Entity),
Root,
}
impl MenuBuilder {
pub fn from_named(parent: impl Into<Cow<'static, str>>) -> Self {
Self::NamedParent(Name::new(parent))
}
}
impl From<Option<Entity>> for MenuBuilder {
fn from(parent: Option<Entity>) -> Self {
match parent {
Some(parent) => MenuBuilder::EntityParent(parent),
None => MenuBuilder::Root,
}
}
}
impl TryFrom<&MenuBuilder> for Option<Entity> {
type Error = ();
fn try_from(value: &MenuBuilder) -> Result<Self, Self::Error> {
match value {
MenuBuilder::EntityParent(parent) => Ok(Some(*parent)),
MenuBuilder::NamedParent(_) => Err(()),
MenuBuilder::Root => Ok(None),
}
}
}
#[doc(alias = "NavMenu")]
#[derive(Clone, Default, Component, Debug, Copy, PartialEq)]
#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
pub struct MenuSetting {
pub wrapping: bool,
pub scope: bool,
}
impl MenuSetting {
pub(crate) fn bound(&self) -> bool {
!self.wrapping
}
pub(crate) fn is_2d(&self) -> bool {
!self.is_scope()
}
pub(crate) fn is_scope(&self) -> bool {
self.scope
}
pub fn new() -> Self {
Self::default()
}
pub fn wrapping(mut self) -> Self {
self.wrapping = true;
self
}
pub fn scope(mut self) -> Self {
self.scope = true;
self
}
}