#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
#![allow(clippy::type_complexity)]
#![allow(clippy::too_many_arguments)]
use crate::page::Page;
use crate::spawner::PageSpawner;
use crate::systems::PageSystemSet;
use bevy::app::{App, Plugin, Update};
use bevy::asset::{AssetApp, AssetEvent};
use bevy::prelude::{IntoScheduleConfigs, on_message, resource_exists};
pub mod element;
pub mod events;
pub mod loader;
pub mod page;
pub mod spawner;
pub mod widgets;
pub(crate) mod parser;
pub(crate) mod systems;
pub struct PagesPlugin {
pub initial_read_capacity: usize,
}
impl Plugin for PagesPlugin {
fn build(&self, app: &mut App) {
app.init_asset::<Page>()
.register_asset_loader(loader::PageLoader {
initial_read_capacity: self.initial_read_capacity,
})
.insert_resource(PageSpawner::new())
.configure_sets(Update, PageSystemSet.run_if(resource_exists::<Page>))
.add_systems(Update, systems::interactions.in_set(PageSystemSet))
.add_systems(
Update,
widgets::checkbox::sync_visuals.in_set(PageSystemSet),
)
.add_observer(widgets::checkbox::toggle_checkbox)
.add_systems(
Update,
(
widgets::text_input::sync_visuals,
widgets::text_input::handle_typing,
widgets::text_input::handle_click_outside,
)
.in_set(PageSystemSet),
)
.add_observer(widgets::text_input::handle_focus)
.add_systems(
Update,
(
widgets::slider::handle_slider_input,
widgets::slider::sync_visuals,
)
.in_set(PageSystemSet),
)
.add_systems(
Update,
widgets::progress_bar::sync_progress_bar_visuals.in_set(PageSystemSet),
)
.add_systems(Update, widgets::tooltip::sync_visuals.in_set(PageSystemSet))
.add_systems(
Update,
(
widgets::scroll_view::update_scroll_bounds,
widgets::scroll_view::scroll_view_mouse_wheel,
widgets::scroll_view::scroll_view_keyboard,
widgets::scroll_view::apply_scroll_physics,
widgets::scroll_view::update_visuals,
)
.chain()
.in_set(PageSystemSet),
)
.add_systems(
Update,
(
widgets::dropdown::option_select,
widgets::dropdown::trigger_menu,
widgets::dropdown::visibility,
widgets::dropdown::close_on_outside_click,
)
.in_set(PageSystemSet),
)
.add_systems(
Update,
spawner::spawn_page.run_if(on_message::<AssetEvent<Page>>),
)
.add_observer(spawner::despawn_page);
}
}
impl Default for PagesPlugin {
fn default() -> Self {
Self {
initial_read_capacity: 2048,
}
}
}