diff --git a/pkg/gui/filetree/file_tree_view_model.go b/pkg/gui/filetree/file_tree_view_model.go index 07dc10ec1..a5971f592 100644 --- a/pkg/gui/filetree/file_tree_view_model.go +++ b/pkg/gui/filetree/file_tree_view_model.go @@ -167,6 +167,12 @@ func (self *FileTreeViewModel) SetStatusFilter(filter FileTreeDisplayFilter) { self.IListCursor.SetSelection(0) } +func (self *FileTreeViewModel) SetStatusFilterPreservingSelection(filter FileTreeDisplayFilter) { + self.preserveSelection(func() { + self.SetStatusFilter(filter) + }) +} + func (self *FileTreeViewModel) preserveSelection(f func()) { selectedNode := self.GetSelected() var selectedPath string diff --git a/pkg/gui/filetree/file_tree_view_model_test.go b/pkg/gui/filetree/file_tree_view_model_test.go new file mode 100644 index 000000000..c14c91ea8 --- /dev/null +++ b/pkg/gui/filetree/file_tree_view_model_test.go @@ -0,0 +1,32 @@ +package filetree + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/common" + "github.com/stretchr/testify/assert" +) + +func TestSetStatusFilterPreservingSelection(t *testing.T) { + files := []*models.File{ + {Path: "file1"}, + {Path: "file2", HasMergeConflicts: true}, + {Path: "file3", HasMergeConflicts: true}, + } + viewModel := NewFileTreeViewModel( + func() []*models.File { return files }, + common.NewDummyCommon(), + false, + ) + viewModel.SetTree() + viewModel.SetStatusFilter(DisplayConflicted) + viewModel.SetSelection(viewModel.Len() - 2) + viewModel.ToggleStickyRange() + viewModel.MoveSelectedLine(1) + + viewModel.SetStatusFilterPreservingSelection(DisplayAll) + + assert.Equal(t, "file3", viewModel.GetSelectedPath()) + assert.False(t, viewModel.IsSelectingRange()) +}