-
-
Notifications
You must be signed in to change notification settings - Fork 608
/
Copy pathspinner.rs
67 lines (55 loc) · 1.33 KB
/
spinner.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use ratatui::{
backend::{Backend, CrosstermBackend},
Terminal,
};
use std::{cell::Cell, char, io};
// static SPINNER_CHARS: &[char] = &['◢', '◣', '◤', '◥'];
// static SPINNER_CHARS: &[char] = &['⢹', '⢺', '⢼', '⣸', '⣇', '⡧', '⡗', '⡏'];
static SPINNER_CHARS: &[char] =
&['⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽', '⣾'];
///
pub struct Spinner {
idx: usize,
active: bool,
last_char: Cell<char>,
}
impl Default for Spinner {
fn default() -> Self {
Self {
idx: 0,
active: false,
last_char: Cell::new(' '),
}
}
}
impl Spinner {
/// increment spinner graphic by one
pub fn update(&mut self) {
self.idx += 1;
self.idx %= SPINNER_CHARS.len();
}
///
pub fn set_state(&mut self, active: bool) {
self.active = active;
}
/// draws or removes spinner char depending on `pending` state
pub fn draw(
&self,
terminal: &mut Terminal<CrosstermBackend<io::Stdout>>,
) -> io::Result<()> {
let idx = self.idx;
let char_to_draw =
if self.active { SPINNER_CHARS[idx] } else { ' ' };
if self.last_char.get() != char_to_draw {
self.last_char.set(char_to_draw);
let c = ratatui::buffer::Cell::default()
.set_char(char_to_draw)
.clone();
terminal
.backend_mut()
.draw(vec![(0_u16, 0_u16, &c)].into_iter())?;
Backend::flush(terminal.backend_mut())?;
}
Ok(())
}
}