@@ -8,6 +8,7 @@ mod components;
8
8
mod keys;
9
9
mod poll;
10
10
mod queue;
11
+ mod spinner;
11
12
mod strings;
12
13
mod ui;
13
14
mod version;
@@ -28,6 +29,7 @@ use log::error;
28
29
use scopeguard:: defer;
29
30
use scopetime:: scope_time;
30
31
use simplelog:: { Config , LevelFilter , WriteLogger } ;
32
+ use spinner:: Spinner ;
31
33
use std:: {
32
34
env, fs,
33
35
fs:: File ,
@@ -40,6 +42,7 @@ use tui::{
40
42
} ;
41
43
42
44
static TICK_INTERVAL : Duration = Duration :: from_secs ( 5 ) ;
45
+ static SPINNER_INTERVAL : Duration = Duration :: from_millis ( 50 ) ;
43
46
44
47
fn main ( ) -> Result < ( ) > {
45
48
setup_logging ( ) ;
@@ -65,28 +68,44 @@ fn main() -> Result<()> {
65
68
set_panic_handlers ( ) ;
66
69
67
70
let rx_input = poll:: start_polling_thread ( ) ;
68
-
69
71
let ticker = tick ( TICK_INTERVAL ) ;
72
+ let spinner_ticker = tick ( SPINNER_INTERVAL ) ;
70
73
71
74
app. update ( ) ;
72
75
draw ( & mut terminal, & mut app) ?;
73
76
77
+ let mut spinner = Spinner :: default ( ) ;
78
+
74
79
loop {
75
- let events: Vec < QueueEvent > =
76
- select_event ( & rx_input, & rx_git, & ticker) ;
80
+ let events: Vec < QueueEvent > = select_event (
81
+ & rx_input,
82
+ & rx_git,
83
+ & ticker,
84
+ & spinner_ticker,
85
+ ) ;
77
86
78
87
{
79
88
scope_time ! ( "loop" ) ;
80
89
90
+ let mut needs_draw = true ;
91
+
81
92
for e in events {
82
93
match e {
83
94
QueueEvent :: InputEvent ( ev) => app. event ( ev) ,
84
95
QueueEvent :: Tick => app. update ( ) ,
85
96
QueueEvent :: GitEvent ( ev) => app. update_git ( ev) ,
97
+ QueueEvent :: SpinnerUpdate => {
98
+ needs_draw = false ;
99
+ spinner. update ( )
100
+ }
86
101
}
87
102
}
88
103
89
- draw ( & mut terminal, & mut app) ?;
104
+ if needs_draw {
105
+ draw ( & mut terminal, & mut app) ?;
106
+ }
107
+
108
+ spinner. draw ( & mut terminal, app. any_work_pending ( ) ) ?;
90
109
91
110
if app. is_quit ( ) {
92
111
break ;
@@ -112,6 +131,7 @@ fn select_event(
112
131
rx_input : & Receiver < Vec < QueueEvent > > ,
113
132
rx_git : & Receiver < AsyncNotification > ,
114
133
rx_ticker : & Receiver < Instant > ,
134
+ rx_spinner : & Receiver < Instant > ,
115
135
) -> Vec < QueueEvent > {
116
136
let mut events: Vec < QueueEvent > = Vec :: new ( ) ;
117
137
@@ -120,6 +140,7 @@ fn select_event(
120
140
sel. recv ( rx_input) ;
121
141
sel. recv ( rx_git) ;
122
142
sel. recv ( rx_ticker) ;
143
+ sel. recv ( rx_spinner) ;
123
144
124
145
let oper = sel. select ( ) ;
125
146
let index = oper. index ( ) ;
@@ -132,7 +153,10 @@ fn select_event(
132
153
2 => oper
133
154
. recv ( rx_ticker)
134
155
. map ( |_| events. push ( QueueEvent :: Tick ) ) ,
135
- _ => Ok ( ( ) ) ,
156
+ 3 => oper
157
+ . recv ( rx_spinner)
158
+ . map ( |_| events. push ( QueueEvent :: SpinnerUpdate ) ) ,
159
+ _ => panic ! ( "unknown select source" ) ,
136
160
}
137
161
. unwrap ( ) ;
138
162
0 commit comments