1
- use std:: io ;
2
- use tui:: { backend:: Backend , buffer :: Cell , Terminal } ;
1
+ use std:: { cell :: Cell , char , io } ;
2
+ use tui:: { backend:: Backend , Terminal } ;
3
3
4
4
// static SPINNER_CHARS: &[char] = &['◢', '◣', '◤', '◥'];
5
5
// static SPINNER_CHARS: &[char] = &['⢹', '⢺', '⢼', '⣸', '⣇', '⡧', '⡗', '⡏'];
6
6
static SPINNER_CHARS : & [ char ] =
7
7
& [ '⣷' , '⣯' , '⣟' , '⡿' , '⢿' , '⣻' , '⣽' , '⣾' ] ;
8
8
9
9
///
10
- #[ derive( Default ) ]
11
10
pub struct Spinner {
12
11
idx : usize ,
13
- pending : bool ,
12
+ active : bool ,
13
+ last_char : Cell < char > ,
14
+ }
15
+
16
+ impl Default for Spinner {
17
+ fn default ( ) -> Self {
18
+ Self {
19
+ idx : 0 ,
20
+ active : false ,
21
+ last_char : Cell :: new ( ' ' ) ,
22
+ }
23
+ }
14
24
}
15
25
16
26
impl Spinner {
@@ -21,8 +31,8 @@ impl Spinner {
21
31
}
22
32
23
33
///
24
- pub fn set_state ( & mut self , pending : bool ) {
25
- self . pending = pending ;
34
+ pub fn set_state ( & mut self , active : bool ) {
35
+ self . active = active ;
26
36
}
27
37
28
38
/// draws or removes spinner char depending on `pending` state
@@ -32,17 +42,22 @@ impl Spinner {
32
42
) -> io:: Result < ( ) > {
33
43
let idx = self . idx ;
34
44
35
- let c: Cell = Cell :: default ( )
36
- . set_char ( if self . pending {
37
- SPINNER_CHARS [ idx]
38
- } else {
39
- ' '
40
- } )
41
- . clone ( ) ;
42
- terminal
43
- . backend_mut ( )
44
- . draw ( vec ! [ ( 0_u16 , 0_u16 , & c) ] . into_iter ( ) ) ?;
45
- tui:: backend:: Backend :: flush ( terminal. backend_mut ( ) ) ?;
45
+ let char_to_draw =
46
+ if self . active { SPINNER_CHARS [ idx] } else { ' ' } ;
47
+
48
+ if self . last_char . get ( ) != char_to_draw {
49
+ self . last_char . set ( char_to_draw) ;
50
+
51
+ let c = tui:: buffer:: Cell :: default ( )
52
+ . set_char ( char_to_draw)
53
+ . clone ( ) ;
54
+
55
+ terminal
56
+ . backend_mut ( )
57
+ . draw ( vec ! [ ( 0_u16 , 0_u16 , & c) ] . into_iter ( ) ) ?;
58
+
59
+ tui:: backend:: Backend :: flush ( terminal. backend_mut ( ) ) ?;
60
+ }
46
61
47
62
Ok ( ( ) )
48
63
}
0 commit comments