diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go index cdf3f6241..34065bf33 100644 --- a/pkg/gui/controllers/files_controller.go +++ b/pkg/gui/controllers/files_controller.go @@ -2,6 +2,7 @@ package controllers import ( "errors" + "fmt" "strings" "github.com/jesseduffield/gocui" @@ -753,6 +754,7 @@ func (self *FilesController) isResolvingConflicts() bool { } func (self *FilesController) handleStatusFilterPressed() error { + currentFilter := self.context().GetFilter() return self.c.Menu(types.CreateMenuOptions{ Title: self.c.Tr.FilteringMenuTitle, Items: []*types.MenuItem{ @@ -761,44 +763,69 @@ func (self *FilesController) handleStatusFilterPressed() error { OnPress: func() error { return self.setStatusFiltering(filetree.DisplayStaged) }, - Key: 's', + Key: 's', + Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayStaged), }, { Label: self.c.Tr.FilterUnstagedFiles, OnPress: func() error { return self.setStatusFiltering(filetree.DisplayUnstaged) }, - Key: 'u', + Key: 'u', + Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayUnstaged), }, { Label: self.c.Tr.FilterTrackedFiles, OnPress: func() error { return self.setStatusFiltering(filetree.DisplayTracked) }, - Key: 't', + Key: 't', + Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayTracked), }, { Label: self.c.Tr.FilterUntrackedFiles, OnPress: func() error { return self.setStatusFiltering(filetree.DisplayUntracked) }, - Key: 'T', + Key: 'T', + Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayUntracked), }, { - Label: self.c.Tr.ResetFilter, + Label: self.c.Tr.NoFilter, OnPress: func() error { return self.setStatusFiltering(filetree.DisplayAll) }, - Key: 'r', + Key: 'r', + Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayAll), }, }, }) } +func (self *FilesController) filteringLabel(filter filetree.FileTreeDisplayFilter) string { + switch filter { + case filetree.DisplayAll: + return "" + case filetree.DisplayStaged: + return self.c.Tr.FilterLabelStagedFiles + case filetree.DisplayUnstaged: + return self.c.Tr.FilterLabelUnstagedFiles + case filetree.DisplayTracked: + return self.c.Tr.FilterLabelTrackedFiles + case filetree.DisplayUntracked: + return self.c.Tr.FilterLabelUntrackedFiles + case filetree.DisplayConflicted: + return self.c.Tr.FilterLabelConflictingFiles + } + + panic(fmt.Sprintf("Unexpected files display filter: %d", filter)) +} + func (self *FilesController) setStatusFiltering(filter filetree.FileTreeDisplayFilter) error { previousFilter := self.context().GetFilter() self.context().FileTreeViewModel.SetStatusFilter(filter) + self.c.Contexts().Files.GetView().Subtitle = self.filteringLabel(filter) // Whenever we switch between untracked and other filters, we need to refresh the files view // because the untracked files filter applies when running `git status`. diff --git a/pkg/gui/controllers/helpers/refresh_helper.go b/pkg/gui/controllers/helpers/refresh_helper.go index 37e451895..b9a90af60 100644 --- a/pkg/gui/controllers/helpers/refresh_helper.go +++ b/pkg/gui/controllers/helpers/refresh_helper.go @@ -588,16 +588,14 @@ func (self *RefreshHelper) refreshStateFiles() error { fileTreeViewModel.RWMutex.Lock() // only taking over the filter if it hasn't already been set by the user. - // Though this does make it impossible for the user to actually say they want to display all if - // conflicts are currently being shown. Hmm. Worth it I reckon. If we need to add some - // extra state here to see if the user's set the filter themselves we can do that, but - // I'd prefer to maintain as little state as possible. - if conflictFileCount > 0 { + if conflictFileCount > 0 && prevConflictFileCount == 0 { if fileTreeViewModel.GetFilter() == filetree.DisplayAll { fileTreeViewModel.SetStatusFilter(filetree.DisplayConflicted) + self.c.Contexts().Files.GetView().Subtitle = self.c.Tr.FilterLabelConflictingFiles } - } else if fileTreeViewModel.GetFilter() == filetree.DisplayConflicted { + } else if conflictFileCount == 0 && fileTreeViewModel.GetFilter() == filetree.DisplayConflicted { fileTreeViewModel.SetStatusFilter(filetree.DisplayAll) + self.c.Contexts().Files.GetView().Subtitle = "" } self.c.Model().Files = files diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 135ab43e1..a5584667a 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -89,7 +89,12 @@ type TranslationSet struct { FilterUnstagedFiles string FilterTrackedFiles string FilterUntrackedFiles string - ResetFilter string + NoFilter string + FilterLabelStagedFiles string + FilterLabelUnstagedFiles string + FilterLabelTrackedFiles string + FilterLabelUntrackedFiles string + FilterLabelConflictingFiles string MergeConflictsTitle string Checkout string CheckoutTooltip string @@ -1115,7 +1120,12 @@ func EnglishTranslationSet() *TranslationSet { FilterUnstagedFiles: "Show only unstaged files", FilterTrackedFiles: "Show only tracked files", FilterUntrackedFiles: "Show only untracked files", - ResetFilter: "Reset filter", + NoFilter: "No filter", + FilterLabelStagedFiles: "(only staged)", + FilterLabelUnstagedFiles: "(only unstaged)", + FilterLabelTrackedFiles: "(only tracked)", + FilterLabelUntrackedFiles: "(only untracked)", + FilterLabelConflictingFiles: "(only conflicting)", NoChangedFiles: "No changed files", SoftReset: "Soft reset", AlreadyCheckedOutBranch: "You have already checked out this branch", diff --git a/pkg/integration/tests/conflicts/filter.go b/pkg/integration/tests/conflicts/filter.go index 32f5a8cd2..c997d8daa 100644 --- a/pkg/integration/tests/conflicts/filter.go +++ b/pkg/integration/tests/conflicts/filter.go @@ -25,7 +25,7 @@ var Filter = NewIntegrationTest(NewIntegrationTestArgs{ Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Filtering")). - Select(Contains("Reset filter")). + Select(Contains("No filter")). Confirm() }). Lines( diff --git a/pkg/integration/tests/filter_and_search/filter_by_file_status.go b/pkg/integration/tests/filter_and_search/filter_by_file_status.go index 05b38ea96..f2335d28c 100644 --- a/pkg/integration/tests/filter_and_search/filter_by_file_status.go +++ b/pkg/integration/tests/filter_and_search/filter_by_file_status.go @@ -52,7 +52,7 @@ var FilterByFileStatus = NewIntegrationTest(NewIntegrationTestArgs{ Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Filtering")). - Select(Contains("Reset filter")). + Select(Contains("No filter")). Confirm() }). Lines(