stynx_code_tui/widgets/
delegate_bar.rs1use ratatui::{
2 buffer::Buffer,
3 layout::Rect,
4 style::{Modifier, Style},
5 text::{Line, Span},
6 widgets::{Paragraph, Widget},
7};
8
9use crate::theme;
10use crate::widgets::spinner::FRAMES;
11
12pub struct DelegateBar<'a> {
13 pub agents: &'a [(String, String)],
14 pub spinner_frame: usize,
15}
16
17impl<'a> DelegateBar<'a> {
18 pub fn new(agents: &'a [(String, String)], spinner_frame: usize) -> Self {
19 Self { agents, spinner_frame }
20 }
21}
22
23impl<'a> Widget for DelegateBar<'a> {
24 fn render(self, area: Rect, buf: &mut Buffer) {
25 if self.agents.is_empty() { return; }
26 let pad = if area.width >= 80 { " " } else { " " };
27 let spinner = FRAMES.get(self.spinner_frame % FRAMES.len()).copied().unwrap_or('ยท');
28 let lines: Vec<Line<'static>> = self.agents.iter().take(area.height as usize).map(|(label, summary)| {
29 Line::from(vec![
30 Span::styled(format!("{pad}{spinner} "), Style::default().fg(theme::IRIS()).add_modifier(Modifier::BOLD)),
31 Span::styled(format!("{label}"), Style::default().fg(theme::FOAM()).add_modifier(Modifier::BOLD)),
32 Span::styled(" ", Style::default()),
33 Span::styled(summary.clone(), Style::default().fg(theme::SUBTLE())),
34 ])
35 }).collect();
36 Paragraph::new(lines).render(area, buf);
37 }
38}