11#[ cfg( all( windows, feature = "wsl" ) ) ]
22use std:: string:: FromUtf16Error ;
33use std:: {
4- borrow:: Cow ,
54 mem:: take,
65 path:: { PathBuf , MAIN_SEPARATOR } ,
76} ;
@@ -50,6 +49,7 @@ pub struct ConfigViewState {
5049 pub object_search : String ,
5150 pub filter_diffable : bool ,
5251 pub filter_incomplete : bool ,
52+ pub show_hidden : bool ,
5353 #[ cfg( all( windows, feature = "wsl" ) ) ]
5454 pub available_wsl_distros : Option < Vec < String > > ,
5555 pub file_dialog_state : FileDialogState ,
@@ -283,20 +283,18 @@ pub fn config_ui(
283283 root_open = Some ( true ) ;
284284 node_open = NodeOpen :: Object ;
285285 }
286- if ui
287- . selectable_label ( state. filter_diffable , "Diffable" )
288- . on_hover_text_at_pointer ( "Only show objects with a source file" )
289- . clicked ( )
290- {
291- state. filter_diffable = !state. filter_diffable ;
292- }
293- if ui
294- . selectable_label ( state. filter_incomplete , "Incomplete" )
295- . on_hover_text_at_pointer ( "Only show objects not marked complete" )
296- . clicked ( )
297- {
298- state. filter_incomplete = !state. filter_incomplete ;
286+ let mut filters_text = RichText :: new ( "Filter ⏷" ) ;
287+ if state. filter_diffable || state. filter_incomplete || state. show_hidden {
288+ filters_text = filters_text. color ( appearance. replace_color ) ;
299289 }
290+ egui:: menu:: menu_button ( ui, filters_text, |ui| {
291+ ui. checkbox ( & mut state. filter_diffable , "Diffable" )
292+ . on_hover_text_at_pointer ( "Only show objects with a source file" ) ;
293+ ui. checkbox ( & mut state. filter_incomplete , "Incomplete" )
294+ . on_hover_text_at_pointer ( "Only show objects not marked complete" ) ;
295+ ui. checkbox ( & mut state. show_hidden , "Hidden" )
296+ . on_hover_text_at_pointer ( "Show hidden (auto-generated) objects" ) ;
297+ } ) ;
300298 } ) ;
301299 if state. object_search . is_empty ( ) {
302300 if had_search {
@@ -315,27 +313,18 @@ pub fn config_ui(
315313 . open ( root_open)
316314 . default_open ( true )
317315 . show ( ui, |ui| {
318- let mut nodes = Cow :: Borrowed ( object_nodes) ;
319- if !state. object_search . is_empty ( ) || state. filter_diffable || state. filter_incomplete {
320- let search = state. object_search . to_ascii_lowercase ( ) ;
321- nodes = Cow :: Owned (
322- object_nodes
323- . iter ( )
324- . filter_map ( |node| {
325- filter_node (
326- node,
327- & search,
328- state. filter_diffable ,
329- state. filter_incomplete ,
330- )
331- } )
332- . collect ( ) ,
333- ) ;
334- }
335-
316+ let search = state. object_search . to_ascii_lowercase ( ) ;
336317 ui. style_mut ( ) . wrap = Some ( false ) ;
337- for node in nodes. iter ( ) {
338- display_node ( ui, & mut new_selected_obj, node, appearance, node_open) ;
318+ for node in object_nodes. iter ( ) . filter_map ( |node| {
319+ filter_node (
320+ node,
321+ & search,
322+ state. filter_diffable ,
323+ state. filter_incomplete ,
324+ state. show_hidden ,
325+ )
326+ } ) {
327+ display_node ( ui, & mut new_selected_obj, & node, appearance, node_open) ;
339328 }
340329 } ) ;
341330 }
@@ -464,29 +453,27 @@ fn filter_node(
464453 search : & str ,
465454 filter_diffable : bool ,
466455 filter_incomplete : bool ,
456+ show_hidden : bool ,
467457) -> Option < ProjectObjectNode > {
468458 match node {
469459 ProjectObjectNode :: File ( name, object) => {
470460 if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) )
471461 && ( !filter_diffable
472462 || ( object. base_path . is_some ( ) && object. target_path . is_some ( ) ) )
473463 && ( !filter_incomplete || matches ! ( object. complete( ) , None | Some ( false ) ) )
464+ && ( show_hidden || !object. hidden ( ) )
474465 {
475466 Some ( node. clone ( ) )
476467 } else {
477468 None
478469 }
479470 }
480471 ProjectObjectNode :: Dir ( name, children) => {
481- if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) )
482- && !filter_diffable
483- && !filter_incomplete
484- {
485- return Some ( node. clone ( ) ) ;
486- }
487472 let new_children = children
488473 . iter ( )
489- . filter_map ( |child| filter_node ( child, search, filter_diffable, filter_incomplete) )
474+ . filter_map ( |child| {
475+ filter_node ( child, search, filter_diffable, filter_incomplete, show_hidden)
476+ } )
490477 . collect :: < Vec < _ > > ( ) ;
491478 if !new_children. is_empty ( ) {
492479 Some ( ProjectObjectNode :: Dir ( name. clone ( ) , new_children) )
0 commit comments