#![doc = include_str!("../README.md")]
mod component;
pub mod error;
mod parser;
pub mod plugins;
pub mod property;
mod selector;
mod stylesheet;
pub mod system;
use crate::{
property::Property,
system::{
sets::BevyCssSet,
ComponentFilterRegistry,
},
};
use bevy::{
ecs::system::SystemState,
prelude::*,
};
pub mod prelude {
pub use super::{
component::{Class, StyleSheet},
error::BevyCssError,
plugins::BevyCssPlugin,
property::{Property, PropertyValues},
stylesheet::StyleSheetAsset,
RegisterComponentSelector,
RegisterProperty,
};
}
pub trait RegisterComponentSelector
{
fn register_component_selector<T>(
&mut self,
name: &'static str
) -> &mut Self
where
T: Component;
}
impl RegisterComponentSelector
for bevy::prelude::App
{
fn register_component_selector<T>(
&mut self,
name: &'static str
) -> &mut Self
where
T: Component,
{
let system_state = SystemState::<Query<Entity, With<T>>>::new(&mut self.world);
let boxed_state = Box::new(system_state);
self.world
.get_resource_or_insert_with::<ComponentFilterRegistry>(|| {
ComponentFilterRegistry(Default::default())
})
.0
.insert(name, boxed_state);
self
}
}
pub trait RegisterProperty
{
fn register_property<T>(
&mut self
) -> &mut Self
where
T: Property + 'static;
}
impl RegisterProperty
for bevy::prelude::App
{
fn register_property<T>(
&mut self
) -> &mut Self
where
T: Property + 'static,
{
self.add_systems(Update, T::apply_system.in_set(BevyCssSet::Apply))
}
}