@@ -8,6 +8,7 @@ mod components;
88mod keys;
99mod poll;
1010mod queue;
11+ mod spinner;
1112mod strings;
1213mod ui;
1314mod version;
@@ -28,6 +29,7 @@ use log::error;
2829use scopeguard:: defer;
2930use scopetime:: scope_time;
3031use simplelog:: { Config , LevelFilter , WriteLogger } ;
32+ use spinner:: Spinner ;
3133use std:: {
3234 env, fs,
3335 fs:: File ,
@@ -40,6 +42,7 @@ use tui::{
4042} ;
4143
4244static TICK_INTERVAL : Duration = Duration :: from_secs ( 5 ) ;
45+ static SPINNER_INTERVAL : Duration = Duration :: from_millis ( 50 ) ;
4346
4447fn main ( ) -> Result < ( ) > {
4548 setup_logging ( ) ;
@@ -65,28 +68,44 @@ fn main() -> Result<()> {
6568 set_panic_handlers ( ) ;
6669
6770 let rx_input = poll:: start_polling_thread ( ) ;
68-
6971 let ticker = tick ( TICK_INTERVAL ) ;
72+ let spinner_ticker = tick ( SPINNER_INTERVAL ) ;
7073
7174 app. update ( ) ;
7275 draw ( & mut terminal, & mut app) ?;
7376
77+ let mut spinner = Spinner :: default ( ) ;
78+
7479 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+ ) ;
7786
7887 {
7988 scope_time ! ( "loop" ) ;
8089
90+ let mut needs_draw = true ;
91+
8192 for e in events {
8293 match e {
8394 QueueEvent :: InputEvent ( ev) => app. event ( ev) ,
8495 QueueEvent :: Tick => app. update ( ) ,
8596 QueueEvent :: GitEvent ( ev) => app. update_git ( ev) ,
97+ QueueEvent :: SpinnerUpdate => {
98+ needs_draw = false ;
99+ spinner. update ( )
100+ }
86101 }
87102 }
88103
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 ( ) ) ?;
90109
91110 if app. is_quit ( ) {
92111 break ;
@@ -112,6 +131,7 @@ fn select_event(
112131 rx_input : & Receiver < Vec < QueueEvent > > ,
113132 rx_git : & Receiver < AsyncNotification > ,
114133 rx_ticker : & Receiver < Instant > ,
134+ rx_spinner : & Receiver < Instant > ,
115135) -> Vec < QueueEvent > {
116136 let mut events: Vec < QueueEvent > = Vec :: new ( ) ;
117137
@@ -120,6 +140,7 @@ fn select_event(
120140 sel. recv ( rx_input) ;
121141 sel. recv ( rx_git) ;
122142 sel. recv ( rx_ticker) ;
143+ sel. recv ( rx_spinner) ;
123144
124145 let oper = sel. select ( ) ;
125146 let index = oper. index ( ) ;
@@ -132,7 +153,10 @@ fn select_event(
132153 2 => oper
133154 . recv ( rx_ticker)
134155 . 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" ) ,
136160 }
137161 . unwrap ( ) ;
138162
0 commit comments