use bevy::prelude::*; use bevy_ratatui::event::KeyMessage; use ratatui::crossterm::event::KeyCode; use tui_logger::TuiWidgetEvent; use jong::game::GameState; use crate::tui::layout::Overlays; use crate::tui::states::ConsoleWidget; use crate::tui::states::TuiState; pub(crate) fn keyboard( mut messages: MessageReader, mut overlays: ResMut, mut consolewidget: ResMut, mut exit: MessageWriter, curr_gamestate: Res>, curr_tuistate: Res>, mut next_gamestate: ResMut>, mut next_tuistate: ResMut>, ) { 'message: for message in messages.read() { let key = message.code; if consolewidget.handle_keyboard(key) { continue 'message; } for overlay in overlays.stack.iter().rev() { let consumed = match overlay { _ => false, }; if consumed { continue 'message; } } match curr_tuistate.get() { TuiState::MainMenu => match key { KeyCode::Char('p') => { next_tuistate.set(TuiState::InGame); next_gamestate.set(GameState::Setup); } KeyCode::Char('z') => { // if let Some(ref curr_zenstate) = curr_zenstate { // match curr_zenstate.get() { // ZenState::Menu => next_zenstate.set(ZenState::Zen), // ZenState::Zen => next_zenstate.set(ZenState::Menu), // } // } } KeyCode::Char('q') => { exit.write_default(); } _ => {} }, TuiState::InGame => { /* debug!("unhandled keyboard event") */ } } } } impl ConsoleWidget { pub(crate) fn handle_keyboard(&mut self, key: KeyCode) -> bool { if key == KeyCode::Char('`') { self.open = !self.open; return true; } if self.open { match key { KeyCode::Up => self.state.transition(TuiWidgetEvent::UpKey), KeyCode::Down => self.state.transition(TuiWidgetEvent::DownKey), // KeyCode::Home => self.state.transition(TuiWidgetEvent::), // KeyCode::End => self.state.transition(TuiWidgetEvent::), KeyCode::PageUp => self.state.transition(TuiWidgetEvent::PrevPageKey), KeyCode::PageDown => self.state.transition(TuiWidgetEvent::NextPageKey), KeyCode::Esc => { self.open = false; return true; } _ => return false, } } self.open } }