woodpecker_ui 0.1.1

A UI library for the Bevy game engine.
Documentation
use bevy::prelude::*;
use woodpecker_ui::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(WoodpeckerUIPlugin::default())
        .add_systems(Startup, startup)
        .run();
}

fn startup(
    mut commands: Commands,
    mut ui_context: ResMut<WoodpeckerContext>,
    mut font_manager: ResMut<FontManager>,
    asset_server: Res<AssetServer>,
) {
    commands.spawn((Camera2d, WoodpeckerView));

    let font = asset_server.load("Outfit/static/Outfit-Regular.ttf");
    font_manager.add(&font);

    let root = commands
        .spawn((
            WoodpeckerApp,
            WidgetChildren::default().with_child::<Modal>((
                Modal {
                    visible: true,
                    title: "Code Editor example".into(),
                    min_size: Vec2::new(640.0, 480.0),
                    ..Default::default()
                },
                PassedChildren(
                    WidgetChildren::default().with_child::<ScrollContextProvider>((
                        ScrollContextProvider::default(),
                        WoodpeckerStyle {
                            margin: Edge::all(0.0).left(10.0).right(10.0).bottom(10.0),
                            width: Units::Percentage(100.0),
                            height: Units::Percentage(100.0),
                            ..Default::default()
                        },
                        WidgetChildren::default().with_child::<ScrollBox>((
                            ScrollBox::default(),
                            PassedChildren(WidgetChildren::default().with_child::<TextBox>(
                                TextBox {
                                    initial_value: CODE_BLOCK.to_string(),
                                    multi_line: true,
                                    text_highlighting: ApplyHighlighting::new(|txt| {
                                        Some(highlight("rust", txt, "dracula"))
                                    }),
                                    ..default()
                                },
                            )),
                        )),
                    )),
                ),
            )),
        ))
        .id();
    ui_context.set_root_widget(root);
}

pub const CODE_BLOCK: &str = r#"use bevy::prelude::*;
use woodpecker_ui::prelude::*;
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(WoodpeckerUIPlugin::default())
        .add_systems(Startup, startup)
        .run();
}

fn startup(
    mut commands: Commands,
    mut ui_context: ResMut<WoodpeckerContext>,
    mut font_manager: ResMut<FontManager>,
    asset_server: Res<AssetServer>,
) {
    commands.spawn((Camera2d, WoodpeckerView));

    let font = asset_server.load("Outfit/static/Outfit-Regular.ttf");
    font_manager.add(&font);

    let root = commands
        .spawn((
            WoodpeckerApp,
            WidgetChildren::default().with_child::<Element>((
                Element,
                WoodpeckerStyle {
                    font_size: 50.0,
                    color: Srgba::RED.into(),
                    margin: Edge::all(10.0),
                    font: Some(font.id()),
                    ..Default::default()
                },
                WidgetRender::RichText {
                    content: RichText::new().with_color_text("Hello World! ", Srgba::BLUE.into()).with_color_text("I am Woodpecker UI!", Srgba::RED.into()),
                },
            )),
        ))
        .id();
    ui_context.set_root_widget(root);
}
"#;