Skip to content

Commit 5cda0ae

Browse files
committed
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.
1 parent 95241aa commit 5cda0ae

File tree

7 files changed

+89
-42
lines changed

7 files changed

+89
-42
lines changed

pkg/gui/controllers/commits_files_controller.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -416,27 +416,15 @@ func (self *CommitFilesController) toggleTreeView() error {
416416
}
417417

418418
func (self *CommitFilesController) collapseAll() error {
419-
nodes := self.context().GetAllItems()
420-
421-
dirPaths := lo.FilterMap(nodes, func(file *filetree.CommitFileNode, index int) (string, bool) {
422-
return file.Path, !file.IsFile()
423-
})
424-
425-
self.context().CommitFileTreeViewModel.CollapseAll(dirPaths)
419+
self.context().CommitFileTreeViewModel.CollapseAll()
426420

427421
self.c.PostRefreshUpdate(self.context())
428422

429423
return nil
430424
}
431425

432426
func (self *CommitFilesController) expandAll() error {
433-
files := self.context().GetAllFiles()
434-
435-
filePaths := lo.Map(files, func(file *models.CommitFile, index int) string {
436-
return file.GetPath()
437-
})
438-
439-
self.context().CommitFileTreeViewModel.UncollapseAll(filePaths)
427+
self.context().CommitFileTreeViewModel.UncollapseAll()
440428

441429
self.c.PostRefreshUpdate(self.context())
442430

pkg/gui/controllers/files_controller.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -493,27 +493,15 @@ func (self *FilesController) enter() error {
493493
}
494494

495495
func (self *FilesController) collapseAll() error {
496-
nodes := self.context().GetAllItems()
497-
498-
dirPaths := lo.FilterMap(nodes, func(file *filetree.FileNode, index int) (string, bool) {
499-
return file.Path, !file.IsFile()
500-
})
501-
502-
self.context().FileTreeViewModel.CollapseAll(dirPaths)
496+
self.context().FileTreeViewModel.CollapseAll()
503497

504498
self.c.PostRefreshUpdate(self.context())
505499

506500
return nil
507501
}
508502

509503
func (self *FilesController) expandAll() error {
510-
files := self.context().GetAllFiles()
511-
512-
filePaths := lo.Map(files, func(file *models.File, index int) string {
513-
return file.GetPath()
514-
})
515-
516-
self.context().FileTreeViewModel.UncollapseAll(filePaths)
504+
self.context().FileTreeViewModel.UncollapseAll()
517505

518506
self.c.PostRefreshUpdate(self.context())
519507

pkg/gui/filetree/collapsed_paths.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,8 @@ func (self *CollapsedPaths) ToggleCollapsed(path string) {
3636
self.collapsedPaths.Add(path)
3737
}
3838
}
39+
40+
func (self *CollapsedPaths) ExpandAll() {
41+
// Could be cleaner if Set had a Clear() method...
42+
self.collapsedPaths.RemoveSlice(self.collapsedPaths.ToSlice())
43+
}

pkg/gui/filetree/commit_file_tree.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ type CommitFileTree struct {
2525
collapsedPaths *CollapsedPaths
2626
}
2727

28-
func (self *CommitFileTree) CollapseAll(paths []string) {
29-
for _, path := range paths {
28+
func (self *CommitFileTree) CollapseAll() {
29+
dirPaths := lo.FilterMap(self.GetAllItems(), func(file *CommitFileNode, index int) (string, bool) {
30+
return file.Path, !file.IsFile()
31+
})
32+
33+
for _, path := range dirPaths {
3034
self.collapsedPaths.Collapse(path)
3135
}
3236
}
3337

34-
func (self *CommitFileTree) UncollapseAll(paths []string) {
35-
for _, path := range paths {
36-
self.collapsedPaths.ExpandToPath(path)
37-
}
38+
func (self *CommitFileTree) UncollapseAll() {
39+
self.collapsedPaths.ExpandAll()
3840
}
3941

4042
var _ ICommitFileTree = &CommitFileTree{}

pkg/gui/filetree/commit_file_tree_view_model.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package filetree
22

33
import (
4+
"strings"
45
"sync"
56

67
"github.com/jesseduffield/lazygit/pkg/commands/models"
@@ -160,3 +161,33 @@ func (self *CommitFileTreeViewModel) ToggleShowTree() {
160161
self.SetSelection(index)
161162
}
162163
}
164+
165+
func (self *CommitFileTreeViewModel) CollapseAll() {
166+
selectedNode := self.GetSelected()
167+
168+
self.ICommitFileTree.CollapseAll()
169+
if selectedNode == nil {
170+
return
171+
}
172+
173+
topLevelPath := strings.Split(selectedNode.Path, "/")[0]
174+
index, found := self.GetIndexForPath(topLevelPath)
175+
if found {
176+
self.SetSelectedLineIdx(index)
177+
}
178+
}
179+
180+
func (self *CommitFileTreeViewModel) UncollapseAll() {
181+
selectedNode := self.GetSelected()
182+
183+
self.ICommitFileTree.UncollapseAll()
184+
185+
if selectedNode == nil {
186+
return
187+
}
188+
189+
index, found := self.GetIndexForPath(selectedNode.Path)
190+
if found {
191+
self.SetSelectedLineIdx(index)
192+
}
193+
}

pkg/gui/filetree/file_tree.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ type ITree[T any] interface {
3131
IsCollapsed(path string) bool
3232
ToggleCollapsed(path string)
3333
CollapsedPaths() *CollapsedPaths
34-
CollapseAll(paths []string)
35-
UncollapseAll(paths []string)
34+
CollapseAll()
35+
UncollapseAll()
3636
}
3737

3838
type IFileTree interface {
@@ -173,16 +173,18 @@ func (self *FileTree) ToggleCollapsed(path string) {
173173
self.collapsedPaths.ToggleCollapsed(path)
174174
}
175175

176-
func (self *FileTree) CollapseAll(paths []string) {
177-
for _, path := range paths {
176+
func (self *FileTree) CollapseAll() {
177+
dirPaths := lo.FilterMap(self.GetAllItems(), func(file *FileNode, index int) (string, bool) {
178+
return file.Path, !file.IsFile()
179+
})
180+
181+
for _, path := range dirPaths {
178182
self.collapsedPaths.Collapse(path)
179183
}
180184
}
181185

182-
func (self *FileTree) UncollapseAll(paths []string) {
183-
for _, path := range paths {
184-
self.collapsedPaths.ExpandToPath(path)
185-
}
186+
func (self *FileTree) UncollapseAll() {
187+
self.collapsedPaths.ExpandAll()
186188
}
187189

188190
func (self *FileTree) Tree() *FileNode {

pkg/gui/filetree/file_tree_view_model.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package filetree
22

33
import (
4+
"strings"
45
"sync"
56

67
"github.com/jesseduffield/lazygit/pkg/commands/models"
@@ -190,3 +191,33 @@ func (self *FileTreeViewModel) ToggleShowTree() {
190191
self.SetSelectedLineIdx(index)
191192
}
192193
}
194+
195+
func (self *FileTreeViewModel) CollapseAll() {
196+
selectedNode := self.GetSelected()
197+
198+
self.IFileTree.CollapseAll()
199+
if selectedNode == nil {
200+
return
201+
}
202+
203+
topLevelPath := strings.Split(selectedNode.Path, "/")[0]
204+
index, found := self.GetIndexForPath(topLevelPath)
205+
if found {
206+
self.SetSelectedLineIdx(index)
207+
}
208+
}
209+
210+
func (self *FileTreeViewModel) UncollapseAll() {
211+
selectedNode := self.GetSelected()
212+
213+
self.IFileTree.UncollapseAll()
214+
215+
if selectedNode == nil {
216+
return
217+
}
218+
219+
index, found := self.GetIndexForPath(selectedNode.Path)
220+
if found {
221+
self.SetSelectedLineIdx(index)
222+
}
223+
}

0 commit comments

Comments
 (0)