use bevy::reflect::{TypePath, TypeUuid}; use crate::editor::prelude::*; #[derive(Debug, Default)] pub struct EditorTimelinePlugin; impl Plugin for EditorTimelinePlugin { fn build(&self, app: &mut App) { app.add_systems(Update, add_timeline_epoch.run_if(ui::activated::)) .add_systems(Update, control_active_epoch); } } #[derive( Debug, Component, Resource, Clone, Default, TypeUuid, Deserialize, TypePath, FromReflect, )] #[uuid = "959f5f02-7c80-4b3d-ad02-9dc2e5d1b963"] pub struct Epoch { id: usize, scene: DynamicScene, } /// Timeline widget marker #[derive(Debug, Component)] pub struct TimelineWidget; /// Add Epoch component, used on a button to trigger a new epoch addition #[derive(Debug, Component)] pub struct AddEpoch; fn control_active_epoch( events: Query<(Entity, &Epoch), Added>, mut commands: Commands, ) { events.iter().for_each(|(entity, epoch)| { commands.insert_resource(epoch.clone()); }); } /// System for adding an epoch to the level's timeline /// Triggered when a button with the AddEpoch marker is Active fn add_timeline_epoch( root: Query<(Entity, &Children), With>, mut commands: Commands, ) { info!("Adding timeline epoch"); root.iter().for_each(|(entity, children)| { let id = children.iter().len(); let name = format!("{}", id); commands.entity(entity).with_children(|parent| { parent.spawn(( ButtonBundle { style: Style { border: UiRect::all(Val::Px(1.0)), margin: UiRect::all(Val::Px(1.0)), padding: UiRect::all(Val::Px(1.0)), ..default() }, border_color: Color::BLACK.into(), ..default() }, ui::Title { text: name, ..default() }, Epoch { id, ..default() }, )); }); }); }