@@ -373,7 +373,28 @@ pub struct Daemon {
373
373
#[ derive( Clone , Debug , Deserialize , Serialize ) ]
374
374
pub struct Search {
375
375
/// The list of enabled filter modes, in order of priority.
376
- pub filters : Vec < FilterMode > ,
376
+ pub filters : EnabledFilterModes ,
377
+ }
378
+
379
+ #[ derive( Clone , Debug , Deserialize , Serialize ) ]
380
+ pub struct EnabledFilterModes ( Vec < FilterMode > ) ;
381
+
382
+ impl EnabledFilterModes {
383
+ pub fn specified ( & self ) -> & [ FilterMode ] {
384
+ & self . 0
385
+ }
386
+
387
+ pub fn resolved ( & self , legacy_workspaces : bool ) -> & [ FilterMode ] {
388
+ if self . 0 . len ( ) == 0 {
389
+ if legacy_workspaces {
390
+ DEFAULT_LEGACY_WORKSPACE_FILTER_MODES
391
+ } else {
392
+ DEFAULT_FILTER_MODES
393
+ }
394
+ } else {
395
+ & self . 0
396
+ }
397
+ }
377
398
}
378
399
379
400
impl Default for Preview {
@@ -409,17 +430,33 @@ impl Default for Daemon {
409
430
impl Default for Search {
410
431
fn default ( ) -> Self {
411
432
Self {
412
- filters : vec ! [
413
- FilterMode :: Global ,
414
- FilterMode :: Host ,
415
- FilterMode :: Session ,
416
- FilterMode :: Workspace ,
417
- FilterMode :: Directory ,
418
- ] ,
433
+ filters : EnabledFilterModes ( vec ! [ ] ) ,
419
434
}
420
435
}
421
436
}
422
437
438
+ const DEFAULT_FILTER_MODES : & [ FilterMode ] = & [
439
+ FilterMode :: Global ,
440
+ FilterMode :: Host ,
441
+ FilterMode :: Session ,
442
+ FilterMode :: Workspace ,
443
+ FilterMode :: Directory ,
444
+ ] ;
445
+
446
+ const DEFAULT_LEGACY_WORKSPACE_FILTER_MODES : & [ FilterMode ] = & [
447
+ FilterMode :: Workspace ,
448
+ FilterMode :: Global ,
449
+ FilterMode :: Host ,
450
+ FilterMode :: Session ,
451
+ FilterMode :: Directory ,
452
+ ] ;
453
+
454
+ impl Default for EnabledFilterModes {
455
+ fn default ( ) -> Self {
456
+ Self ( DEFAULT_FILTER_MODES . into ( ) )
457
+ }
458
+ }
459
+
423
460
// The preview height strategy also takes max_preview_height into account.
424
461
#[ derive( Clone , Debug , Deserialize , Copy , PartialEq , Eq , ValueEnum , Serialize ) ]
425
462
pub enum PreviewStrategy {
@@ -712,12 +749,21 @@ impl Settings {
712
749
}
713
750
714
751
pub fn default_filter_mode ( & self ) -> FilterMode {
752
+ if self . search . filters . specified ( ) . is_empty ( ) && self . workspaces {
753
+ return FilterMode :: Workspace ;
754
+ }
755
+
756
+ let filters = self . filter_modes ( ) ;
715
757
self . filter_mode
716
- . filter ( |x| self . search . filters . contains ( x) )
717
- . or ( self . search . filters . first ( ) . copied ( ) )
758
+ . filter ( |x| filters. contains ( x) )
759
+ . or ( filters. first ( ) . copied ( ) )
718
760
. unwrap_or ( FilterMode :: Global )
719
761
}
720
762
763
+ pub fn filter_modes ( & self ) -> & [ FilterMode ] {
764
+ self . search . filters . resolved ( self . workspaces )
765
+ }
766
+
721
767
#[ cfg( not( feature = "check-update" ) ) ]
722
768
pub async fn needs_update ( & self ) -> Option < Version > {
723
769
None
@@ -788,10 +834,6 @@ impl Settings {
788
834
. set_default ( "daemon.socket_path" , socket_path. to_str ( ) ) ?
789
835
. set_default ( "daemon.systemd_socket" , false ) ?
790
836
. set_default ( "daemon.tcp_port" , 8889 ) ?
791
- . set_default (
792
- "search.filters" ,
793
- vec ! [ "global" , "host" , "session" , "workspace" , "directory" ] ,
794
- ) ?
795
837
. set_default ( "theme.name" , "default" ) ?
796
838
. set_default ( "theme.debug" , None :: < bool > ) ?
797
839
. set_default (
0 commit comments