rl 0.4.0

A reinforcement learning library
Documentation
use crossterm::event::{Event, KeyCode};
use ratatui::{prelude::*, widgets::WidgetRef};
use tui_logger::{TuiLoggerSmartWidget, TuiWidgetEvent, TuiWidgetState};

use crate::viz::util::event_keycode;

use super::Component;

pub struct Logs {
    state: TuiWidgetState,
}

impl Logs {
    pub fn new() -> Self {
        Self {
            state: TuiWidgetState::new().set_default_display_level(log::LevelFilter::Trace),
        }
    }
}

impl WidgetRef for Logs {
    fn render_ref(&self, area: Rect, buf: &mut Buffer) {
        TuiLoggerSmartWidget::default()
            .style(Style::default().white())
            .style_error(Style::default().light_red())
            .style_warn(Style::default().light_yellow())
            .style_info(Style::default().cyan())
            .output_separator(' ')
            .state(&self.state)
            .render(area, buf);
    }
}

impl Component for Logs {
    fn handle_ui_event(&mut self, event: &Event) -> bool {
        let Some(key) = event_keycode(event) else {
            return false;
        };

        let widget_event = match key {
            KeyCode::Char(' ') => TuiWidgetEvent::SpaceKey,
            KeyCode::Esc => TuiWidgetEvent::EscapeKey,
            KeyCode::PageUp => TuiWidgetEvent::PrevPageKey,
            KeyCode::PageDown => TuiWidgetEvent::NextPageKey,
            KeyCode::Up => TuiWidgetEvent::UpKey,
            KeyCode::Down => TuiWidgetEvent::DownKey,
            KeyCode::Left => TuiWidgetEvent::LeftKey,
            KeyCode::Right => TuiWidgetEvent::RightKey,
            KeyCode::Char('=') | KeyCode::Char('+') => TuiWidgetEvent::PlusKey,
            KeyCode::Char('-') | KeyCode::Char('_') => TuiWidgetEvent::MinusKey,
            KeyCode::Char('s') => TuiWidgetEvent::HideKey,
            KeyCode::Char('f') => TuiWidgetEvent::FocusKey,
            _ => return false,
        };

        self.state.transition(widget_event);
        true
    }
}