mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-17 22:32:58 +02:00
When refreshing models, re-apply active filter for the corresponding view
This commit is contained in:
parent
ecaa4846f1
commit
b5ca6a3add
@ -41,6 +41,10 @@ func (self *FilteredList[T]) ClearFilter() {
|
|||||||
self.SetFilter("")
|
self.SetFilter("")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *FilteredList[T]) ReApplyFilter() {
|
||||||
|
self.applyFilter()
|
||||||
|
}
|
||||||
|
|
||||||
func (self *FilteredList[T]) IsFiltering() bool {
|
func (self *FilteredList[T]) IsFiltering() bool {
|
||||||
return self.filter != ""
|
return self.filter != ""
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ func (gui *Gui) resetHelpersAndControllers() {
|
|||||||
patchBuildingHelper := helpers.NewPatchBuildingHelper(helperCommon)
|
patchBuildingHelper := helpers.NewPatchBuildingHelper(helperCommon)
|
||||||
stagingHelper := helpers.NewStagingHelper(helperCommon)
|
stagingHelper := helpers.NewStagingHelper(helperCommon)
|
||||||
mergeConflictsHelper := helpers.NewMergeConflictsHelper(helperCommon)
|
mergeConflictsHelper := helpers.NewMergeConflictsHelper(helperCommon)
|
||||||
|
searchHelper := helpers.NewSearchHelper(helperCommon)
|
||||||
|
|
||||||
refreshHelper := helpers.NewRefreshHelper(
|
refreshHelper := helpers.NewRefreshHelper(
|
||||||
helperCommon,
|
helperCommon,
|
||||||
@ -56,6 +57,7 @@ func (gui *Gui) resetHelpersAndControllers() {
|
|||||||
stagingHelper,
|
stagingHelper,
|
||||||
mergeConflictsHelper,
|
mergeConflictsHelper,
|
||||||
worktreeHelper,
|
worktreeHelper,
|
||||||
|
searchHelper,
|
||||||
)
|
)
|
||||||
diffHelper := helpers.NewDiffHelper(helperCommon)
|
diffHelper := helpers.NewDiffHelper(helperCommon)
|
||||||
cherryPickHelper := helpers.NewCherryPickHelper(
|
cherryPickHelper := helpers.NewCherryPickHelper(
|
||||||
@ -119,7 +121,7 @@ func (gui *Gui) resetHelpersAndControllers() {
|
|||||||
modeHelper,
|
modeHelper,
|
||||||
appStatusHelper,
|
appStatusHelper,
|
||||||
),
|
),
|
||||||
Search: helpers.NewSearchHelper(helperCommon),
|
Search: searchHelper,
|
||||||
Worktree: worktreeHelper,
|
Worktree: worktreeHelper,
|
||||||
SubCommits: helpers.NewSubCommitsHelper(helperCommon, refreshHelper, setSubCommits),
|
SubCommits: helpers.NewSubCommitsHelper(helperCommon, refreshHelper, setSubCommits),
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ type RefreshHelper struct {
|
|||||||
stagingHelper *StagingHelper
|
stagingHelper *StagingHelper
|
||||||
mergeConflictsHelper *MergeConflictsHelper
|
mergeConflictsHelper *MergeConflictsHelper
|
||||||
worktreeHelper *WorktreeHelper
|
worktreeHelper *WorktreeHelper
|
||||||
|
searchHelper *SearchHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRefreshHelper(
|
func NewRefreshHelper(
|
||||||
@ -38,6 +39,7 @@ func NewRefreshHelper(
|
|||||||
stagingHelper *StagingHelper,
|
stagingHelper *StagingHelper,
|
||||||
mergeConflictsHelper *MergeConflictsHelper,
|
mergeConflictsHelper *MergeConflictsHelper,
|
||||||
worktreeHelper *WorktreeHelper,
|
worktreeHelper *WorktreeHelper,
|
||||||
|
searchHelper *SearchHelper,
|
||||||
) *RefreshHelper {
|
) *RefreshHelper {
|
||||||
return &RefreshHelper{
|
return &RefreshHelper{
|
||||||
c: c,
|
c: c,
|
||||||
@ -47,6 +49,7 @@ func NewRefreshHelper(
|
|||||||
stagingHelper: stagingHelper,
|
stagingHelper: stagingHelper,
|
||||||
mergeConflictsHelper: mergeConflictsHelper,
|
mergeConflictsHelper: mergeConflictsHelper,
|
||||||
worktreeHelper: worktreeHelper,
|
worktreeHelper: worktreeHelper,
|
||||||
|
searchHelper: searchHelper,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,7 +331,7 @@ func (self *RefreshHelper) refreshCommitsWithLimit() error {
|
|||||||
self.c.Model().WorkingTreeStateAtLastCommitRefresh = self.c.Git().Status.WorkingTreeState()
|
self.c.Model().WorkingTreeStateAtLastCommitRefresh = self.c.Git().Status.WorkingTreeState()
|
||||||
self.c.Model().CheckedOutBranch = checkedOutBranchName
|
self.c.Model().CheckedOutBranch = checkedOutBranchName
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().LocalCommits)
|
return self.refreshView(self.c.Contexts().LocalCommits)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshSubCommitsWithLimit() error {
|
func (self *RefreshHelper) refreshSubCommitsWithLimit() error {
|
||||||
@ -351,7 +354,7 @@ func (self *RefreshHelper) refreshSubCommitsWithLimit() error {
|
|||||||
self.c.Model().SubCommits = commits
|
self.c.Model().SubCommits = commits
|
||||||
self.RefreshAuthors(commits)
|
self.RefreshAuthors(commits)
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().SubCommits)
|
return self.refreshView(self.c.Contexts().SubCommits)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) RefreshAuthors(commits []*models.Commit) {
|
func (self *RefreshHelper) RefreshAuthors(commits []*models.Commit) {
|
||||||
@ -381,7 +384,7 @@ func (self *RefreshHelper) refreshCommitFilesContext() error {
|
|||||||
self.c.Model().CommitFiles = files
|
self.c.Model().CommitFiles = files
|
||||||
self.c.Contexts().CommitFiles.CommitFileTreeViewModel.SetTree()
|
self.c.Contexts().CommitFiles.CommitFileTreeViewModel.SetTree()
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().CommitFiles)
|
return self.refreshView(self.c.Contexts().CommitFiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshRebaseCommits() error {
|
func (self *RefreshHelper) refreshRebaseCommits() error {
|
||||||
@ -395,7 +398,7 @@ func (self *RefreshHelper) refreshRebaseCommits() error {
|
|||||||
self.c.Model().Commits = updatedCommits
|
self.c.Model().Commits = updatedCommits
|
||||||
self.c.Model().WorkingTreeStateAtLastCommitRefresh = self.c.Git().Status.WorkingTreeState()
|
self.c.Model().WorkingTreeStateAtLastCommitRefresh = self.c.Git().Status.WorkingTreeState()
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().LocalCommits)
|
return self.refreshView(self.c.Contexts().LocalCommits)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshTags() error {
|
func (self *RefreshHelper) refreshTags() error {
|
||||||
@ -406,7 +409,7 @@ func (self *RefreshHelper) refreshTags() error {
|
|||||||
|
|
||||||
self.c.Model().Tags = tags
|
self.c.Model().Tags = tags
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().Tags)
|
return self.refreshView(self.c.Contexts().Tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshStateSubmoduleConfigs() error {
|
func (self *RefreshHelper) refreshStateSubmoduleConfigs() error {
|
||||||
@ -448,12 +451,12 @@ func (self *RefreshHelper) refreshBranches(refreshWorktrees bool) {
|
|||||||
|
|
||||||
if refreshWorktrees {
|
if refreshWorktrees {
|
||||||
self.loadWorktrees()
|
self.loadWorktrees()
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().Worktrees); err != nil {
|
if err := self.refreshView(self.c.Contexts().Worktrees); err != nil {
|
||||||
self.c.Log.Error(err)
|
self.c.Log.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().Branches); err != nil {
|
if err := self.refreshView(self.c.Contexts().Branches); err != nil {
|
||||||
self.c.Log.Error(err)
|
self.c.Log.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,11 +488,11 @@ func (self *RefreshHelper) refreshFilesAndSubmodules() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.c.OnUIThread(func() error {
|
self.c.OnUIThread(func() error {
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().Submodules); err != nil {
|
if err := self.refreshView(self.c.Contexts().Submodules); err != nil {
|
||||||
self.c.Log.Error(err)
|
self.c.Log.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().Files); err != nil {
|
if err := self.refreshView(self.c.Contexts().Files); err != nil {
|
||||||
self.c.Log.Error(err)
|
self.c.Log.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,7 +614,7 @@ func (self *RefreshHelper) refreshReflogCommits() error {
|
|||||||
model.FilteredReflogCommits = model.ReflogCommits
|
model.FilteredReflogCommits = model.ReflogCommits
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().ReflogCommits)
|
return self.refreshView(self.c.Contexts().ReflogCommits)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshRemotes() error {
|
func (self *RefreshHelper) refreshRemotes() error {
|
||||||
@ -635,11 +638,11 @@ func (self *RefreshHelper) refreshRemotes() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().Remotes); err != nil {
|
if err := self.refreshView(self.c.Contexts().Remotes); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().RemoteBranches); err != nil {
|
if err := self.refreshView(self.c.Contexts().RemoteBranches); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,18 +664,18 @@ func (self *RefreshHelper) refreshWorktrees() error {
|
|||||||
|
|
||||||
// need to refresh branches because the branches view shows worktrees against
|
// need to refresh branches because the branches view shows worktrees against
|
||||||
// branches
|
// branches
|
||||||
if err := self.c.PostRefreshUpdate(self.c.Contexts().Branches); err != nil {
|
if err := self.refreshView(self.c.Contexts().Branches); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().Worktrees)
|
return self.refreshView(self.c.Contexts().Worktrees)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshStashEntries() error {
|
func (self *RefreshHelper) refreshStashEntries() error {
|
||||||
self.c.Model().StashEntries = self.c.Git().Loaders.StashLoader.
|
self.c.Model().StashEntries = self.c.Git().Loaders.StashLoader.
|
||||||
GetStashEntries(self.c.Modes().Filtering.GetPath())
|
GetStashEntries(self.c.Modes().Filtering.GetPath())
|
||||||
|
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().Stash)
|
return self.refreshView(self.c.Contexts().Stash)
|
||||||
}
|
}
|
||||||
|
|
||||||
// never call this on its own, it should only be called from within refreshCommits()
|
// never call this on its own, it should only be called from within refreshCommits()
|
||||||
@ -711,3 +714,8 @@ func (self *RefreshHelper) refForLog() string {
|
|||||||
|
|
||||||
return bisectInfo.GetStartSha()
|
return bisectInfo.GetStartSha()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *RefreshHelper) refreshView(context types.Context) error {
|
||||||
|
self.searchHelper.ReApplyFilter(context)
|
||||||
|
return self.c.PostRefreshUpdate(context)
|
||||||
|
}
|
||||||
|
@ -227,6 +227,18 @@ func (self *SearchHelper) OnPromptContentChanged(searchString string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *SearchHelper) ReApplyFilter(context types.Context) {
|
||||||
|
state := self.searchState()
|
||||||
|
if context == state.Context {
|
||||||
|
filterableContext, ok := context.(types.IFilterableContext)
|
||||||
|
if ok {
|
||||||
|
filterableContext.SetSelectedLineIdx(0)
|
||||||
|
_ = filterableContext.GetView().SetOriginY(0)
|
||||||
|
filterableContext.ReApplyFilter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (self *SearchHelper) RenderSearchStatus(c types.Context) {
|
func (self *SearchHelper) RenderSearchStatus(c types.Context) {
|
||||||
if c.GetKey() == context.SEARCH_CONTEXT_KEY {
|
if c.GetKey() == context.SEARCH_CONTEXT_KEY {
|
||||||
return
|
return
|
||||||
|
@ -102,6 +102,7 @@ type IFilterableContext interface {
|
|||||||
SetFilter(string)
|
SetFilter(string)
|
||||||
GetFilter() string
|
GetFilter() string
|
||||||
ClearFilter()
|
ClearFilter()
|
||||||
|
ReApplyFilter()
|
||||||
IsFiltering() bool
|
IsFiltering() bool
|
||||||
IsFilterableContext()
|
IsFilterableContext()
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
package filter_and_search
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
var FilterUpdatesWhenModelChanges = NewIntegrationTest(NewIntegrationTestArgs{
|
||||||
|
Description: "Verify that after deleting a branch the filter is reapplied to show only the remaining branches",
|
||||||
|
ExtraCmdArgs: []string{},
|
||||||
|
Skip: false,
|
||||||
|
SetupConfig: func(config *config.AppConfig) {},
|
||||||
|
SetupRepo: func(shell *Shell) {
|
||||||
|
shell.EmptyCommit("first commit")
|
||||||
|
shell.NewBranch("branch-to-delete")
|
||||||
|
shell.NewBranch("other")
|
||||||
|
shell.NewBranch("checked-out-branch")
|
||||||
|
},
|
||||||
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
||||||
|
t.Views().Branches().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("checked-out-branch").IsSelected(),
|
||||||
|
Contains("other"),
|
||||||
|
Contains("branch-to-delete"),
|
||||||
|
Contains("master"),
|
||||||
|
).
|
||||||
|
FilterOrSearch("branch").
|
||||||
|
Lines(
|
||||||
|
Contains("branch-to-delete").IsSelected(),
|
||||||
|
Contains("checked-out-branch"),
|
||||||
|
).
|
||||||
|
Press(keys.Universal.Remove).
|
||||||
|
Tap(func() {
|
||||||
|
t.ExpectPopup().
|
||||||
|
Menu().
|
||||||
|
Title(Equals("Delete branch 'branch-to-delete'?")).
|
||||||
|
Select(Contains("Delete local branch")).
|
||||||
|
Confirm()
|
||||||
|
}).
|
||||||
|
Lines(
|
||||||
|
Contains("checked-out-branch").IsSelected(),
|
||||||
|
).
|
||||||
|
// cancel the filter
|
||||||
|
PressEscape().
|
||||||
|
Lines(
|
||||||
|
Contains("checked-out-branch").IsSelected(),
|
||||||
|
Contains("other"),
|
||||||
|
Contains("master"),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
})
|
@ -133,6 +133,7 @@ var tests = []*components.IntegrationTest{
|
|||||||
filter_and_search.FilterRemoteBranches,
|
filter_and_search.FilterRemoteBranches,
|
||||||
filter_and_search.FilterRemotes,
|
filter_and_search.FilterRemotes,
|
||||||
filter_and_search.FilterSearchHistory,
|
filter_and_search.FilterSearchHistory,
|
||||||
|
filter_and_search.FilterUpdatesWhenModelChanges,
|
||||||
filter_and_search.NestedFilter,
|
filter_and_search.NestedFilter,
|
||||||
filter_and_search.NestedFilterTransient,
|
filter_and_search.NestedFilterTransient,
|
||||||
filter_and_search.NewSearch,
|
filter_and_search.NewSearch,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user