//! Simple text input support //! //! Return creates a new line, backspace removes the last character. //! Clicking toggle IME (Input Method Editor) support, but the font used as limited support of characters. //! You should change the provided font with another one to test other languages input. use std::mem; use bevy::{ input::keyboard::{Key, KeyboardInput}, prelude::*, }; fn main() { App::new() .add_plugins(DefaultPlugins) .add_systems(Startup, setup_scene) .add_systems( Update, ( toggle_ime, listen_ime_events, listen_keyboard_input_events, bubbling_text, ), ) .run(); } fn setup_scene(mut commands: Commands, asset_server: Res) { commands.spawn(Camera2d); // The default font has a limited number of glyphs, so use the full version for // sections that will hold text input. let font = asset_server.load("fonts/FiraMono-Medium.ttf"); commands.spawn( TextBundle::from_sections([ TextSection::from("Click to toggle IME. Press return to start a new line.\n\n"), TextSection::from("IME Enabled: "), TextSection::from("false\n"), TextSection::from("IME Active: "), TextSection::from("false\n"), TextSection::from("IME Buffer: "), TextSection { value: "\n".to_string(), style: TextStyle { font: font.clone(), ..default() }, }, ]) .with_style(Style { position_type: PositionType::Absolute, top: Val::Px(12.0), left: Val::Px(12.0), ..default() }), ); commands.spawn(Text2dBundle { text: Text::from_section( "".to_string(), TextStyle { font, font_size: 100.0, ..default() }, ), ..default() }); } fn toggle_ime( input: Res>, mut windows: Query<&mut Window>, mut text: Query<&mut Text, With>, ) { if input.just_pressed(MouseButton::Left) { let mut window = windows.single_mut(); window.ime_position = window.cursor_position().unwrap(); window.ime_enabled = !window.ime_enabled; let mut text = text.single_mut(); text.sections[2].value = format!("{}\n", window.ime_enabled); } } #[derive(Component)] struct Bubble { timer: Timer, } fn bubbling_text( mut commands: Commands, mut bubbles: Query<(Entity, &mut Transform, &mut Bubble)>, time: Res