trace_game/windows/
user_window.rs1use crate::add_to_commands;
2use crate::generate_all_chars;
3use crate::get_app_path;
4use crate::windows::create_main_menu_window;
5use crate::State;
6use crate::Window;
7use crate::WindowCommand;
8use crossterm::event::KeyCode;
9use std::collections::HashMap;
10use std::rc::Rc;
11use tui::backend::Backend;
12use tui::layout::Alignment;
13use tui::style::Color;
14use tui::style::Style;
15use tui::text::Span;
16use tui::text::Spans;
17use tui::widgets::Paragraph;
18use tui::Frame;
19
20fn user_window<B: 'static + Backend>(state: Rc<State>) -> Box<dyn Fn(&mut Frame<B>)> {
21 Box::new(move |f| {
22 let paragraph = Paragraph::new(vec![Spans::from(vec![
23 Span::from("Please write your username:\n"),
24 Span::styled(
25 state.user_name.to_string(),
26 Style::default().fg(Color::Yellow),
27 ),
28 ])])
29 .alignment(Alignment::Center);
30 f.render_widget(paragraph, f.size());
31 })
32}
33
34fn handle_char_press<B: 'static + Backend>(
35 c: char,
36) -> Box<dyn Fn(&mut State) -> Option<Window<B>>> {
37 Box::new(move |state: &mut State| {
38 state.user_name.push(c);
39 create_user_window(state)
40 })
41}
42
43pub fn create_user_window<B: 'static + Backend>(_: &mut State) -> Option<Window<B>> {
44 let chars = generate_all_chars();
45 let mut commands = HashMap::new();
46 add_to_commands(&mut commands, &chars, Box::new(handle_char_press));
47
48 fn handle_backspace_press<B: 'static + Backend>(state: &mut State) -> Option<Window<B>> {
49 state.user_name.pop();
50 create_user_window(state)
51 }
52 commands.insert(
53 KeyCode::Backspace,
54 WindowCommand {
55 activator_key: KeyCode::Backspace,
56 action: Box::new(handle_backspace_press),
57 },
58 );
59 commands.insert(
60 KeyCode::Enter,
61 WindowCommand {
62 activator_key: KeyCode::Enter,
63 action: Box::new(|state| {
64 let path = get_app_path(".user");
65 match std::fs::write(path, state.user_name.to_string()) {
66 Ok(_) => create_main_menu_window(state),
67 Err(_) => create_user_window(state),
68 }
69 }),
70 },
71 );
72
73 Some(Window {
74 ui: user_window,
75 commands,
76 })
77}