@@ -42,6 +42,7 @@ pub struct ConfigViewState {
4242 pub load_error : Option < String > ,
4343 pub object_search : String ,
4444 pub filter_diffable : bool ,
45+ pub filter_incomplete : bool ,
4546 #[ cfg( windows) ]
4647 pub available_wsl_distros : Option < Vec < String > > ,
4748}
@@ -277,6 +278,13 @@ pub fn config_ui(
277278 {
278279 state. filter_diffable = !state. filter_diffable ;
279280 }
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+ }
280288 } ) ;
281289 if state. object_search . is_empty ( ) {
282290 if had_search {
@@ -296,12 +304,19 @@ pub fn config_ui(
296304 . default_open ( true )
297305 . show ( ui, |ui| {
298306 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 {
300308 let search = state. object_search . to_ascii_lowercase ( ) ;
301309 nodes = Cow :: Owned (
302310 object_nodes
303311 . 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+ } )
305320 . collect ( ) ,
306321 ) ;
307322 }
@@ -435,26 +450,30 @@ fn filter_node(
435450 node : & ProjectObjectNode ,
436451 search : & str ,
437452 filter_diffable : bool ,
453+ filter_incomplete : bool ,
438454) -> Option < ProjectObjectNode > {
439455 match node {
440456 ProjectObjectNode :: File ( name, object) => {
441457 if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) )
442458 && ( !filter_diffable
443459 || ( object. base_path . is_some ( ) && object. target_path . is_some ( ) ) )
460+ && ( !filter_incomplete || matches ! ( object. complete, None | Some ( false ) ) )
444461 {
445462 Some ( node. clone ( ) )
446463 } else {
447464 None
448465 }
449466 }
450467 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
452471 {
453472 return Some ( node. clone ( ) ) ;
454473 }
455474 let new_children = children
456475 . iter ( )
457- . filter_map ( |child| filter_node ( child, search, filter_diffable) )
476+ . filter_map ( |child| filter_node ( child, search, filter_diffable, filter_incomplete ) )
458477 . collect :: < Vec < _ > > ( ) ;
459478 if !new_children. is_empty ( ) {
460479 Some ( ProjectObjectNode :: Dir ( name. clone ( ) , new_children) )
0 commit comments