From 5cda0ae020c1963da81825c6f3c2177b3ef2d72e Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sun, 12 Jan 2025 18:16:28 +0100 Subject: [PATCH] Maintain selection and simplify code Several changes here: - Simplify UncollapseAll; it's much too much work to iterate over files and call ExpandToPath for each one. We simply need to clear our container of collapsed paths. - For CollapseAll, move the code that gets all dirPaths from the controller to the tree; I don't really see a reason why the controller should get the paths and pass them in - Maintain the selection when collapsing or expanding all. For collapsing, we keep the top-level item selected that the previously selected node was a child of; for expanding, it's always possible to keep the item itself selected. --- .../controllers/commits_files_controller.go | 16 ++-------- pkg/gui/controllers/files_controller.go | 16 ++-------- pkg/gui/filetree/collapsed_paths.go | 5 +++ pkg/gui/filetree/commit_file_tree.go | 14 +++++---- .../filetree/commit_file_tree_view_model.go | 31 +++++++++++++++++++ pkg/gui/filetree/file_tree.go | 18 ++++++----- pkg/gui/filetree/file_tree_view_model.go | 31 +++++++++++++++++++ 7 files changed, 89 insertions(+), 42 deletions(-) diff --git a/pkg/gui/controllers/commits_files_controller.go b/pkg/gui/controllers/commits_files_controller.go index ae78b76fac0..5dbf4770a3d 100644 --- a/pkg/gui/controllers/commits_files_controller.go +++ b/pkg/gui/controllers/commits_files_controller.go @@ -416,13 +416,7 @@ func (self *CommitFilesController) toggleTreeView() error { } func (self *CommitFilesController) collapseAll() error { - nodes := self.context().GetAllItems() - - dirPaths := lo.FilterMap(nodes, func(file *filetree.CommitFileNode, index int) (string, bool) { - return file.Path, !file.IsFile() - }) - - self.context().CommitFileTreeViewModel.CollapseAll(dirPaths) + self.context().CommitFileTreeViewModel.CollapseAll() self.c.PostRefreshUpdate(self.context()) @@ -430,13 +424,7 @@ func (self *CommitFilesController) collapseAll() error { } func (self *CommitFilesController) expandAll() error { - files := self.context().GetAllFiles() - - filePaths := lo.Map(files, func(file *models.CommitFile, index int) string { - return file.GetPath() - }) - - self.context().CommitFileTreeViewModel.UncollapseAll(filePaths) + self.context().CommitFileTreeViewModel.UncollapseAll() self.c.PostRefreshUpdate(self.context()) diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go index e4ea448c2ee..dc160809763 100644 --- a/pkg/gui/controllers/files_controller.go +++ b/pkg/gui/controllers/files_controller.go @@ -493,13 +493,7 @@ func (self *FilesController) enter() error { } func (self *FilesController) collapseAll() error { - nodes := self.context().GetAllItems() - - dirPaths := lo.FilterMap(nodes, func(file *filetree.FileNode, index int) (string, bool) { - return file.Path, !file.IsFile() - }) - - self.context().FileTreeViewModel.CollapseAll(dirPaths) + self.context().FileTreeViewModel.CollapseAll() self.c.PostRefreshUpdate(self.context()) @@ -507,13 +501,7 @@ func (self *FilesController) collapseAll() error { } func (self *FilesController) expandAll() error { - files := self.context().GetAllFiles() - - filePaths := lo.Map(files, func(file *models.File, index int) string { - return file.GetPath() - }) - - self.context().FileTreeViewModel.UncollapseAll(filePaths) + self.context().FileTreeViewModel.UncollapseAll() self.c.PostRefreshUpdate(self.context()) diff --git a/pkg/gui/filetree/collapsed_paths.go b/pkg/gui/filetree/collapsed_paths.go index 903999b37d0..e22435b7ffa 100644 --- a/pkg/gui/filetree/collapsed_paths.go +++ b/pkg/gui/filetree/collapsed_paths.go @@ -36,3 +36,8 @@ func (self *CollapsedPaths) ToggleCollapsed(path string) { self.collapsedPaths.Add(path) } } + +func (self *CollapsedPaths) ExpandAll() { + // Could be cleaner if Set had a Clear() method... + self.collapsedPaths.RemoveSlice(self.collapsedPaths.ToSlice()) +} diff --git a/pkg/gui/filetree/commit_file_tree.go b/pkg/gui/filetree/commit_file_tree.go index 911d16c8926..97e1c1b6267 100644 --- a/pkg/gui/filetree/commit_file_tree.go +++ b/pkg/gui/filetree/commit_file_tree.go @@ -25,16 +25,18 @@ type CommitFileTree struct { collapsedPaths *CollapsedPaths } -func (self *CommitFileTree) CollapseAll(paths []string) { - for _, path := range paths { +func (self *CommitFileTree) CollapseAll() { + dirPaths := lo.FilterMap(self.GetAllItems(), func(file *CommitFileNode, index int) (string, bool) { + return file.Path, !file.IsFile() + }) + + for _, path := range dirPaths { self.collapsedPaths.Collapse(path) } } -func (self *CommitFileTree) UncollapseAll(paths []string) { - for _, path := range paths { - self.collapsedPaths.ExpandToPath(path) - } +func (self *CommitFileTree) UncollapseAll() { + self.collapsedPaths.ExpandAll() } var _ ICommitFileTree = &CommitFileTree{} diff --git a/pkg/gui/filetree/commit_file_tree_view_model.go b/pkg/gui/filetree/commit_file_tree_view_model.go index cbbb2fbcf3c..4542ec35c7f 100644 --- a/pkg/gui/filetree/commit_file_tree_view_model.go +++ b/pkg/gui/filetree/commit_file_tree_view_model.go @@ -1,6 +1,7 @@ package filetree import ( + "strings" "sync" "github.com/jesseduffield/lazygit/pkg/commands/models" @@ -160,3 +161,33 @@ func (self *CommitFileTreeViewModel) ToggleShowTree() { self.SetSelection(index) } } + +func (self *CommitFileTreeViewModel) CollapseAll() { + selectedNode := self.GetSelected() + + self.ICommitFileTree.CollapseAll() + if selectedNode == nil { + return + } + + topLevelPath := strings.Split(selectedNode.Path, "/")[0] + index, found := self.GetIndexForPath(topLevelPath) + if found { + self.SetSelectedLineIdx(index) + } +} + +func (self *CommitFileTreeViewModel) UncollapseAll() { + selectedNode := self.GetSelected() + + self.ICommitFileTree.UncollapseAll() + + if selectedNode == nil { + return + } + + index, found := self.GetIndexForPath(selectedNode.Path) + if found { + self.SetSelectedLineIdx(index) + } +} diff --git a/pkg/gui/filetree/file_tree.go b/pkg/gui/filetree/file_tree.go index 70fe3e56e79..047b181b441 100644 --- a/pkg/gui/filetree/file_tree.go +++ b/pkg/gui/filetree/file_tree.go @@ -31,8 +31,8 @@ type ITree[T any] interface { IsCollapsed(path string) bool ToggleCollapsed(path string) CollapsedPaths() *CollapsedPaths - CollapseAll(paths []string) - UncollapseAll(paths []string) + CollapseAll() + UncollapseAll() } type IFileTree interface { @@ -173,16 +173,18 @@ func (self *FileTree) ToggleCollapsed(path string) { self.collapsedPaths.ToggleCollapsed(path) } -func (self *FileTree) CollapseAll(paths []string) { - for _, path := range paths { +func (self *FileTree) CollapseAll() { + dirPaths := lo.FilterMap(self.GetAllItems(), func(file *FileNode, index int) (string, bool) { + return file.Path, !file.IsFile() + }) + + for _, path := range dirPaths { self.collapsedPaths.Collapse(path) } } -func (self *FileTree) UncollapseAll(paths []string) { - for _, path := range paths { - self.collapsedPaths.ExpandToPath(path) - } +func (self *FileTree) UncollapseAll() { + self.collapsedPaths.ExpandAll() } func (self *FileTree) Tree() *FileNode { diff --git a/pkg/gui/filetree/file_tree_view_model.go b/pkg/gui/filetree/file_tree_view_model.go index 25b3d0edcbd..34425985891 100644 --- a/pkg/gui/filetree/file_tree_view_model.go +++ b/pkg/gui/filetree/file_tree_view_model.go @@ -1,6 +1,7 @@ package filetree import ( + "strings" "sync" "github.com/jesseduffield/lazygit/pkg/commands/models" @@ -190,3 +191,33 @@ func (self *FileTreeViewModel) ToggleShowTree() { self.SetSelectedLineIdx(index) } } + +func (self *FileTreeViewModel) CollapseAll() { + selectedNode := self.GetSelected() + + self.IFileTree.CollapseAll() + if selectedNode == nil { + return + } + + topLevelPath := strings.Split(selectedNode.Path, "/")[0] + index, found := self.GetIndexForPath(topLevelPath) + if found { + self.SetSelectedLineIdx(index) + } +} + +func (self *FileTreeViewModel) UncollapseAll() { + selectedNode := self.GetSelected() + + self.IFileTree.UncollapseAll() + + if selectedNode == nil { + return + } + + index, found := self.GetIndexForPath(selectedNode.Path) + if found { + self.SetSelectedLineIdx(index) + } +}