bevy_extended_ui 1.7.0

Create simply ui's with css and html for bevy.
Documentation
use crate::ImageCache;
use crate::services::image_service::get_or_load_image;
use crate::styles::{CssClass, CssSource, IconPlace};
use crate::widgets::controls::button::ButtonWidget;
use crate::widgets::controls::check_box::CheckBoxWidget;
use crate::widgets::controls::choice_box::ChoiceBoxWidget;
use crate::widgets::controls::color_picker::ColorPickerWidget;
use crate::widgets::controls::date_picker::DatePickerWidget;
use crate::widgets::controls::fieldset::FieldSetWidget;
use crate::widgets::controls::input::InputWidget;
use crate::widgets::controls::list_box::ListBoxWidget;
use crate::widgets::controls::progress_bar::ProgressBarWidget;
use crate::widgets::controls::radio_button::RadioButtonWidget;
use crate::widgets::controls::scroll_bar::ScrollWidget;
use crate::widgets::controls::slider::SliderWidget;
use crate::widgets::controls::switch_button::SwitchButtonWidget;
use crate::widgets::controls::toggle_button::ToggleButtonWidget;
use crate::widgets::{BindToID, UIWidgetState};
use bevy::camera::visibility::RenderLayers;
use bevy::ecs::relationship::RelatedSpawnerCommands;
use bevy::prelude::*;

pub mod button;
pub mod check_box;
pub mod choice_box;
pub mod color_picker;
pub mod date_picker;
pub mod fieldset;
pub mod input;
pub mod list_box;
mod progress_bar;
pub mod radio_button;
mod scroll_bar;
pub mod slider;
pub mod switch_button;
pub mod toggle_button;

/// Marker component for spawned button icon images.
#[derive(Component)]
pub struct ButtonImage;

/// Plugin that registers control widgets.
pub struct ExtendedControlWidgets;

impl Plugin for ExtendedControlWidgets {
    /// Adds all control widget plugins.
    fn build(&self, app: &mut App) {
        app.add_plugins((
            ButtonWidget,
            CheckBoxWidget,
            ChoiceBoxWidget,
            ColorPickerWidget,
            DatePickerWidget,
            FieldSetWidget,
            InputWidget,
            ListBoxWidget,
            ProgressBarWidget,
            RadioButtonWidget,
            ScrollWidget,
            SliderWidget,
            SwitchButtonWidget,
            ToggleButtonWidget,
        ));
    }
}

/// Spawns an icon when the desired placement matches.
pub fn place_icon_if(
    builder: &mut RelatedSpawnerCommands<ChildOf>,
    icon_place: IconPlace,
    desired_place: IconPlace,
    icon_path: &Option<String>,
    entry: usize,
    asset_server: &Res<AssetServer>,
    image_cache: &mut ResMut<ImageCache>,
    images: &mut ResMut<Assets<Image>>,
    css_class: Vec<String>,
    id: usize,
    layer: usize,
    css_source: CssSource,
) {
    if icon_place == desired_place {
        place_icon(
            builder,
            icon_path,
            entry,
            asset_server,
            image_cache,
            images,
            css_class,
            id,
            layer,
            css_source,
        );
    }
}

/// Spawns the icon image node for a control widget.
fn place_icon(
    builder: &mut RelatedSpawnerCommands<ChildOf>,
    icon_path: &Option<String>,
    entry: usize,
    asset_server: &Res<AssetServer>,
    image_cache: &mut ResMut<ImageCache>,
    images: &mut ResMut<Assets<Image>>,
    css_class: Vec<String>,
    id: usize,
    layer: usize,
    css_source: CssSource,
) {
    if let Some(icon) = icon_path.clone() {
        let handle = get_or_load_image(
            icon.as_str(),
            &mut **image_cache,
            &mut **images,
            asset_server,
        );

        builder.spawn((
            Name::new(format!("Button-Icon-{}", entry)),
            ImageNode::new(handle),
            RenderLayers::layer(layer),
            Pickable::IGNORE,
            UIWidgetState::default(),
            css_source.clone(),
            CssClass(css_class),
            BindToID(id),
            ZIndex(1),
            ButtonImage,
        ));
    }
}