1
1
#[ cfg( all( windows, feature = "wsl" ) ) ]
2
2
use std:: string:: FromUtf16Error ;
3
3
use std:: {
4
- borrow:: Cow ,
5
4
mem:: take,
6
5
path:: { PathBuf , MAIN_SEPARATOR } ,
7
6
} ;
@@ -50,6 +49,7 @@ pub struct ConfigViewState {
50
49
pub object_search : String ,
51
50
pub filter_diffable : bool ,
52
51
pub filter_incomplete : bool ,
52
+ pub show_hidden : bool ,
53
53
#[ cfg( all( windows, feature = "wsl" ) ) ]
54
54
pub available_wsl_distros : Option < Vec < String > > ,
55
55
pub file_dialog_state : FileDialogState ,
@@ -283,20 +283,18 @@ pub fn config_ui(
283
283
root_open = Some ( true ) ;
284
284
node_open = NodeOpen :: Object ;
285
285
}
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 ) ;
299
289
}
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
+ } ) ;
300
298
} ) ;
301
299
if state. object_search . is_empty ( ) {
302
300
if had_search {
@@ -315,27 +313,18 @@ pub fn config_ui(
315
313
. open ( root_open)
316
314
. default_open ( true )
317
315
. 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 ( ) ;
336
317
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) ;
339
328
}
340
329
} ) ;
341
330
}
@@ -464,29 +453,27 @@ fn filter_node(
464
453
search : & str ,
465
454
filter_diffable : bool ,
466
455
filter_incomplete : bool ,
456
+ show_hidden : bool ,
467
457
) -> Option < ProjectObjectNode > {
468
458
match node {
469
459
ProjectObjectNode :: File ( name, object) => {
470
460
if ( search. is_empty ( ) || name. to_ascii_lowercase ( ) . contains ( search) )
471
461
&& ( !filter_diffable
472
462
|| ( object. base_path . is_some ( ) && object. target_path . is_some ( ) ) )
473
463
&& ( !filter_incomplete || matches ! ( object. complete( ) , None | Some ( false ) ) )
464
+ && ( show_hidden || !object. hidden ( ) )
474
465
{
475
466
Some ( node. clone ( ) )
476
467
} else {
477
468
None
478
469
}
479
470
}
480
471
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
- }
487
472
let new_children = children
488
473
. 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
+ } )
490
477
. collect :: < Vec < _ > > ( ) ;
491
478
if !new_children. is_empty ( ) {
492
479
Some ( ProjectObjectNode :: Dir ( name. clone ( ) , new_children) )
0 commit comments