Skip to content

Commit b8263b5

Browse files
committed
Support system.in_schedule() and system.on_startup() (bevyengine#7790)
# Objective Support the following syntax for adding systems: ```rust App::new() .add_system(setup.on_startup()) .add_systems(( show_menu.in_schedule(OnEnter(GameState::Paused)), menu_ssytem.in_set(OnUpdate(GameState::Paused)), hide_menu.in_schedule(OnExit(GameState::Paused)), )) ``` ## Solution Add the traits `IntoSystemAppConfig{s}`, which provide the extension methods necessary for configuring which schedule a system belongs to. These extension methods return `IntoSystemAppConfig{s}`, which `App::add_system{s}` uses to choose which schedule to add systems to. --- ## Changelog + Added the extension methods `in_schedule(label)` and `on_startup()` for configuring the schedule a system belongs to. ## Future Work * Replace all uses of `add_startup_system` in the engine. * Deprecate this method
1 parent 40e90b5 commit b8263b5

File tree

32 files changed

+444
-189
lines changed

32 files changed

+444
-189
lines changed

crates/bevy_app/src/app.rs

+36-45
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use crate::{CoreSchedule, CoreSet, Plugin, PluginGroup, StartupSet};
1+
use crate::{
2+
CoreSchedule, CoreSet, IntoSystemAppConfig, IntoSystemAppConfigs, Plugin, PluginGroup,
3+
StartupSet, SystemAppConfig,
4+
};
25
pub use bevy_derive::AppLabel;
36
use bevy_ecs::{
47
prelude::*,
@@ -378,10 +381,18 @@ impl App {
378381
/// #
379382
/// app.add_system(my_system);
380383
/// ```
381-
pub fn add_system<M>(&mut self, system: impl IntoSystemConfig<M>) -> &mut Self {
384+
pub fn add_system<M>(&mut self, system: impl IntoSystemAppConfig<M>) -> &mut Self {
382385
let mut schedules = self.world.resource_mut::<Schedules>();
383386

384-
if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) {
387+
let SystemAppConfig { system, schedule } = system.into_app_config();
388+
389+
if let Some(schedule_label) = schedule {
390+
if let Some(schedule) = schedules.get_mut(&*schedule_label) {
391+
schedule.add_system(system);
392+
} else {
393+
panic!("Schedule {schedule_label:?} does not exist.")
394+
}
395+
} else if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) {
385396
default_schedule.add_system(system);
386397
} else {
387398
let schedule_label = &self.default_schedule_label;
@@ -406,48 +417,28 @@ impl App {
406417
/// #
407418
/// app.add_systems((system_a, system_b, system_c));
408419
/// ```
409-
pub fn add_systems<M>(&mut self, systems: impl IntoSystemConfigs<M>) -> &mut Self {
410-
let mut schedules = self.world.resource_mut::<Schedules>();
411-
412-
if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) {
413-
default_schedule.add_systems(systems);
414-
} else {
415-
let schedule_label = &self.default_schedule_label;
416-
panic!("Default schedule {schedule_label:?} does not exist.")
417-
}
418-
419-
self
420-
}
421-
422-
/// Adds a system to the provided [`Schedule`].
423-
pub fn add_system_to_schedule<M>(
424-
&mut self,
425-
schedule_label: impl ScheduleLabel,
426-
system: impl IntoSystemConfig<M>,
427-
) -> &mut Self {
428-
let mut schedules = self.world.resource_mut::<Schedules>();
429-
430-
if let Some(schedule) = schedules.get_mut(&schedule_label) {
431-
schedule.add_system(system);
432-
} else {
433-
panic!("Provided schedule {schedule_label:?} does not exist.")
434-
}
435-
436-
self
437-
}
438-
439-
/// Adds a collection of system to the provided [`Schedule`].
440-
pub fn add_systems_to_schedule<M>(
441-
&mut self,
442-
schedule_label: impl ScheduleLabel,
443-
systems: impl IntoSystemConfigs<M>,
444-
) -> &mut Self {
420+
pub fn add_systems<M>(&mut self, systems: impl IntoSystemAppConfigs<M>) -> &mut Self {
445421
let mut schedules = self.world.resource_mut::<Schedules>();
446422

447-
if let Some(schedule) = schedules.get_mut(&schedule_label) {
448-
schedule.add_systems(systems);
449-
} else {
450-
panic!("Provided schedule {schedule_label:?} does not exist.")
423+
match systems.into_app_configs().0 {
424+
crate::InnerConfigs::Blanket { systems, schedule } => {
425+
let schedule = if let Some(label) = schedule {
426+
schedules
427+
.get_mut(&*label)
428+
.unwrap_or_else(|| panic!("Schedule '{label:?}' does not exist."))
429+
} else {
430+
let label = &*self.default_schedule_label;
431+
schedules
432+
.get_mut(label)
433+
.unwrap_or_else(|| panic!("Default schedule '{label:?}' does not exist."))
434+
};
435+
schedule.add_systems(systems);
436+
}
437+
crate::InnerConfigs::Granular(systems) => {
438+
for system in systems {
439+
self.add_system(system);
440+
}
441+
}
451442
}
452443

453444
self
@@ -472,7 +463,7 @@ impl App {
472463
/// .add_startup_system(my_startup_system);
473464
/// ```
474465
pub fn add_startup_system<M>(&mut self, system: impl IntoSystemConfig<M>) -> &mut Self {
475-
self.add_system_to_schedule(CoreSchedule::Startup, system)
466+
self.add_system(system.in_schedule(CoreSchedule::Startup))
476467
}
477468

478469
/// Adds a collection of systems to [`CoreSchedule::Startup`].
@@ -497,7 +488,7 @@ impl App {
497488
/// );
498489
/// ```
499490
pub fn add_startup_systems<M>(&mut self, systems: impl IntoSystemConfigs<M>) -> &mut Self {
500-
self.add_systems_to_schedule(CoreSchedule::Startup, systems)
491+
self.add_systems(systems.into_configs().in_schedule(CoreSchedule::Startup))
501492
}
502493

503494
/// Configures a system set in the default schedule, adding the set if it does not exist.

0 commit comments

Comments
 (0)