use super::{EditorState, Mode};
use bevy::prelude::*;
pub(super) fn type_a_name(
typed: &mut MessageReader<bevy::input::keyboard::KeyboardInput>,
keys: &ButtonInput<KeyCode>,
state: &mut EditorState,
tr: &crate::app::i18n::Tr,
) {
use crate::app::typing::{Keystroke, keystrokes};
let ends = [KeyCode::Enter, KeyCode::NumpadEnter, KeyCode::Escape];
for stroke in keystrokes(typed, &ends) {
match stroke {
Keystroke::Erase => {
state.name.pop();
}
Keystroke::Char(ch) if state.name.chars().count() < NAME_MAX => state.name.push(ch),
Keystroke::Char(_) | Keystroke::Done(_) => {}
}
}
let abandoned = keys.just_pressed(KeyCode::Escape);
if abandoned || crate::app::menu_ui::enter(keys) {
let Mode::Naming { was } = std::mem::replace(&mut state.mode, Mode::JustClosed) else {
return;
};
state.name = if abandoned {
was
} else {
tidy_name(&state.name, tr)
};
state.feedback.clear();
}
}
pub(super) const NAME_MAX: usize = 28;
pub(super) fn tidy_name(raw: &str, tr: &crate::app::i18n::Tr) -> String {
let capped: String = raw.trim().chars().take(NAME_MAX).collect();
match capped.trim_end() {
"" => tr.ed_default_name.to_string(),
name => name.to_string(),
}
}