@@ -2,7 +2,8 @@ use crate::{
2
2
components:: {
3
3
ChangesComponent , CommandBlocking , CommandInfo ,
4
4
CommitComponent , Component , DiffComponent , DrawableComponent ,
5
- EventUpdate , HelpComponent , MsgComponent , ResetComponent ,
5
+ EventUpdate , HelpComponent , MsgComponent , NeedsUpdate ,
6
+ ResetComponent ,
6
7
} ,
7
8
keys,
8
9
queue:: { InternalEvent , Queue } ,
@@ -160,18 +161,25 @@ impl App {
160
161
pub fn event ( & mut self , ev : Event ) {
161
162
trace ! ( "event: {:?}" , ev) ;
162
163
164
+ let mut flags = NeedsUpdate :: empty ( ) ;
165
+
163
166
if let Some ( e) =
164
167
Self :: event_pump ( ev, self . components_mut ( ) . as_mut_slice ( ) )
165
168
{
166
169
match e {
167
- EventUpdate :: All => self . update ( ) ,
168
- EventUpdate :: Commands => self . update_commands ( ) ,
169
- EventUpdate :: Diff => self . update_diff ( ) ,
170
+ EventUpdate :: All => flags. insert ( NeedsUpdate :: ALL ) ,
171
+ EventUpdate :: Commands => {
172
+ flags. insert ( NeedsUpdate :: COMMANDS )
173
+ }
174
+ EventUpdate :: Diff => flags. insert ( NeedsUpdate :: DIFF ) ,
170
175
_ => ( ) ,
171
176
}
172
177
} else if let Event :: Key ( k) = ev {
173
- match k {
174
- keys:: EXIT_1 | keys:: EXIT_2 => self . do_quit = true ,
178
+ let new_flags = match k {
179
+ keys:: EXIT_1 | keys:: EXIT_2 => {
180
+ self . do_quit = true ;
181
+ NeedsUpdate :: empty ( )
182
+ }
175
183
keys:: FOCUS_WORKDIR => {
176
184
self . switch_focus ( Focus :: WorkDir )
177
185
}
@@ -183,11 +191,24 @@ impl App {
183
191
DiffTarget :: WorkingDir => Focus :: WorkDir ,
184
192
} )
185
193
}
186
- _ => ( ) ,
194
+ _ => NeedsUpdate :: empty ( ) ,
187
195
} ;
196
+
197
+ flags. insert ( new_flags) ;
188
198
}
189
199
190
- self . process_queue ( ) ;
200
+ let new_flags = self . process_queue ( ) ;
201
+ flags. insert ( new_flags) ;
202
+
203
+ if flags. contains ( NeedsUpdate :: ALL ) {
204
+ self . update ( ) ;
205
+ } else {
206
+ if flags. contains ( NeedsUpdate :: DIFF ) {
207
+ self . update_diff ( ) ;
208
+ } else if flags. contains ( NeedsUpdate :: COMMANDS ) {
209
+ self . update_commands ( ) ;
210
+ }
211
+ }
191
212
}
192
213
193
214
///
@@ -268,45 +289,54 @@ impl App {
268
289
self . update_commands ( ) ;
269
290
}
270
291
271
- fn process_queue ( & mut self ) {
292
+ fn process_queue ( & mut self ) -> NeedsUpdate {
293
+ let mut flags = NeedsUpdate :: empty ( ) ;
272
294
loop {
273
295
let front = self . queue . borrow_mut ( ) . pop_front ( ) ;
274
296
if let Some ( e) = front {
275
- self . process_internal_event ( & e) ;
297
+ flags . insert ( self . process_internal_event ( & e) ) ;
276
298
} else {
277
299
break ;
278
300
}
279
301
}
280
302
self . queue . borrow_mut ( ) . clear ( ) ;
303
+
304
+ flags
281
305
}
282
306
283
- fn process_internal_event ( & mut self , ev : & InternalEvent ) {
307
+ fn process_internal_event (
308
+ & mut self ,
309
+ ev : & InternalEvent ,
310
+ ) -> NeedsUpdate {
311
+ let mut flags = NeedsUpdate :: empty ( ) ;
284
312
match ev {
285
313
InternalEvent :: ResetFile ( p) => {
286
314
if sync:: reset_workdir ( CWD , Path :: new ( p. as_str ( ) ) ) {
287
- self . update ( ) ;
315
+ flags . insert ( NeedsUpdate :: ALL ) ;
288
316
}
289
317
}
290
318
InternalEvent :: ConfirmResetFile ( p) => {
291
319
self . reset . open_for_path ( p) ;
292
- self . update_commands ( ) ;
320
+ flags . insert ( NeedsUpdate :: COMMANDS ) ;
293
321
}
294
322
InternalEvent :: AddHunk ( hash) => {
295
323
if let Some ( ( path, is_stage) ) = self . selected_path ( ) {
296
324
if is_stage {
297
325
if sync:: unstage_hunk ( CWD , path, * hash) {
298
- self . update ( ) ;
326
+ flags . insert ( NeedsUpdate :: ALL ) ;
299
327
}
300
328
} else if sync:: stage_hunk ( CWD , path, * hash) {
301
- self . update ( ) ;
329
+ flags . insert ( NeedsUpdate :: ALL ) ;
302
330
}
303
331
}
304
332
}
305
333
InternalEvent :: ShowMsg ( msg) => {
306
334
self . msg . show_msg ( msg) ;
307
- self . update ( ) ;
335
+ flags . insert ( NeedsUpdate :: ALL ) ;
308
336
}
309
337
} ;
338
+
339
+ flags
310
340
}
311
341
312
342
fn commands ( & self , force_all : bool ) -> Vec < CommandInfo > {
@@ -466,7 +496,7 @@ impl App {
466
496
. render ( f, r) ;
467
497
}
468
498
469
- fn switch_focus ( & mut self , f : Focus ) {
499
+ fn switch_focus ( & mut self , f : Focus ) -> NeedsUpdate {
470
500
if self . focus != f {
471
501
self . focus = f;
472
502
@@ -487,8 +517,9 @@ impl App {
487
517
}
488
518
} ;
489
519
490
- self . update_diff ( ) ;
491
- self . update_commands ( ) ;
520
+ NeedsUpdate :: DIFF | NeedsUpdate :: COMMANDS
521
+ } else {
522
+ NeedsUpdate :: empty ( )
492
523
}
493
524
}
494
525
0 commit comments