use bevy::prelude::{App, IntoScheduleConfigs, Startup, SystemSet, Update};
#[derive(SystemSet, Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum EditorStartupSet {
Buffer,
Scene,
Chrome,
}
#[derive(SystemSet, Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum EditorSet {
Input,
Intent,
Edit,
Layout,
Shape,
Render,
}
pub fn configure_editor_sets(app: &mut App) {
let _app = app
.configure_sets(
Startup,
(
EditorStartupSet::Buffer,
EditorStartupSet::Scene.after(EditorStartupSet::Buffer),
EditorStartupSet::Chrome.after(EditorStartupSet::Scene),
),
)
.configure_sets(
Update,
(
EditorSet::Input,
EditorSet::Intent.after(EditorSet::Input),
EditorSet::Edit.after(EditorSet::Intent),
EditorSet::Layout.after(EditorSet::Edit),
EditorSet::Shape.after(EditorSet::Layout),
EditorSet::Render.after(EditorSet::Shape),
),
);
}
#[cfg(test)]
mod tests {
use super::{EditorSet, configure_editor_sets};
use bevy::prelude::{App, IntoScheduleConfigs, ResMut, Resource, Update};
#[derive(Default, Resource)]
struct ObservedOrder {
stages: Vec<&'static str>,
}
fn input_stage(mut order: ResMut<ObservedOrder>) {
order.stages.push("input");
}
fn intent_stage(mut order: ResMut<ObservedOrder>) {
order.stages.push("intent");
}
fn edit_stage(mut order: ResMut<ObservedOrder>) {
order.stages.push("edit");
}
fn layout_stage(mut order: ResMut<ObservedOrder>) {
order.stages.push("layout");
}
fn shape_stage(mut order: ResMut<ObservedOrder>) {
order.stages.push("shape");
}
fn render_stage(mut order: ResMut<ObservedOrder>) {
order.stages.push("render");
}
#[test]
fn editor_sets_run_in_dataflow_order() {
let mut app = App::new();
configure_editor_sets(&mut app);
let _app = app
.init_resource::<ObservedOrder>()
.add_systems(Update, input_stage.in_set(EditorSet::Input))
.add_systems(Update, intent_stage.in_set(EditorSet::Intent))
.add_systems(Update, edit_stage.in_set(EditorSet::Edit))
.add_systems(Update, layout_stage.in_set(EditorSet::Layout))
.add_systems(Update, shape_stage.in_set(EditorSet::Shape))
.add_systems(Update, render_stage.in_set(EditorSet::Render));
app.update();
let order = app.world().resource::<ObservedOrder>();
assert_eq!(
order.stages,
["input", "intent", "edit", "layout", "shape", "render"]
);
}
}