tickrs 0.15.0

Realtime ticker data in your terminal 📈
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Paragraph, Widget};

use super::block;
use crate::draw::{add_padding, PaddingDirection};
use crate::theme::style;
use crate::THEME;

const LEFT_TEXT: &str = r#"
Quit: q or <Ctrl+c>
Add Stock:
  - /: open prompt
  - (while adding):
    - <Enter>: accept
    - <Escape>: quit
Change Tab:
  - <Tab>: next stock
  - <Shift+Tab>: previous stock
Reorder Current Tab:
  - <Ctrl+Left>: move 1 tab left
  - <Ctrl+Right>: move 1 tab right
Change Time Frame:
  - <Right>: next time frame
  - <Left>: previous time frame
Toggle Summary Pane:
  - s: toggle pane
  - <Up / Down>: scroll pane
"#;

const RIGHT_TEXT: &str = r#"
Remove Stock: k
Graphing Display:
  - c: toggle candlestick chart
  - p: toggle pre / post market
  - v: toggle volumes graph
  - x: toggle labels
Toggle Options Pane:
  - o: toggle pane
  - <Escape>: close pane
  - <Tab>: toggle calls / puts
  - Navigate with arrow keys
  - Cryptocurrency not supported
Toggle Chart Configurations Pane:
  - e: toggle pane
  - <Up / Down>: move up/down
  - <Tab / Shift+Tab>: move up/down
  - <Left / Right>: select options
  - <Enter>: submit changes
"#;

const LEFT_WIDTH: usize = 34;
const RIGHT_WIDTH: usize = 35;
pub const HELP_WIDTH: usize = 2 + LEFT_WIDTH + 2 + RIGHT_WIDTH + 2;
pub const HELP_HEIGHT: usize = 2 + 18 + 1;

#[derive(Copy, Clone)]
pub struct HelpWidget {}

impl HelpWidget {
    pub fn get_rect(self, area: Rect) -> Rect {
        Rect {
            x: (area.width - HELP_WIDTH as u16) / 2,
            y: (area.height - HELP_HEIGHT as u16) / 2,
            width: HELP_WIDTH as u16,
            height: HELP_HEIGHT as u16,
        }
    }
}

impl Widget for HelpWidget {
    fn render(self, mut area: Rect, buf: &mut Buffer) {
        block::new(" Help - <ESC> to go back ").render(area, buf);
        area = add_padding(area, 1, PaddingDirection::All);
        area = add_padding(area, 1, PaddingDirection::Left);

        let layout = Layout::default()
            .direction(Direction::Horizontal)
            .constraints([
                Constraint::Length(LEFT_WIDTH as u16),
                Constraint::Length(2),
                Constraint::Length(RIGHT_WIDTH as u16),
            ])
            .split(area);

        let left_text: Vec<_> = LEFT_TEXT
            .lines()
            .map(|line| {
                Line::from(Span::styled(
                    format!("{}\n", line),
                    style().fg(THEME.text_normal()),
                ))
            })
            .collect();

        let right_text: Vec<_> = RIGHT_TEXT
            .lines()
            .map(|line| {
                Line::from(Span::styled(
                    format!("{}\n", line),
                    style().fg(THEME.text_normal()),
                ))
            })
            .collect();

        Paragraph::new(left_text).render(layout[0], buf);
        Paragraph::new(right_text).render(layout[2], buf);
    }
}