@@ -42,6 +42,7 @@ pub struct ConfigViewState {
42
42
pub load_error : Option < String > ,
43
43
pub object_search : String ,
44
44
pub filter_diffable : bool ,
45
+ pub filter_incomplete : bool ,
45
46
#[ cfg( windows) ]
46
47
pub available_wsl_distros : Option < Vec < String > > ,
47
48
}
@@ -277,6 +278,13 @@ pub fn config_ui(
277
278
{
278
279
state. filter_diffable = !state. filter_diffable ;
279
280
}
281
+ if ui
282
+ . selectable_label ( state. filter_incomplete , "Incomplete" )
283
+ . on_hover_text_at_pointer ( "Only show objects not marked complete" )
284
+ . clicked ( )
285
+ {
286
+ state. filter_incomplete = !state. filter_incomplete ;
287
+ }
280
288
} ) ;
281
289
if state. object_search . is_empty ( ) {
282
290
if had_search {
@@ -296,12 +304,19 @@ pub fn config_ui(
296
304
. default_open ( true )
297
305
. show ( ui, |ui| {
298
306
let mut nodes = Cow :: Borrowed ( object_nodes) ;
299
- if !state. object_search . is_empty ( ) || state. filter_diffable {
307
+ if !state. object_search . is_empty ( ) || state. filter_diffable || state . filter_incomplete {
300
308
let search = state. object_search . to_ascii_lowercase ( ) ;
301
309
nodes = Cow :: Owned (
302
310
object_nodes
303
311
. iter ( )
304
- . filter_map ( |node| filter_node ( node, & search, state. filter_diffable ) )
312
+ . filter_map ( |node| {
313
+ filter_node (
314
+ node,
315
+ & search,
316
+ state. filter_diffable ,
317
+ state. filter_incomplete ,
318
+ )
319
+ } )
305
320
. collect ( ) ,
306
321
) ;
307
322
}
@@ -435,26 +450,30 @@ fn filter_node(
435
450
node : & ProjectObjectNode ,
436
451
search : & str ,
437
452
filter_diffable : bool ,
453
+ filter_incomplete : bool ,
438
454
) -> Option < ProjectObjectNode > {
439
455
match node {
440
456
ProjectObjectNode :: File ( name, object) => {
441
457
if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) )
442
458
&& ( !filter_diffable
443
459
|| ( object. base_path . is_some ( ) && object. target_path . is_some ( ) ) )
460
+ && ( !filter_incomplete || matches ! ( object. complete, None | Some ( false ) ) )
444
461
{
445
462
Some ( node. clone ( ) )
446
463
} else {
447
464
None
448
465
}
449
466
}
450
467
ProjectObjectNode :: Dir ( name, children) => {
451
- if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) ) && !filter_diffable
468
+ if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) )
469
+ && !filter_diffable
470
+ && !filter_incomplete
452
471
{
453
472
return Some ( node. clone ( ) ) ;
454
473
}
455
474
let new_children = children
456
475
. iter ( )
457
- . filter_map ( |child| filter_node ( child, search, filter_diffable) )
476
+ . filter_map ( |child| filter_node ( child, search, filter_diffable, filter_incomplete ) )
458
477
. collect :: < Vec < _ > > ( ) ;
459
478
if !new_children. is_empty ( ) {
460
479
Some ( ProjectObjectNode :: Dir ( name. clone ( ) , new_children) )
0 commit comments