Path: blob/main/crates/bevy_feathers/src/controls/virtual_keyboard.rs
9374 views
use bevy_ecs::prelude::*;1use bevy_input_focus::tab_navigation::TabGroup;2use bevy_ui::Node;3use bevy_ui::Val;4use bevy_ui::{widget::Text, FlexDirection};5use bevy_ui_widgets::{observe, Activate};67use crate::controls::{button, ButtonProps};89/// Fired whenever a virtual key is pressed.10#[derive(EntityEvent)]11pub struct VirtualKeyPressed<T> {12/// The virtual keyboard entity13pub entity: Entity,14/// The pressed virtual key15pub key: T,16}1718/// Function to spawn a virtual keyboard19///20/// # Emitted events21/// * [`crate::controls::VirtualKeyPressed<T>`] when a virtual key on the keyboard is un-pressed.22///23/// These events can be disabled by adding an [`bevy_ui::InteractionDisabled`] component to the entity24pub fn virtual_keyboard<T>(25keys: impl Iterator<Item = Vec<T>> + Send + Sync + 'static,26) -> impl Bundle27where28T: AsRef<str> + Clone + Send + Sync + 'static,29{30(31Node {32flex_direction: FlexDirection::Column,33row_gap: Val::Px(4.),34..Default::default()35},36TabGroup::new(0),37Children::spawn(SpawnIter(keys.map(move |row| {38(39Node {40flex_direction: FlexDirection::Row,41column_gap: Val::Px(4.),42..Default::default()43},44Children::spawn(SpawnIter(row.into_iter().map(move |key| {45(46button(ButtonProps::default(), (), Spawn(Text::new(key.as_ref()))),47observe(48move |activate: On<Activate>,49mut commands: Commands,50query: Query<&ChildOf>|51-> Result {52let virtual_keyboard =53query.get(query.get(activate.entity)?.parent())?.parent();54commands.trigger(VirtualKeyPressed {55entity: virtual_keyboard,56key: key.clone(),57});58Ok(())59},60),61)62}))),63)64}))),65)66}676869