 4ee73ed904
			
		
	
	
		4ee73ed904
		
	
	
	
	
		
			
			# Objective In bevy 0.7, `CameraUi` was a component specifically added to cameras that display the UI. Since camera-driven rendering was merged, it actually does the opposite! This will make it difficult for current users to adapt to 0.8. ## Solution To avoid unnecessary confusion, we rename `CameraUi` into `UiCameraConfig`. --- ## Changelog - Rename `CameraUi` to `UiCameraConfig`
		
			
				
	
	
		
			168 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! This module contains the bundles used in Bevy's UI
 | |
| 
 | |
| use crate::{
 | |
|     widget::{Button, ImageMode},
 | |
|     CalculatedSize, FocusPolicy, Interaction, Node, Style, UiColor, UiImage,
 | |
| };
 | |
| use bevy_ecs::{
 | |
|     bundle::Bundle,
 | |
|     prelude::{Component, With},
 | |
|     query::QueryItem,
 | |
| };
 | |
| use bevy_render::{camera::Camera, extract_component::ExtractComponent, view::Visibility};
 | |
| use bevy_text::Text;
 | |
| use bevy_transform::prelude::{GlobalTransform, Transform};
 | |
| 
 | |
| /// The basic UI node
 | |
| #[derive(Bundle, Clone, Debug, Default)]
 | |
| pub struct NodeBundle {
 | |
|     /// Describes the size of the node
 | |
|     pub node: Node,
 | |
|     /// Describes the style including flexbox settings
 | |
|     pub style: Style,
 | |
|     /// Describes the color of the node
 | |
|     pub color: UiColor,
 | |
|     /// Describes the image of the node
 | |
|     pub image: UiImage,
 | |
|     /// Whether this node should block interaction with lower nodes
 | |
|     pub focus_policy: FocusPolicy,
 | |
|     /// The transform of the node
 | |
|     pub transform: Transform,
 | |
|     /// The global transform of the node
 | |
|     pub global_transform: GlobalTransform,
 | |
|     /// Describes the visibility properties of the node
 | |
|     pub visibility: Visibility,
 | |
| }
 | |
| 
 | |
| /// A UI node that is an image
 | |
| #[derive(Bundle, Clone, Debug, Default)]
 | |
| pub struct ImageBundle {
 | |
|     /// Describes the size of the node
 | |
|     pub node: Node,
 | |
|     /// Describes the style including flexbox settings
 | |
|     pub style: Style,
 | |
|     /// Configures how the image should scale
 | |
|     pub image_mode: ImageMode,
 | |
|     /// The calculated size based on the given image
 | |
|     pub calculated_size: CalculatedSize,
 | |
|     /// The color of the node
 | |
|     pub color: UiColor,
 | |
|     /// The image of the node
 | |
|     pub image: UiImage,
 | |
|     /// Whether this node should block interaction with lower nodes
 | |
|     pub focus_policy: FocusPolicy,
 | |
|     /// The transform of the node
 | |
|     pub transform: Transform,
 | |
|     /// The global transform of the node
 | |
|     pub global_transform: GlobalTransform,
 | |
|     /// Describes the visibility properties of the node
 | |
|     pub visibility: Visibility,
 | |
| }
 | |
| 
 | |
| /// A UI node that is text
 | |
| #[derive(Bundle, Clone, Debug)]
 | |
| pub struct TextBundle {
 | |
|     /// Describes the size of the node
 | |
|     pub node: Node,
 | |
|     /// Describes the style including flexbox settings
 | |
|     pub style: Style,
 | |
|     /// Contains the text of the node
 | |
|     pub text: Text,
 | |
|     /// The calculated size based on the given image
 | |
|     pub calculated_size: CalculatedSize,
 | |
|     /// Whether this node should block interaction with lower nodes
 | |
|     pub focus_policy: FocusPolicy,
 | |
|     /// The transform of the node
 | |
|     pub transform: Transform,
 | |
|     /// The global transform of the node
 | |
|     pub global_transform: GlobalTransform,
 | |
|     /// Describes the visibility properties of the node
 | |
|     pub visibility: Visibility,
 | |
| }
 | |
| 
 | |
| impl Default for TextBundle {
 | |
|     fn default() -> Self {
 | |
|         TextBundle {
 | |
|             focus_policy: FocusPolicy::Pass,
 | |
|             text: Default::default(),
 | |
|             node: Default::default(),
 | |
|             calculated_size: Default::default(),
 | |
|             style: Default::default(),
 | |
|             transform: Default::default(),
 | |
|             global_transform: Default::default(),
 | |
|             visibility: Default::default(),
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| /// A UI node that is a button
 | |
| #[derive(Bundle, Clone, Debug)]
 | |
| pub struct ButtonBundle {
 | |
|     /// Describes the size of the node
 | |
|     pub node: Node,
 | |
|     /// Marker component that signals this node is a button
 | |
|     pub button: Button,
 | |
|     /// Describes the style including flexbox settings
 | |
|     pub style: Style,
 | |
|     /// Describes whether and how the button has been interacted with by the input
 | |
|     pub interaction: Interaction,
 | |
|     /// Whether this node should block interaction with lower nodes
 | |
|     pub focus_policy: FocusPolicy,
 | |
|     /// The color of the node
 | |
|     pub color: UiColor,
 | |
|     /// The image of the node
 | |
|     pub image: UiImage,
 | |
|     /// The transform of the node
 | |
|     pub transform: Transform,
 | |
|     /// The global transform of the node
 | |
|     pub global_transform: GlobalTransform,
 | |
|     /// Describes the visibility properties of the node
 | |
|     pub visibility: Visibility,
 | |
| }
 | |
| 
 | |
| impl Default for ButtonBundle {
 | |
|     fn default() -> Self {
 | |
|         ButtonBundle {
 | |
|             button: Button,
 | |
|             interaction: Default::default(),
 | |
|             focus_policy: Default::default(),
 | |
|             node: Default::default(),
 | |
|             style: Default::default(),
 | |
|             color: Default::default(),
 | |
|             image: Default::default(),
 | |
|             transform: Default::default(),
 | |
|             global_transform: Default::default(),
 | |
|             visibility: Default::default(),
 | |
|         }
 | |
|     }
 | |
| }
 | |
| /// Configuration for cameras related to UI.
 | |
| ///
 | |
| /// When a [`Camera`] doesn't have the [`UiCameraConfig`] component,
 | |
| /// it will display the UI by default.
 | |
| ///
 | |
| /// [`Camera`]: bevy_render::camera::Camera
 | |
| #[derive(Component, Clone)]
 | |
| pub struct UiCameraConfig {
 | |
|     /// Whether to output UI to this camera view.
 | |
|     ///
 | |
|     /// When a `Camera` doesn't have the [`UiCameraConfig`] component,
 | |
|     /// it will display the UI by default.
 | |
|     pub show_ui: bool,
 | |
| }
 | |
| 
 | |
| impl Default for UiCameraConfig {
 | |
|     fn default() -> Self {
 | |
|         Self { show_ui: true }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ExtractComponent for UiCameraConfig {
 | |
|     type Query = &'static Self;
 | |
|     type Filter = With<Camera>;
 | |
| 
 | |
|     fn extract_component(item: QueryItem<Self::Query>) -> Self {
 | |
|         item.clone()
 | |
|     }
 | |
| }
 |