extern crate alloc;
use bevy_app::{
HierarchyPropagatePlugin, Plugin, PluginGroup, PluginGroupBuilder, PostUpdate, PropagateSet,
};
use bevy_asset::embedded_asset;
use bevy_ecs::{query::With, schedule::IntoScheduleConfigs};
use bevy_input_focus::tab_navigation::TabNavigationPlugin;
use bevy_picking::cursor::{CursorIconPlugin, DefaultCursor, EntityCursor};
use bevy_text::{TextColor, TextFont};
use bevy_ui::{AccessibilityUiSystems, UiSystems};
use bevy_ui_render::{ImageNodeAssetChangedSystems, UiMaterialPlugin};
use crate::{
alpha_pattern::{AlphaPatternMaterial, AlphaPatternResource},
controls::ControlsPlugin,
theme::{ThemeContext, ThemedText, UiTheme},
};
mod alpha_pattern;
pub mod constants;
pub mod containers;
pub mod controls;
pub mod dark_theme;
pub mod display;
pub mod focus;
pub mod font_styles;
pub mod palette;
pub mod rounded_corners;
pub mod theme;
pub mod tokens;
pub struct FeathersCorePlugin;
impl Plugin for FeathersCorePlugin {
fn build(&self, app: &mut bevy_app::App) {
app.init_resource::<UiTheme>();
embedded_asset!(app, "assets/fonts/FiraSans-Bold.ttf");
embedded_asset!(app, "assets/fonts/FiraSans-BoldItalic.ttf");
embedded_asset!(app, "assets/fonts/FiraSans-Regular.ttf");
embedded_asset!(app, "assets/fonts/FiraSans-Italic.ttf");
embedded_asset!(app, "assets/fonts/FiraMono-Medium.ttf");
embedded_asset!(app, "assets/fonts/NotoSansSymbols2-U+1F7D5.ttf");
embedded_asset!(app, "assets/icons/chevron-down.png");
embedded_asset!(app, "assets/icons/chevron-right.png");
embedded_asset!(app, "assets/icons/x.png");
embedded_asset!(app, "assets/shaders/alpha_pattern.wesl");
embedded_asset!(app, "assets/shaders/color_plane.wesl");
embedded_asset!(app, "assets/shaders/color_wheel.wesl");
app.add_plugins((
ControlsPlugin,
CursorIconPlugin,
HierarchyPropagatePlugin::<TextColor, With<ThemedText>>::new(PostUpdate),
HierarchyPropagatePlugin::<TextFont, With<ThemedText>>::new(PostUpdate),
HierarchyPropagatePlugin::<ThemeContext>::new(PostUpdate),
UiMaterialPlugin::<AlphaPatternMaterial>::default(),
focus::FocusOutlinesPlugin,
));
app.configure_sets(
PostUpdate,
PropagateSet::<TextFont>::default().in_set(UiSystems::Propagate),
);
app.configure_sets(
PostUpdate,
PropagateSet::<TextColor>::default().in_set(UiSystems::Propagate),
);
app.insert_resource(DefaultCursor(EntityCursor::System(
bevy_window::SystemCursorIcon::Default,
)));
app.add_systems(
PostUpdate,
(
theme::update_theme.in_set(UiSystems::Prepare),
display::update_themed_icons
.after(PropagateSet::<TextColor>::default())
.ambiguous_with(ImageNodeAssetChangedSystems)
.ambiguous_with(AccessibilityUiSystems)
.ambiguous_with(UiSystems::Content),
)
.chain(),
)
.add_observer(theme::on_changed_background)
.add_observer(theme::on_changed_border)
.add_observer(theme::on_changed_font_color)
.add_observer(theme::on_changed_text_color)
.add_observer(font_styles::on_changed_font);
app.init_resource::<AlphaPatternResource>();
}
}
pub struct FeathersPlugins;
impl PluginGroup for FeathersPlugins {
fn build(self) -> PluginGroupBuilder {
PluginGroupBuilder::start::<Self>()
.add(TabNavigationPlugin)
.add(FeathersCorePlugin)
}
}