use super::{Component, State};
use crate::action::{mode::Mode, scene::Scene, Action};
use crate::router::Message;
use crate::tui::Frame;
use color_eyre::eyre::Result;
use ratatui::prelude::*;
use tokio::sync::mpsc;
mod app_fps;
mod buffers;
mod counters;
mod layers;
mod render_fps;
mod state_display;
mod trail;
use state_display::StateDisplay;
mod stats_display;
use app_fps::AppFps;
use buffers::Buffers;
use counters::Counters;
use render_fps::RenderFps;
use stats_display::StatsDisplay;
use trail::Trail;
#[derive(Debug)]
pub struct Internals {
state: State,
pub message_tx_to_self: mpsc::UnboundedSender<Message>,
state_display: StateDisplay,
stats_display: StatsDisplay,
actions: Buffers,
counters: Counters,
mode: Mode,
}
impl Internals {
pub fn new(tx: mpsc::UnboundedSender<Message>) -> Internals {
let (message_tx_to_self, _) = mpsc::unbounded_channel::<Message>();
Internals {
state: State::Visible,
message_tx_to_self,
state_display: StateDisplay::new(tx),
stats_display: StatsDisplay::new(),
actions: Buffers::default(),
counters: Counters::default(),
mode: Mode::default(),
}
}
pub fn get_state_display_tx_handle(&self) -> mpsc::UnboundedSender<Message> {
self.state_display.get_tx_handle()
}
}
impl Component for Internals {
fn update(&mut self, action: Action) -> Result<Option<Action>> {
if let Action::ChangeMode(mode) = action {
self.mode = mode;
}
match action {
Action::Tick => {
self.stats_display.app_tick(&mut self.counters);
}
Action::Render => {
self.stats_display.render_tick(&mut self.counters);
}
Action::ChangeScene(scene) => match self.mode {
Mode::Navigation => {
match scene {
Scene::Internals => self.state = State::Visible,
_ => self.state = State::Hidden,
}
}
Mode::TextInput => {}
},
_ => {}
}
StatsDisplay::update(&mut self.actions, &mut self.counters, action);
Ok(None)
}
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
if let State::Hidden = self.state {
} else {
let layers = layers::Layers::new(area);
self.state_display.render(layers.left[0], f)?;
RenderFps::render(&self.actions, layers.right[0], f);
AppFps::render(&self.actions, layers.right[1], f);
StatsDisplay::render(&self.counters, layers.left[1], f)?;
Trail::render(&self.actions, layers.right[2], f);
}
Ok(())
}
}