television_screen/
help.rs

1use super::layout::HelpBarLayout;
2use crate::colors::{Colorscheme, GeneralColorscheme};
3use crate::logo::build_logo_paragraph;
4use crate::metadata::build_metadata_table;
5use crate::mode::{mode_color, Mode};
6use ratatui::layout::Rect;
7use ratatui::prelude::{Color, Style};
8use ratatui::widgets::{Block, BorderType, Borders, Padding, Table};
9use ratatui::Frame;
10use television_channels::channels::UnitChannel;
11use television_utils::metadata::AppMetadata;
12
13pub fn draw_logo_block(
14    f: &mut Frame,
15    area: Rect,
16    mode_color: Color,
17    general_colorscheme: &GeneralColorscheme,
18) {
19    let logo_block = Block::default()
20        .borders(Borders::ALL)
21        .border_type(BorderType::Rounded)
22        .border_style(Style::default().fg(general_colorscheme.border_fg))
23        .style(
24            Style::default()
25                .fg(mode_color)
26                .bg(general_colorscheme.background.unwrap_or_default()),
27        )
28        .padding(Padding::horizontal(1));
29
30    let logo_paragraph = build_logo_paragraph().block(logo_block);
31
32    f.render_widget(logo_paragraph, area);
33}
34
35fn draw_metadata_block(
36    f: &mut Frame,
37    area: Rect,
38    mode: Mode,
39    current_channel: UnitChannel,
40    app_metadata: &AppMetadata,
41    colorscheme: &Colorscheme,
42) {
43    let metadata_block = Block::default()
44        .borders(Borders::ALL)
45        .border_type(BorderType::Rounded)
46        .border_style(Style::default().fg(colorscheme.general.border_fg))
47        .padding(Padding::horizontal(1))
48        .style(
49            Style::default()
50                .bg(colorscheme.general.background.unwrap_or_default()),
51        );
52
53    let metadata_table =
54        build_metadata_table(mode, current_channel, app_metadata, colorscheme)
55            .block(metadata_block);
56
57    f.render_widget(metadata_table, area);
58}
59
60fn draw_keymaps_block(
61    f: &mut Frame,
62    area: Rect,
63    keymap_table: Table,
64    colorscheme: &GeneralColorscheme,
65) {
66    let keymaps_block = Block::default()
67        .borders(Borders::ALL)
68        .border_type(BorderType::Rounded)
69        .border_style(Style::default().fg(colorscheme.border_fg))
70        .style(Style::default().bg(colorscheme.background.unwrap_or_default()))
71        .padding(Padding::horizontal(1));
72
73    let table = keymap_table.block(keymaps_block);
74
75    f.render_widget(table, area);
76}
77
78pub fn draw_help_bar(
79    f: &mut Frame,
80    layout: &Option<HelpBarLayout>,
81    current_channel: UnitChannel,
82    keymap_table: Table,
83    mode: Mode,
84    app_metadata: &AppMetadata,
85    colorscheme: &Colorscheme,
86) {
87    if let Some(help_bar) = layout {
88        draw_metadata_block(
89            f,
90            help_bar.left,
91            mode,
92            current_channel,
93            app_metadata,
94            colorscheme,
95        );
96        draw_keymaps_block(
97            f,
98            help_bar.middle,
99            keymap_table,
100            &colorscheme.general,
101        );
102        draw_logo_block(
103            f,
104            help_bar.right,
105            mode_color(mode, &colorscheme.mode),
106            &colorscheme.general,
107        );
108    }
109}