trace_game/windows/
user_window.rs

1use 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}