Skip to main content

framework_tool_tui/tui/component/
privacy_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 PrivacyPanelComponent;
14
15impl PrivacyPanelComponent {
16    fn render_mic(
17        &self,
18        frame: &mut Frame,
19        key_area: Rect,
20        value_area: Rect,
21        theme: &Theme,
22        info: &FrameworkInfo,
23    ) {
24        let toggle = if info.is_microphone_enabled {
25            Paragraph::new("ON").style(Style::default().fg(theme.indication_ok))
26        } else {
27            Paragraph::new("OFF").style(Style::default().fg(theme.indication_warning))
28        };
29
30        frame.render_widget(Paragraph::new("Microphone"), key_area);
31        frame.render_widget(toggle, value_area);
32    }
33
34    fn render_camera(
35        &self,
36        frame: &mut Frame,
37        key_area: Rect,
38        value_area: Rect,
39        theme: &Theme,
40        info: &FrameworkInfo,
41    ) {
42        let toggle = if info.is_camera_enabled {
43            Paragraph::new("ON").style(Style::default().fg(theme.indication_ok))
44        } else {
45            Paragraph::new("OFF").style(Style::default().fg(theme.indication_warning))
46        };
47
48        frame.render_widget(Paragraph::new("Camera"), key_area);
49        frame.render_widget(toggle, value_area);
50    }
51}
52
53impl Component for PrivacyPanelComponent {
54    fn render(&mut self, frame: &mut Frame, area: Rect, theme: &Theme, info: &FrameworkInfo) {
55        let block = Block::default()
56            .title(" Privacy ")
57            .borders(Borders::ALL)
58            .border_style(Style::default().fg(theme.border))
59            .border_type(BorderType::Rounded);
60
61        let [keys_area, values_area] =
62            Layout::horizontal([Constraint::Fill(1), Constraint::Fill(1)])
63                .horizontal_margin(2)
64                .spacing(1)
65                .vertical_margin(1)
66                .areas(block.inner(area));
67
68        let keys_block = Block::default().borders(Borders::NONE);
69        let values_block = Block::default().borders(Borders::NONE);
70
71        let [mic_key_area, camera_key_area] =
72            Layout::vertical([Constraint::Length(1), Constraint::Length(1)])
73                .spacing(1)
74                .areas(keys_block.inner(keys_area));
75        let [mic_value_area, camera_value_area] =
76            Layout::vertical([Constraint::Length(1), Constraint::Length(1)])
77                .spacing(1)
78                .areas(values_block.inner(values_area));
79
80        // Micrhophone
81        self.render_mic(frame, mic_key_area, mic_value_area, theme, info);
82
83        // Camera
84        self.render_camera(frame, camera_key_area, camera_value_area, theme, info);
85
86        // Render blocks
87        frame.render_widget(keys_block, keys_area);
88        frame.render_widget(values_block, values_area);
89
90        frame.render_widget(block, area);
91    }
92}