bevy_sprinkles_editor 0.2.0

GPU particle system editor for Bevy
use bevy::prelude::*;

use crate::project::SaveProjectEvent;
use crate::ui::components::playback_controls::playback_controls;
use crate::ui::components::project_selector::project_selector;
use crate::ui::components::seekbar::seekbar;
use crate::ui::tokens::{BACKGROUND_COLOR, BORDER_COLOR};
use crate::ui::widgets::button::{ButtonClickEvent, ButtonProps, ButtonVariant, button};
use crate::ui::widgets::separator::EditorSeparator;

pub fn plugin(app: &mut App) {
    app.add_systems(Update, setup_save_button_observer);
}

#[derive(Component)]
pub struct SaveButton;

fn setup_save_button_observer(buttons: Query<Entity, Added<SaveButton>>, mut commands: Commands) {
    for entity in &buttons {
        commands.entity(entity).observe(on_save_button_click);
    }
}

fn on_save_button_click(_event: On<ButtonClickEvent>, mut commands: Commands) {
    commands.trigger(SaveProjectEvent);
}

#[derive(Component)]
pub struct EditorTopbar;

pub fn topbar(asset_server: &AssetServer) -> impl Bundle {
    (
        EditorTopbar,
        Node {
            width: percent(100),
            height: px(52),
            padding: UiRect::all(px(12)),
            border: UiRect::bottom(px(1)),
            justify_content: JustifyContent::SpaceBetween,
            align_items: AlignItems::Center,
            ..default()
        },
        BackgroundColor(BACKGROUND_COLOR.into()),
        BorderColor::all(BORDER_COLOR),
        children![
            project_selector(),
            (
                Node {
                    column_gap: px(12),
                    align_items: AlignItems::Center,
                    ..default()
                },
                children![
                    seekbar(asset_server),
                    playback_controls(asset_server),
                    EditorSeparator::vertical(),
                    (
                        SaveButton,
                        button(ButtonProps::new("Save").with_variant(ButtonVariant::Primary)),
                    ),
                ],
            ),
        ],
    )
}