Skip to main content

stynx_code_tui/widgets/
spinner.rs

1use ratatui::{
2    buffer::Buffer,
3    layout::Rect,
4    style::{Modifier, Style},
5    text::{Line, Span},
6    widgets::{Paragraph, Widget},
7};
8
9use crate::theme;
10
11pub const FRAMES: [char; 10] = [
12    '\u{280B}', '\u{2819}', '\u{2839}', '\u{2838}',
13    '\u{283C}', '\u{2834}', '\u{2826}', '\u{2827}',
14    '\u{2807}', '\u{280F}',
15];
16
17pub struct Spinner {
18    pub frame: usize,
19}
20
21impl Spinner {
22    pub fn new(frame: usize) -> Self { Self { frame } }
23    pub fn current_char(&self) -> char { FRAMES[self.frame % FRAMES.len()] }
24}
25
26impl Widget for Spinner {
27    fn render(self, area: Rect, buf: &mut Buffer) {
28        let line = Line::from(Span::styled(
29            format!(" {}", self.current_char()),
30            Style::default().fg(theme::IRIS()).add_modifier(Modifier::BOLD),
31        ));
32        Paragraph::new(line).render(area, buf);
33    }
34}