@@ -381,27 +381,8 @@ impl State {
381381 }
382382 KeyCode :: Char ( 'u' ) if ctrl => self . search . input . clear ( ) ,
383383 KeyCode :: Char ( 'r' ) if ctrl => {
384- let filter_modes = if settings. workspaces && self . search . context . git_root . is_some ( )
385- {
386- vec ! [
387- FilterMode :: Global ,
388- FilterMode :: Host ,
389- FilterMode :: Session ,
390- FilterMode :: Directory ,
391- FilterMode :: Workspace ,
392- ]
393- } else {
394- vec ! [
395- FilterMode :: Global ,
396- FilterMode :: Host ,
397- FilterMode :: Session ,
398- FilterMode :: Directory ,
399- ]
400- } ;
401-
402- let i = self . search . filter_mode as usize ;
403- let i = ( i + 1 ) % filter_modes. len ( ) ;
404- self . search . filter_mode = filter_modes[ i] ;
384+ self . search . filter_mode_index =
385+ ( self . search . filter_mode_index + 1 ) % self . search . available_filter_modes . len ( ) ;
405386 }
406387 KeyCode :: Char ( 's' ) if ctrl => {
407388 self . switched_search_mode = true ;
@@ -712,7 +693,10 @@ impl State {
712693 let ( pref, mode) = if self . switched_search_mode {
713694 ( " SRCH:" , self . search_mode . as_str ( ) )
714695 } else {
715- ( "" , self . search . filter_mode . as_str ( ) )
696+ (
697+ "" ,
698+ self . search . available_filter_modes [ self . search . filter_mode_index ] . as_str ( ) ,
699+ )
716700 } ;
717701 let mode_width = MAX_WIDTH - pref. len ( ) ;
718702 // sanity check to ensure we don't exceed the layout limits
@@ -882,6 +866,28 @@ pub async fn history(
882866 } else {
883867 settings. search_mode
884868 } ;
869+ let mut available_filter_modes = settings
870+ . filter_modes
871+ . clone ( )
872+ . into_iter ( )
873+ . filter ( |item| {
874+ * item != FilterMode :: Workspace || !settings. workspaces || context. git_root . is_some ( )
875+ } )
876+ . collect :: < Vec < _ > > ( ) ;
877+ if available_filter_modes. is_empty ( ) {
878+ available_filter_modes = vec ! [
879+ FilterMode :: Workspace ,
880+ FilterMode :: Global ,
881+ FilterMode :: Host ,
882+ FilterMode :: Session ,
883+ ]
884+ . into_iter ( )
885+ . filter ( |item| {
886+ * item != FilterMode :: Workspace || !settings. workspaces || context. git_root . is_some ( )
887+ } )
888+ . collect :: < Vec < _ > > ( ) ;
889+ }
890+
885891 let mut app = State {
886892 history_count,
887893 results_state : ListState :: default ( ) ,
@@ -891,15 +897,24 @@ pub async fn history(
891897 tab_index : 0 ,
892898 search : SearchState {
893899 input,
894- filter_mode : if settings. workspaces && context. git_root . is_some ( ) {
895- FilterMode :: Workspace
896- } else if settings. shell_up_key_binding {
897- settings
898- . filter_mode_shell_up_key_binding
899- . unwrap_or ( settings. filter_mode )
900+ filter_mode_index : if settings. shell_up_key_binding {
901+ available_filter_modes
902+ . iter ( )
903+ . position ( |& item| {
904+ item == settings
905+ . filter_mode_shell_up_key_binding
906+ . unwrap_or ( FilterMode :: Global )
907+ } )
908+ . unwrap_or_default ( )
909+ } else if let Some ( filter_mode) = settings. filter_mode {
910+ available_filter_modes
911+ . iter ( )
912+ . position ( |& item| item == filter_mode)
913+ . unwrap_or_default ( )
900914 } else {
901- settings . filter_mode
915+ 0
902916 } ,
917+ available_filter_modes,
903918 context,
904919 } ,
905920 engine : engines:: engine ( search_mode) ,
@@ -928,7 +943,7 @@ pub async fn history(
928943 terminal. draw ( |f| app. draw ( f, & results, stats. clone ( ) , settings) ) ?;
929944
930945 let initial_input = app. search . input . as_str ( ) . to_owned ( ) ;
931- let initial_filter_mode = app. search . filter_mode ;
946+ let initial_filter_mode = app. search . available_filter_modes [ app . search . filter_mode_index ] ;
932947 let initial_search_mode = app. search_mode ;
933948
934949 let event_ready = tokio:: task:: spawn_blocking ( || event:: poll ( Duration :: from_millis ( 250 ) ) ) ;
@@ -978,7 +993,8 @@ pub async fn history(
978993 }
979994
980995 if initial_input != app. search . input . as_str ( )
981- || initial_filter_mode != app. search . filter_mode
996+ || initial_filter_mode
997+ != app. search . available_filter_modes [ app. search . filter_mode_index ]
982998 || initial_search_mode != app. search_mode
983999 {
9841000 results = app. query_results ( & mut db) . await ?;
0 commit comments