heretek 0.6.0

GDB TUI Dashboard for the understanding of vast knowledge
use ratatui::layout::Constraint::Length;
use ratatui::layout::{Alignment, Layout};
use ratatui::prelude::Stylize;
use ratatui::style::Modifier;
use ratatui::text::Span;
use ratatui::widgets::block::Title;
use ratatui::widgets::{Block, Borders, Tabs};
use ratatui::{Frame, layout::Rect, style::Style};

use super::{ASM_COLOR, GRAY_FG, GREEN, HEAP_COLOR, STACK_COLOR, STRING_COLOR, TEXT_COLOR};

use crate::{InputMode, State};

pub fn draw_title_area(state: &mut State, f: &mut Frame, title_area: Rect) {
    let vertical_title = Layout::vertical([Length(1), Length(1)]);
    let [first, second] = vertical_title.areas(title_area);
    f.render_widget(
        Block::new()
            .borders(Borders::TOP)
            .title(
                Title::from(vec![
                    "|".fg(GRAY_FG),
                    env!("CARGO_PKG_NAME").bold(),
                    "-".fg(GRAY_FG),
                    "v".into(),
                    env!("CARGO_PKG_VERSION").into(),
                    "|".fg(GRAY_FG),
                ])
                .alignment(Alignment::Center),
            )
            .title(
                Title::from(vec![
                    Span::raw(" | "),
                    Span::styled(
                        "Heap",
                        Style::default().fg(HEAP_COLOR).add_modifier(Modifier::BOLD),
                    ),
                    Span::raw(" | "),
                    Span::styled(
                        "Stack",
                        Style::default().fg(STACK_COLOR).add_modifier(Modifier::BOLD),
                    ),
                    Span::raw(" | "),
                    Span::styled(
                        "Code",
                        Style::default().fg(TEXT_COLOR).add_modifier(Modifier::BOLD),
                    ),
                    Span::raw(" | "),
                    Span::styled(
                        "String",
                        Style::default().fg(STRING_COLOR).add_modifier(Modifier::BOLD),
                    ),
                    Span::raw(" | "),
                    Span::styled(
                        "Asm",
                        Style::default().fg(ASM_COLOR).add_modifier(Modifier::BOLD),
                    ),
                    Span::raw(" | "),
                ])
                .alignment(Alignment::Right),
            ),
        first,
    );
    // Title Area
    state.status = match state.input_mode {
        InputMode::Normal => "Press q to exit, i to enter input".to_owned(),
        InputMode::Editing => "Press Esc to stop editing, Enter to send input".to_owned(),
    };

    let mode = &state.mode;
    let tab = Tabs::new(vec![
        "F1 Main",
        "F2 Registers",
        "F3 Stack",
        "F4 Instructions",
        "F5 Output",
        "F6 Mapping",
        "F7 Hexdump",
    ])
    .block(Block::new().title_alignment(Alignment::Center))
    .style(Style::default())
    .highlight_style(Style::default().fg(GREEN).add_modifier(Modifier::BOLD))
    .select(*mode as usize)
    .divider("|");

    f.render_widget(tab, second);
}