Skip to main content

framework_tool_tui/tui/component/
smbios_panel.rs

1use ratatui::{
2    layout::{Constraint, Layout, Rect},
3    style::Style,
4    widgets::{Block, BorderType, Borders, Paragraph},
5    Frame,
6};
7
8use crate::{
9    framework::info::FrameworkInfo,
10    tui::{component::Component, theme::Theme},
11};
12
13pub struct SmbiosPanelComponent;
14
15impl SmbiosPanelComponent {
16    fn render_smbios_version(
17        &self,
18        frame: &mut Frame,
19        key_area: Rect,
20        value_area: Rect,
21        theme: &Theme,
22        info: &FrameworkInfo,
23    ) {
24        let smbios_version_text = match &info.smbios_version {
25            Some(smbios_version) => smbios_version,
26            None => "N/A",
27        };
28
29        frame.render_widget(Paragraph::new("Version"), key_area);
30        frame.render_widget(
31            Paragraph::new(smbios_version_text).style(Style::default().fg(theme.informative_text)),
32            value_area,
33        );
34    }
35
36    fn render_smbios_release_date(
37        &self,
38        frame: &mut Frame,
39        key_area: Rect,
40        value_area: Rect,
41        theme: &Theme,
42        info: &FrameworkInfo,
43    ) {
44        let smbios_release_date_text = match &info.smbios_release_date {
45            Some(smbios_release_date) => smbios_release_date,
46            None => "N/A",
47        };
48
49        frame.render_widget(Paragraph::new("Release date"), key_area);
50        frame.render_widget(
51            Paragraph::new(smbios_release_date_text)
52                .style(Style::default().fg(theme.informative_text)),
53            value_area,
54        );
55    }
56
57    fn render_smbios_vendor(
58        &self,
59        frame: &mut Frame,
60        key_area: Rect,
61        value_area: Rect,
62        theme: &Theme,
63        info: &FrameworkInfo,
64    ) {
65        let smbios_vendor_text = match &info.smbios_vendor {
66            Some(smbios_vendor) => smbios_vendor,
67            None => "N/A",
68        };
69
70        frame.render_widget(Paragraph::new("Vendor"), key_area);
71        frame.render_widget(
72            Paragraph::new(smbios_vendor_text).style(Style::default().fg(theme.informative_text)),
73            value_area,
74        );
75    }
76}
77
78impl Component for SmbiosPanelComponent {
79    fn render(&mut self, frame: &mut Frame, area: Rect, theme: &Theme, info: &FrameworkInfo) {
80        let block = Block::default()
81            .title(" BIOS ")
82            .borders(Borders::ALL)
83            .border_style(Style::default().fg(theme.border))
84            .border_type(BorderType::Rounded);
85
86        let [keys_area, values_area] =
87            Layout::horizontal([Constraint::Fill(1), Constraint::Fill(1)])
88                .horizontal_margin(2)
89                .spacing(1)
90                .vertical_margin(1)
91                .areas(block.inner(area));
92
93        let keys_block = Block::default().borders(Borders::NONE);
94        let values_block = Block::default().borders(Borders::NONE);
95
96        let [smbios_vendor_key_area, smbios_version_key_area, smbios_release_date_key_area] =
97            Layout::vertical([
98                Constraint::Length(1),
99                Constraint::Length(1),
100                Constraint::Length(1),
101            ])
102            .areas(keys_block.inner(keys_area));
103        let [smbios_vendor_value_area, smbios_version_value_area, smbios_release_date_value_area] =
104            Layout::vertical([
105                Constraint::Length(1),
106                Constraint::Length(1),
107                Constraint::Length(1),
108            ])
109            .areas(values_block.inner(values_area));
110
111        // Vendor
112        self.render_smbios_vendor(
113            frame,
114            smbios_vendor_key_area,
115            smbios_vendor_value_area,
116            theme,
117            info,
118        );
119
120        // Version
121        self.render_smbios_version(
122            frame,
123            smbios_version_key_area,
124            smbios_version_value_area,
125            theme,
126            info,
127        );
128
129        // Release date
130        self.render_smbios_release_date(
131            frame,
132            smbios_release_date_key_area,
133            smbios_release_date_value_area,
134            theme,
135            info,
136        );
137
138        // Render blocks
139        frame.render_widget(keys_block, keys_area);
140        frame.render_widget(values_block, values_area);
141
142        frame.render_widget(block, area);
143    }
144}