-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
# Objective Add useful information about cursor position relative to a UI node. Fixes #7079. ## Solution - Added a new `RelativeCursorPosition` component --- ## Changelog - Added - `RelativeCursorPosition` - an example showcasing the new component Co-authored-by: Dawid Piotrowski <41804418+Pietrek14@users.noreply.github.com>
- Loading branch information
Showing
4 changed files
with
148 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
//! Showcases the `RelativeCursorPosition` component, used to check the position of the cursor relative to a UI node. | ||
use bevy::{prelude::*, ui::RelativeCursorPosition, winit::WinitSettings}; | ||
|
||
fn main() { | ||
App::new() | ||
.add_plugins(DefaultPlugins) | ||
// Only run the app when there is user input. This will significantly reduce CPU/GPU use. | ||
.insert_resource(WinitSettings::desktop_app()) | ||
.add_startup_system(setup) | ||
.add_system(relative_cursor_position_system) | ||
.run(); | ||
} | ||
|
||
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) { | ||
commands.spawn(Camera2dBundle::default()); | ||
|
||
commands | ||
.spawn(NodeBundle { | ||
style: Style { | ||
size: Size::new(Val::Percent(100.0), Val::Percent(100.0)), | ||
align_items: AlignItems::Center, | ||
justify_content: JustifyContent::Center, | ||
flex_direction: FlexDirection::Column, | ||
..default() | ||
}, | ||
..default() | ||
}) | ||
.with_children(|parent| { | ||
parent | ||
.spawn(NodeBundle { | ||
style: Style { | ||
size: Size::new(Val::Px(250.0), Val::Px(250.0)), | ||
margin: UiRect::new(Val::Px(0.), Val::Px(0.), Val::Px(0.), Val::Px(15.)), | ||
..default() | ||
}, | ||
background_color: Color::rgb(235., 35., 12.).into(), | ||
..default() | ||
}) | ||
.insert(RelativeCursorPosition::default()); | ||
|
||
parent.spawn(TextBundle { | ||
text: Text::from_section( | ||
"(0.0, 0.0)", | ||
TextStyle { | ||
font: asset_server.load("fonts/FiraSans-Bold.ttf"), | ||
font_size: 40.0, | ||
color: Color::rgb(0.9, 0.9, 0.9), | ||
}, | ||
), | ||
..default() | ||
}); | ||
}); | ||
} | ||
|
||
/// This systems polls the relative cursor position and displays its value in a text component. | ||
fn relative_cursor_position_system( | ||
relative_cursor_position_query: Query<&RelativeCursorPosition>, | ||
mut output_query: Query<&mut Text>, | ||
) { | ||
let relative_cursor_position = relative_cursor_position_query.single(); | ||
|
||
let mut output = output_query.single_mut(); | ||
|
||
output.sections[0].value = | ||
if let Some(relative_cursor_position) = relative_cursor_position.normalized { | ||
format!( | ||
"({:.1}, {:.1})", | ||
relative_cursor_position.x, relative_cursor_position.y | ||
) | ||
} else { | ||
"unknown".to_string() | ||
}; | ||
|
||
output.sections[0].style.color = if relative_cursor_position.mouse_over() { | ||
Color::rgb(0.1, 0.9, 0.1) | ||
} else { | ||
Color::rgb(0.9, 0.1, 0.1) | ||
}; | ||
} |