framework_tool_tui/tui/component/
privacy_panel.rs1use 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 self.render_mic(frame, mic_key_area, mic_value_area, theme, info);
82
83 self.render_camera(frame, camera_key_area, camera_value_area, theme, info);
85
86 frame.render_widget(keys_block, keys_area);
88 frame.render_widget(values_block, values_area);
89
90 frame.render_widget(block, area);
91 }
92}