diff --git a/_release-content/migration-guides/ui_widgets_plugins_and_input_dispatch_plugin_are_now_default.md b/_release-content/migration-guides/ui_widgets_plugins_and_input_dispatch_plugin_are_now_default.md new file mode 100644 index 0000000000000..c7daafdf202c6 --- /dev/null +++ b/_release-content/migration-guides/ui_widgets_plugins_and_input_dispatch_plugin_are_now_default.md @@ -0,0 +1,88 @@ +--- +title: "`UiWidgetsPlugins` and `InputDispatchPlugin` are now in `DefaultPlugins`" +pull_requests: [23346] +--- + +`UiWidgetsPlugins` and `InputDispatchPlugin` are now part of `DefaultPlugins`. + +TODO: Why did we make this breaking change? + +Remove `UiWidgetsPlugins` if you have `DefaultPlugins` + +```rs +// 0.18 +fn main() { + App::new() + .add_plugins(DefaultPlugins, UiWidgetsPlugins) + .add_plugins((my_ambitious_game::game_plugin)) + .run(); +} + +// 0.19 +fn main() { + App::new() + .add_plugins(DefaultPlugins) // Puff! + .add_plugins((my_ambitious_game::game_plugin)) + .run(); +} +``` + +Remove `InputDispatchPlugin` if you have `DefaultPlugins` + +```rs +// 0.18 +fn main() { + App::new() + .add_plugins(DefaultPlugins, UiWidgetsPlugins, InputDispatchPlugin) + .add_plugins((my_sequel_game::game_plugin)) + .run(); +} + +// 0.19 +fn main() { + App::new() + .add_plugins(DefaultPlugins) // Puff! + .add_plugins((my_sequel_game::game_plugin)) + .run(); +} +``` + +Remove `PopoverPlugin` if you have `DefaultPlugins` + +```rs +// 0.18 +fn main() { + App::new() + .add_plugins(DefaultPlugins, PopoverPlugin) + .add_plugins((my_threequel_game::game_plugin)) + .run(); +} + +// 0.19 +fn main() { + App::new() + .add_plugins(DefaultPlugins) // Puff! + .add_plugins((my_threequel_game::game_plugin)) + .run(); +} +``` + +Remove `ScrollbarPlugin` if you have `DefaultPlugins` + +```rs +// 0.18 +fn main() { + App::new() + .add_plugins(DefaultPlugins, ScrollbarPlugin) + .add_plugins((my_fourquel_game::game_plugin)) + .run(); +} + +// 0.19 +fn main() { + App::new() + .add_plugins(DefaultPlugins) // Puff! + .add_plugins((my_fourquel_game::game_plugin)) + .run(); +} +``` diff --git a/crates/bevy_feathers/src/lib.rs b/crates/bevy_feathers/src/lib.rs index ed6517d84d8d6..3dce1fffae53d 100644 --- a/crates/bevy_feathers/src/lib.rs +++ b/crates/bevy_feathers/src/lib.rs @@ -23,11 +23,10 @@ use bevy_app::{ }; use bevy_asset::embedded_asset; use bevy_ecs::{query::With, schedule::IntoScheduleConfigs}; -use bevy_input_focus::{tab_navigation::TabNavigationPlugin, InputDispatchPlugin}; +use bevy_input_focus::tab_navigation::TabNavigationPlugin; use bevy_text::{TextColor, TextFont}; use bevy_ui::UiSystems; use bevy_ui_render::UiMaterialPlugin; -use bevy_ui_widgets::UiWidgetsPlugins; use crate::{ alpha_pattern::{AlphaPatternMaterial, AlphaPatternResource}, @@ -101,8 +100,6 @@ pub struct FeathersPlugins; impl PluginGroup for FeathersPlugins { fn build(self) -> PluginGroupBuilder { PluginGroupBuilder::start::() - .add_group(UiWidgetsPlugins) - .add(InputDispatchPlugin) .add(TabNavigationPlugin) .add(FeathersPlugin) } diff --git a/crates/bevy_gizmos_render/Cargo.toml b/crates/bevy_gizmos_render/Cargo.toml index 41d9197e1880d..ba62810a3798c 100644 --- a/crates/bevy_gizmos_render/Cargo.toml +++ b/crates/bevy_gizmos_render/Cargo.toml @@ -33,6 +33,7 @@ bevy_reflect = { path = "../bevy_reflect", version = "0.19.0-dev" } bevy_color = { path = "../bevy_color", version = "0.19.0-dev" } bevy_material = { path = "../bevy_material", version = "0.19.0-dev" } bevy_log = { path = "../bevy_log", version = "0.19.0-dev" } +bevy_ui = { path = "../bevy_ui", version = "0.19.0-dev" } # other bytemuck = "1.0" diff --git a/crates/bevy_gizmos_render/src/transform_gizmo_render.rs b/crates/bevy_gizmos_render/src/transform_gizmo_render.rs index ed4dca2610684..35fbdef636db2 100644 --- a/crates/bevy_gizmos_render/src/transform_gizmo_render.rs +++ b/crates/bevy_gizmos_render/src/transform_gizmo_render.rs @@ -88,7 +88,8 @@ impl Plugin for TransformGizmoRenderPlugin { PostUpdate, update_gizmo_meshes .after(bevy_transform::TransformSystems::Propagate) - .after(bevy_camera::visibility::VisibilitySystems::VisibilityPropagate), + .after(bevy_camera::visibility::VisibilitySystems::VisibilityPropagate) + .ambiguous_with(bevy_ui::UiSystems::ComputeRelative), ); } } diff --git a/crates/bevy_input_focus/src/lib.rs b/crates/bevy_input_focus/src/lib.rs index 47efd05797875..b5cfdf35389e0 100644 --- a/crates/bevy_input_focus/src/lib.rs +++ b/crates/bevy_input_focus/src/lib.rs @@ -43,6 +43,7 @@ use bevy_input::gamepad::GamepadButtonChangedEvent; use bevy_input::keyboard::KeyboardInput; #[cfg(feature = "mouse")] use bevy_input::mouse::MouseWheel; +use bevy_input::InputSystems; use bevy_window::{PrimaryWindow, Window}; use core::fmt::Debug; @@ -219,6 +220,7 @@ impl Traversal for WindowTraversal { /// /// To add bubbling to your own input events, add the [`dispatch_focused_input::`](dispatch_focused_input) system to your app, /// as described in the docs for [`FocusedInput`]. +#[derive(Default)] pub struct InputDispatchPlugin; impl Plugin for InputDispatchPlugin { @@ -238,7 +240,9 @@ impl Plugin for InputDispatchPlugin { #[cfg(feature = "mouse")] dispatch_focused_input::, ) - .in_set(InputFocusSystems::Dispatch), + .in_set(InputFocusSystems::Dispatch) + .ambiguous_with(InputFocusSystems::Dispatch) + .after(InputSystems), ); } } diff --git a/crates/bevy_internal/src/default_plugins.rs b/crates/bevy_internal/src/default_plugins.rs index 817eb9d674b3a..1df3663231a69 100644 --- a/crates/bevy_internal/src/default_plugins.rs +++ b/crates/bevy_internal/src/default_plugins.rs @@ -12,6 +12,8 @@ plugin_group! { bevy_transform:::TransformPlugin, bevy_diagnostic:::DiagnosticsPlugin, bevy_input:::InputPlugin, + #[cfg(feature = "bevy_input_focus")] + bevy_input_focus:::InputDispatchPlugin, #[custom(cfg(not(feature = "bevy_window")))] bevy_app:::ScheduleRunnerPlugin, #[cfg(feature = "bevy_window")] @@ -90,6 +92,9 @@ plugin_group! { #[cfg(feature = "hotpatching")] bevy_app::hotpatch:::HotPatchPlugin, #[plugin_group] + #[cfg(feature = "bevy_ui_widgets")] + bevy_ui_widgets:::UiWidgetsPlugins, + #[plugin_group] #[cfg(feature = "bevy_picking")] bevy_picking:::DefaultPickingPlugins, #[doc(hidden)] diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index d5c6f2c710c19..17342ea7b2578 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -74,7 +74,7 @@ pub mod prelude { } use bevy_app::{prelude::*, AnimationSystems, HierarchyPropagatePlugin, PropagateSet}; -use bevy_camera::CameraUpdateSystems; +use bevy_camera::{visibility::VisibilitySystems, CameraUpdateSystems}; use bevy_ecs::prelude::*; use bevy_input::InputSystems; use bevy_transform::TransformSystems; @@ -112,6 +112,8 @@ pub enum UiSystems { /// /// Runs in [`PostUpdate`]. Stack, + /// After this label, TODO + ComputeRelative, } /// The current scale of the UI. @@ -150,6 +152,7 @@ impl Plugin for UiPlugin { UiSystems::Content, UiSystems::Layout, UiSystems::PostLayout, + UiSystems::ComputeRelative.after(VisibilitySystems::VisibilityPropagate), ) .chain(), ) @@ -216,7 +219,8 @@ impl Plugin for UiPlugin { .in_set(UiSystems::PostLayout) .in_set(AmbiguousWithText) .in_set(AmbiguousWithUpdateText2dLayout), - ), + ) + .before(UiSystems::ComputeRelative), ); build_text_interop(app); diff --git a/crates/bevy_ui_widgets/src/lib.rs b/crates/bevy_ui_widgets/src/lib.rs index 52d3d665f31ff..ec472c58cafa1 100644 --- a/crates/bevy_ui_widgets/src/lib.rs +++ b/crates/bevy_ui_widgets/src/lib.rs @@ -44,6 +44,7 @@ use crate::popover::PopoverPlugin; /// A plugin group that registers the observers for all of the widgets in this crate. If you don't want to /// use all of the widgets, you can import the individual widget plugins instead. +#[derive(Default)] pub struct UiWidgetsPlugins; impl PluginGroup for UiWidgetsPlugins { @@ -54,8 +55,8 @@ impl PluginGroup for UiWidgetsPlugins { .add(CheckboxPlugin) .add(MenuPlugin) .add(RadioGroupPlugin) - .add(ScrollbarPlugin) .add(SliderPlugin) + .add(ScrollbarPlugin) .add(EditableTextInputPlugin) } } diff --git a/crates/bevy_ui_widgets/src/popover.rs b/crates/bevy_ui_widgets/src/popover.rs index eb32d2d61f5ea..42ff24b139ee0 100644 --- a/crates/bevy_ui_widgets/src/popover.rs +++ b/crates/bevy_ui_widgets/src/popover.rs @@ -242,7 +242,10 @@ pub struct PopoverPlugin; impl Plugin for PopoverPlugin { fn build(&self, app: &mut App) { - app.add_systems(PostUpdate, position_popover.in_set(UiSystems::Prepare)); + app.add_systems( + PostUpdate, + position_popover.in_set(UiSystems::ComputeRelative), + ); } } diff --git a/crates/bevy_ui_widgets/src/scrollbar.rs b/crates/bevy_ui_widgets/src/scrollbar.rs index 6c3087d7576b5..ff0c7d55c2b7c 100644 --- a/crates/bevy_ui_widgets/src/scrollbar.rs +++ b/crates/bevy_ui_widgets/src/scrollbar.rs @@ -6,13 +6,15 @@ use bevy_ecs::{ observer::On, query::{With, Without}, reflect::ReflectComponent, + schedule::IntoScheduleConfigs, system::{Query, Res}, }; use bevy_math::Vec2; use bevy_picking::events::{Cancel, Drag, DragEnd, DragStart, Pointer, Press}; use bevy_reflect::{prelude::ReflectDefault, Reflect}; use bevy_ui::{ - ComputedNode, ComputedUiRenderTargetInfo, Node, ScrollPosition, UiGlobalTransform, UiScale, Val, + ComputedNode, ComputedUiRenderTargetInfo, Node, ScrollPosition, UiGlobalTransform, UiScale, + UiSystems, Val, }; /// Used to select the orientation of a scrollbar, slider, or other oriented control. @@ -48,7 +50,7 @@ pub enum ControlOrientation { /// The application is free to position the scrollbars relative to the scrolling container however /// it wants: it can overlay them on top of the scrolling content, or use a grid layout to displace /// the content to make room for the scrollbars. -#[derive(Component, Debug, Reflect)] +#[derive(Component, Debug, Reflect, Clone, PartialEq)] #[reflect(Component)] pub struct Scrollbar { /// Entity being scrolled. @@ -363,6 +365,11 @@ impl Plugin for ScrollbarPlugin { .add_observer(scrollbar_on_drag_end) .add_observer(scrollbar_on_drag_cancel) .add_observer(scrollbar_on_drag) - .add_systems(PostUpdate, update_scrollbar_thumb); + .add_systems( + PostUpdate, + update_scrollbar_thumb + .in_set(UiSystems::ComputeRelative) + .ambiguous_with(UiSystems::ComputeRelative), + ); } } diff --git a/examples/ui/navigation/directional_navigation.rs b/examples/ui/navigation/directional_navigation.rs index 5b6a96fd7b528..1433829745643 100644 --- a/examples/ui/navigation/directional_navigation.rs +++ b/examples/ui/navigation/directional_navigation.rs @@ -20,7 +20,7 @@ use bevy::{ camera::NormalizedRenderTarget, input_focus::{ directional_navigation::{AutoNavigationConfig, DirectionalNavigationPlugin}, - InputDispatchPlugin, InputFocus, InputFocusVisible, + InputFocus, InputFocusVisible, }, math::{CompassOctant, Dir2, Rot2}, picking::{ @@ -35,11 +35,7 @@ use bevy::{ fn main() { App::new() // Input focus is not enabled by default, so we need to add the corresponding plugins - .add_plugins(( - DefaultPlugins, - InputDispatchPlugin, - DirectionalNavigationPlugin, - )) + .add_plugins((DefaultPlugins, DirectionalNavigationPlugin)) // This resource is canonically used to track whether or not to render a focus indicator // It starts as false, but we set it to true here as we would like to see the focus indicator .insert_resource(InputFocusVisible(true)) diff --git a/examples/ui/navigation/directional_navigation_overrides.rs b/examples/ui/navigation/directional_navigation_overrides.rs index 75a7f601ec4ca..ed5ac605dbc57 100644 --- a/examples/ui/navigation/directional_navigation_overrides.rs +++ b/examples/ui/navigation/directional_navigation_overrides.rs @@ -25,7 +25,7 @@ use bevy::{ directional_navigation::{ AutoNavigationConfig, DirectionalNavigationMap, DirectionalNavigationPlugin, }, - InputDispatchPlugin, InputFocus, InputFocusVisible, + InputFocus, InputFocusVisible, }, math::{CompassOctant, Dir2}, picking::{ @@ -41,11 +41,7 @@ fn main() { App::new() // Input focus is not enabled by default, so we need to add the corresponding plugins // The navigation system's resources are initialized by the DirectionalNavigationPlugin. - .add_plugins(( - DefaultPlugins, - InputDispatchPlugin, - DirectionalNavigationPlugin, - )) + .add_plugins((DefaultPlugins, DirectionalNavigationPlugin)) // This resource is canonically used to track whether or not to render a focus indicator // It starts as false, but we set it to true here as we would like to see the focus indicator .insert_resource(InputFocusVisible(true)) diff --git a/examples/ui/scroll_and_overflow/scrollbars.rs b/examples/ui/scroll_and_overflow/scrollbars.rs index a3b1a754c32a3..b25ed998508d2 100644 --- a/examples/ui/scroll_and_overflow/scrollbars.rs +++ b/examples/ui/scroll_and_overflow/scrollbars.rs @@ -2,25 +2,15 @@ use bevy::{ ecs::{relationship::RelatedSpawner, spawn::SpawnWith}, - input_focus::{ - tab_navigation::{TabGroup, TabNavigationPlugin}, - InputDispatchPlugin, - }, + input_focus::tab_navigation::{TabGroup, TabNavigationPlugin}, picking::hover::Hovered, prelude::*, - ui_widgets::{ - ControlOrientation, CoreScrollbarDragState, CoreScrollbarThumb, Scrollbar, ScrollbarPlugin, - }, + ui_widgets::{ControlOrientation, CoreScrollbarDragState, CoreScrollbarThumb, Scrollbar}, }; fn main() { App::new() - .add_plugins(( - DefaultPlugins, - ScrollbarPlugin, - InputDispatchPlugin, - TabNavigationPlugin, - )) + .add_plugins((DefaultPlugins, TabNavigationPlugin)) .insert_resource(UiScale(1.25)) .add_systems(Startup, setup_view_root) .add_systems(Update, update_scrollbar_thumb) diff --git a/examples/ui/widgets/standard_widgets.rs b/examples/ui/widgets/standard_widgets.rs index 0f281a9dd607f..c9c297812faf6 100644 --- a/examples/ui/widgets/standard_widgets.rs +++ b/examples/ui/widgets/standard_widgets.rs @@ -10,7 +10,7 @@ use bevy::{ color::palettes::basic::*, input_focus::{ tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, - InputDispatchPlugin, InputFocus, + InputFocus, }, picking::hover::Hovered, prelude::*, @@ -20,18 +20,13 @@ use bevy::{ popover::{Popover, PopoverAlign, PopoverPlacement, PopoverSide}, Activate, Button, Checkbox, CoreSliderDragState, MenuAction, MenuButton, MenuEvent, MenuItem, MenuPopup, RadioButton, RadioGroup, Slider, SliderRange, SliderThumb, - SliderValue, TrackClick, UiWidgetsPlugins, ValueChange, + SliderValue, TrackClick, ValueChange, }, }; fn main() { App::new() - .add_plugins(( - DefaultPlugins, - UiWidgetsPlugins, - InputDispatchPlugin, - TabNavigationPlugin, - )) + .add_plugins((DefaultPlugins, TabNavigationPlugin)) .insert_resource(DemoWidgetStates { slider_value: 50.0, slider_click: TrackClick::Snap, diff --git a/examples/ui/widgets/standard_widgets_observers.rs b/examples/ui/widgets/standard_widgets_observers.rs index c5a24f1833f71..56eb42b9336a4 100644 --- a/examples/ui/widgets/standard_widgets_observers.rs +++ b/examples/ui/widgets/standard_widgets_observers.rs @@ -6,28 +6,20 @@ use bevy::{ color::palettes::basic::*, - input_focus::{ - tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, - InputDispatchPlugin, - }, + input_focus::tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, picking::hover::Hovered, prelude::*, reflect::Is, ui::{Checked, InteractionDisabled, Pressed}, ui_widgets::{ checkbox_self_update, observe, Activate, Button, Checkbox, Slider, SliderRange, - SliderThumb, SliderValue, UiWidgetsPlugins, ValueChange, + SliderThumb, SliderValue, ValueChange, }, }; fn main() { App::new() - .add_plugins(( - DefaultPlugins, - UiWidgetsPlugins, - InputDispatchPlugin, - TabNavigationPlugin, - )) + .add_plugins((DefaultPlugins, TabNavigationPlugin)) .insert_resource(DemoWidgetStates { slider_value: 50.0 }) .add_systems(Startup, setup) .add_observer(button_on_interaction::) diff --git a/examples/ui/widgets/tab_navigation.rs b/examples/ui/widgets/tab_navigation.rs index 2755d0fdf1a0b..29897630ac6fb 100644 --- a/examples/ui/widgets/tab_navigation.rs +++ b/examples/ui/widgets/tab_navigation.rs @@ -4,14 +4,14 @@ use bevy::{ color::palettes::basic::*, input_focus::{ tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, - InputDispatchPlugin, InputFocus, + InputFocus, }, prelude::*, }; fn main() { App::new() - .add_plugins((DefaultPlugins, InputDispatchPlugin, TabNavigationPlugin)) + .add_plugins((DefaultPlugins, TabNavigationPlugin)) .add_systems(Startup, setup) .add_systems(Update, (button_system, focus_system)) .run(); diff --git a/examples/ui/widgets/vertical_slider.rs b/examples/ui/widgets/vertical_slider.rs index e210e48155c62..1d1dfab354e2b 100644 --- a/examples/ui/widgets/vertical_slider.rs +++ b/examples/ui/widgets/vertical_slider.rs @@ -1,15 +1,12 @@ //! Simple example showing vertical and horizontal slider widgets with snap behavior and value labels use bevy::{ - input_focus::{ - tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, - InputDispatchPlugin, - }, + input_focus::tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, picking::hover::Hovered, prelude::*, ui_widgets::{ observe, slider_self_update, CoreSliderDragState, Slider, SliderRange, SliderThumb, - SliderValue, TrackClick, UiWidgetsPlugins, + SliderValue, TrackClick, }, }; @@ -18,12 +15,7 @@ const SLIDER_THUMB: Color = Color::srgb(0.35, 0.75, 0.35); fn main() { App::new() - .add_plugins(( - DefaultPlugins, - UiWidgetsPlugins, - InputDispatchPlugin, - TabNavigationPlugin, - )) + .add_plugins((DefaultPlugins, TabNavigationPlugin)) .add_systems(Startup, setup) .add_systems(Update, (update_slider_visuals, update_value_labels)) .run();