#![allow(clippy::type_complexity)] mod device; mod messages; mod net; mod state; mod views; use bevy::{ app::{AppExit, Plugin, PreUpdate}, ecs::{ message::{MessageReader, MessageWriter}, system::Res, }, state::{app::AppExtStates, state::State}, }; use bevy_ratatui::event::KeyMessage; use crate::{ device::DevicePlugin, messages::StrikeMessage, net::NetPlugin, state::AppState, views::{HomeViewPlugin, MonitoringViewPlugin}, }; #[derive(Debug)] pub struct StrikerPlugin; impl Plugin for StrikerPlugin { fn build(&self, app: &mut bevy::app::App) { app.init_state::() .add_message::() .add_plugins(( NetPlugin, DevicePlugin, HomeViewPlugin, MonitoringViewPlugin, )) .add_systems(PreUpdate, keybinds); } } fn keybinds( state: Res>, mut key_reader: MessageReader, mut strike_writer: MessageWriter, mut app_exit: MessageWriter, ) { use ratatui::crossterm::event::KeyCode; for message in key_reader.read() { match message.code { KeyCode::Char('s') if state.get() == &AppState::Home => { strike_writer.write(StrikeMessage::ToggleSearch); } KeyCode::Up if state.get() == &AppState::Home => { strike_writer.write(StrikeMessage::PrevDevice); } KeyCode::Down if state.get() == &AppState::Home => { strike_writer.write(StrikeMessage::NextDevice); } KeyCode::Enter | KeyCode::Char(' ') if state.get() == &AppState::Home => { strike_writer.write(StrikeMessage::MonitorDevice); } KeyCode::Backspace if state.get() == &AppState::Monitoring => { strike_writer.write(StrikeMessage::StopMonitoring); } KeyCode::Char('q') | KeyCode::Esc => { app_exit.write(AppExit::Success); } _ => {} } } }