Skip to content

Commit fcf30ca

Browse files
authored
Show files filter status (#4230)
- **PR Description** This PR contains three improvements to the Files panel filtering: - it allows the user to switch to a different filter type (or reset the filter) when we are auto-showing only conflicting files - it shows the filter menu as radio buttons - it displays the current filter in the top-right corner of the Files panel's frame See the individual commits for details.
2 parents a1838d3 + aad2622 commit fcf30ca

File tree

5 files changed

+51
-16
lines changed

5 files changed

+51
-16
lines changed

pkg/gui/controllers/files_controller.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package controllers
22

33
import (
44
"errors"
5+
"fmt"
56
"strings"
67

78
"github.com/jesseduffield/gocui"
@@ -753,6 +754,7 @@ func (self *FilesController) isResolvingConflicts() bool {
753754
}
754755

755756
func (self *FilesController) handleStatusFilterPressed() error {
757+
currentFilter := self.context().GetFilter()
756758
return self.c.Menu(types.CreateMenuOptions{
757759
Title: self.c.Tr.FilteringMenuTitle,
758760
Items: []*types.MenuItem{
@@ -761,44 +763,69 @@ func (self *FilesController) handleStatusFilterPressed() error {
761763
OnPress: func() error {
762764
return self.setStatusFiltering(filetree.DisplayStaged)
763765
},
764-
Key: 's',
766+
Key: 's',
767+
Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayStaged),
765768
},
766769
{
767770
Label: self.c.Tr.FilterUnstagedFiles,
768771
OnPress: func() error {
769772
return self.setStatusFiltering(filetree.DisplayUnstaged)
770773
},
771-
Key: 'u',
774+
Key: 'u',
775+
Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayUnstaged),
772776
},
773777
{
774778
Label: self.c.Tr.FilterTrackedFiles,
775779
OnPress: func() error {
776780
return self.setStatusFiltering(filetree.DisplayTracked)
777781
},
778-
Key: 't',
782+
Key: 't',
783+
Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayTracked),
779784
},
780785
{
781786
Label: self.c.Tr.FilterUntrackedFiles,
782787
OnPress: func() error {
783788
return self.setStatusFiltering(filetree.DisplayUntracked)
784789
},
785-
Key: 'T',
790+
Key: 'T',
791+
Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayUntracked),
786792
},
787793
{
788-
Label: self.c.Tr.ResetFilter,
794+
Label: self.c.Tr.NoFilter,
789795
OnPress: func() error {
790796
return self.setStatusFiltering(filetree.DisplayAll)
791797
},
792-
Key: 'r',
798+
Key: 'r',
799+
Widget: types.MakeMenuRadioButton(currentFilter == filetree.DisplayAll),
793800
},
794801
},
795802
})
796803
}
797804

805+
func (self *FilesController) filteringLabel(filter filetree.FileTreeDisplayFilter) string {
806+
switch filter {
807+
case filetree.DisplayAll:
808+
return ""
809+
case filetree.DisplayStaged:
810+
return self.c.Tr.FilterLabelStagedFiles
811+
case filetree.DisplayUnstaged:
812+
return self.c.Tr.FilterLabelUnstagedFiles
813+
case filetree.DisplayTracked:
814+
return self.c.Tr.FilterLabelTrackedFiles
815+
case filetree.DisplayUntracked:
816+
return self.c.Tr.FilterLabelUntrackedFiles
817+
case filetree.DisplayConflicted:
818+
return self.c.Tr.FilterLabelConflictingFiles
819+
}
820+
821+
panic(fmt.Sprintf("Unexpected files display filter: %d", filter))
822+
}
823+
798824
func (self *FilesController) setStatusFiltering(filter filetree.FileTreeDisplayFilter) error {
799825
previousFilter := self.context().GetFilter()
800826

801827
self.context().FileTreeViewModel.SetStatusFilter(filter)
828+
self.c.Contexts().Files.GetView().Subtitle = self.filteringLabel(filter)
802829

803830
// Whenever we switch between untracked and other filters, we need to refresh the files view
804831
// because the untracked files filter applies when running `git status`.

pkg/gui/controllers/helpers/refresh_helper.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -588,16 +588,14 @@ func (self *RefreshHelper) refreshStateFiles() error {
588588
fileTreeViewModel.RWMutex.Lock()
589589

590590
// only taking over the filter if it hasn't already been set by the user.
591-
// Though this does make it impossible for the user to actually say they want to display all if
592-
// conflicts are currently being shown. Hmm. Worth it I reckon. If we need to add some
593-
// extra state here to see if the user's set the filter themselves we can do that, but
594-
// I'd prefer to maintain as little state as possible.
595-
if conflictFileCount > 0 {
591+
if conflictFileCount > 0 && prevConflictFileCount == 0 {
596592
if fileTreeViewModel.GetFilter() == filetree.DisplayAll {
597593
fileTreeViewModel.SetStatusFilter(filetree.DisplayConflicted)
594+
self.c.Contexts().Files.GetView().Subtitle = self.c.Tr.FilterLabelConflictingFiles
598595
}
599-
} else if fileTreeViewModel.GetFilter() == filetree.DisplayConflicted {
596+
} else if conflictFileCount == 0 && fileTreeViewModel.GetFilter() == filetree.DisplayConflicted {
600597
fileTreeViewModel.SetStatusFilter(filetree.DisplayAll)
598+
self.c.Contexts().Files.GetView().Subtitle = ""
601599
}
602600

603601
self.c.Model().Files = files

pkg/i18n/english.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,12 @@ type TranslationSet struct {
8989
FilterUnstagedFiles string
9090
FilterTrackedFiles string
9191
FilterUntrackedFiles string
92-
ResetFilter string
92+
NoFilter string
93+
FilterLabelStagedFiles string
94+
FilterLabelUnstagedFiles string
95+
FilterLabelTrackedFiles string
96+
FilterLabelUntrackedFiles string
97+
FilterLabelConflictingFiles string
9398
MergeConflictsTitle string
9499
Checkout string
95100
CheckoutTooltip string
@@ -1115,7 +1120,12 @@ func EnglishTranslationSet() *TranslationSet {
11151120
FilterUnstagedFiles: "Show only unstaged files",
11161121
FilterTrackedFiles: "Show only tracked files",
11171122
FilterUntrackedFiles: "Show only untracked files",
1118-
ResetFilter: "Reset filter",
1123+
NoFilter: "No filter",
1124+
FilterLabelStagedFiles: "(only staged)",
1125+
FilterLabelUnstagedFiles: "(only unstaged)",
1126+
FilterLabelTrackedFiles: "(only tracked)",
1127+
FilterLabelUntrackedFiles: "(only untracked)",
1128+
FilterLabelConflictingFiles: "(only conflicting)",
11191129
NoChangedFiles: "No changed files",
11201130
SoftReset: "Soft reset",
11211131
AlreadyCheckedOutBranch: "You have already checked out this branch",

pkg/integration/tests/conflicts/filter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ var Filter = NewIntegrationTest(NewIntegrationTestArgs{
2525
Tap(func() {
2626
t.ExpectPopup().Menu().
2727
Title(Equals("Filtering")).
28-
Select(Contains("Reset filter")).
28+
Select(Contains("No filter")).
2929
Confirm()
3030
}).
3131
Lines(

pkg/integration/tests/filter_and_search/filter_by_file_status.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ var FilterByFileStatus = NewIntegrationTest(NewIntegrationTestArgs{
5252
Tap(func() {
5353
t.ExpectPopup().Menu().
5454
Title(Equals("Filtering")).
55-
Select(Contains("Reset filter")).
55+
Select(Contains("No filter")).
5656
Confirm()
5757
}).
5858
Lines(

0 commit comments

Comments
 (0)