diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2022-01-30 16:38:07 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2022-03-17 19:13:40 +1100 |
commit | b5515da00b916bcf79f680b360d5c00e08932338 (patch) | |
tree | 689e04bf5c79ea6578a3f7a09f25b93a9ce75809 /pkg/gui/filetree | |
parent | c084abb378bc4ae2902e52f399c0f53968d1e717 (diff) |
move commit files context into new structure
Diffstat (limited to 'pkg/gui/filetree')
-rw-r--r-- | pkg/gui/filetree/commit_file_tree.go | 107 | ||||
-rw-r--r-- | pkg/gui/filetree/commit_file_tree_view_model.go | 126 | ||||
-rw-r--r-- | pkg/gui/filetree/file_tree.go | 25 |
3 files changed, 178 insertions, 80 deletions
diff --git a/pkg/gui/filetree/commit_file_tree.go b/pkg/gui/filetree/commit_file_tree.go new file mode 100644 index 000000000..d020aee21 --- /dev/null +++ b/pkg/gui/filetree/commit_file_tree.go @@ -0,0 +1,107 @@ +package filetree + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/sirupsen/logrus" +) + +type ICommitFileTree interface { + ITree + + GetItemAtIndex(index int) *CommitFileNode + GetFile(path string) *models.CommitFile + GetAllItems() []*CommitFileNode + GetAllFiles() []*models.CommitFile +} + +type CommitFileTree struct { + getFiles func() []*models.CommitFile + tree *CommitFileNode + showTree bool + log *logrus.Entry + collapsedPaths CollapsedPaths +} + +var _ ICommitFileTree = &CommitFileTree{} + +func NewCommitFileTree(getFiles func() []*models.CommitFile, log *logrus.Entry, showTree bool) *CommitFileTree { + return &CommitFileTree{ + getFiles: getFiles, + log: log, + showTree: showTree, + collapsedPaths: CollapsedPaths{}, + } +} + +func (self *CommitFileTree) ExpandToPath(path string) { + self.collapsedPaths.ExpandToPath(path) +} + +func (self *CommitFileTree) ToggleShowTree() { + self.showTree = !self.showTree + self.SetTree() +} + +func (self *CommitFileTree) GetItemAtIndex(index int) *CommitFileNode { + // need to traverse the three depth first until we get to the index. + return self.tree.GetNodeAtIndex(index+1, self.collapsedPaths) // ignoring root +} + +func (self *CommitFileTree) GetIndexForPath(path string) (int, bool) { + index, found := self.tree.GetIndexForPath(path, self.collapsedPaths) + return index - 1, found +} + +func (self *CommitFileTree) GetAllItems() []*CommitFileNode { + if self.tree == nil { + return nil + } + + return self.tree.Flatten(self.collapsedPaths)[1:] // ignoring root +} + +func (self *CommitFileTree) GetItemsLength() int { + return self.tree.Size(self.collapsedPaths) - 1 // ignoring root +} + +func (self *CommitFileTree) GetAllFiles() []*models.CommitFile { + return self.getFiles() +} + +func (self *CommitFileTree) SetTree() { + if self.showTree { + self.tree = BuildTreeFromCommitFiles(self.getFiles()) + } else { + self.tree = BuildFlatTreeFromCommitFiles(self.getFiles()) + } +} + +func (self *CommitFileTree) IsCollapsed(path string) bool { + return self.collapsedPaths.IsCollapsed(path) +} + +func (self *CommitFileTree) ToggleCollapsed(path string) { + self.collapsedPaths.ToggleCollapsed(path) +} + +func (self *CommitFileTree) Tree() INode { + return self.tree +} + +func (self *CommitFileTree) CollapsedPaths() CollapsedPaths { + return self.collapsedPaths +} + +func (self *CommitFileTree) GetFile(path string) *models.CommitFile { + for _, file := range self.getFiles() { + if file.Name == path { + return file + } + } + + return nil +} + +func (self *CommitFileTree) InTreeMode() bool { + return self.showTree +} diff --git a/pkg/gui/filetree/commit_file_tree_view_model.go b/pkg/gui/filetree/commit_file_tree_view_model.go index 301396462..86e7e864e 100644 --- a/pkg/gui/filetree/commit_file_tree_view_model.go +++ b/pkg/gui/filetree/commit_file_tree_view_model.go @@ -1,101 +1,93 @@ package filetree import ( + "sync" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context/traits" + "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/sirupsen/logrus" ) -type CommitFileTreeViewModel struct { - files []*models.CommitFile - tree *CommitFileNode - showTree bool - log *logrus.Entry - collapsedPaths CollapsedPaths - // parent is the identifier of the parent object e.g. a commit SHA if this commit file is for a commit, or a stash entry ref like 'stash@{1}' - parent string -} +type ICommitFileTreeViewModel interface { + ICommitFileTree + types.IListCursor -func (self *CommitFileTreeViewModel) GetParent() string { - return self.parent + GetRefName() string + SetRefName(string) + GetCanRebase() bool + SetCanRebase(bool) } -func (self *CommitFileTreeViewModel) SetParent(parent string) { - self.parent = parent -} +type CommitFileTreeViewModel struct { + sync.RWMutex + ICommitFileTree + types.IListCursor -func NewCommitFileTreeViewModel(files []*models.CommitFile, log *logrus.Entry, showTree bool) *CommitFileTreeViewModel { - viewModel := &CommitFileTreeViewModel{ - log: log, - showTree: showTree, - collapsedPaths: CollapsedPaths{}, - } + // this is e.g. the commit SHA of the commit for which we're viewing the files + refName string - viewModel.SetFiles(files) + // we set this to true when you're viewing the files within the checked-out branch's commits. + // If you're viewing the files of some random other branch we can't do any rebase stuff. + canRebase bool +} + +var _ ICommitFileTreeViewModel = &CommitFileTreeViewModel{} - return viewModel +func NewCommitFileTreeViewModel(getFiles func() []*models.CommitFile, log *logrus.Entry, showTree bool) *CommitFileTreeViewModel { + fileTree := NewCommitFileTree(getFiles, log, showTree) + listCursor := traits.NewListCursor(fileTree) + return &CommitFileTreeViewModel{ + ICommitFileTree: fileTree, + IListCursor: listCursor, + refName: "", + canRebase: false, + } } -func (self *CommitFileTreeViewModel) ExpandToPath(path string) { - self.collapsedPaths.ExpandToPath(path) +func (self *CommitFileTreeViewModel) GetRefName() string { + return self.refName } -func (self *CommitFileTreeViewModel) ToggleShowTree() { - self.showTree = !self.showTree - self.SetTree() +func (self *CommitFileTreeViewModel) SetRefName(refName string) { + self.refName = refName } -func (self *CommitFileTreeViewModel) GetItemAtIndex(index int) *CommitFileNode { - // need to traverse the three depth first until we get to the index. - return self.tree.GetNodeAtIndex(index+1, self.collapsedPaths) // ignoring root +func (self *CommitFileTreeViewModel) GetCanRebase() bool { + return self.canRebase } -func (self *CommitFileTreeViewModel) GetIndexForPath(path string) (int, bool) { - index, found := self.tree.GetIndexForPath(path, self.collapsedPaths) - return index - 1, found +func (self *CommitFileTreeViewModel) SetCanRebase(canRebase bool) { + self.canRebase = canRebase } -func (self *CommitFileTreeViewModel) GetAllItems() []*CommitFileNode { - if self.tree == nil { +func (self *CommitFileTreeViewModel) GetSelectedFileNode() *CommitFileNode { + if self.GetItemsLength() == 0 { return nil } - return self.tree.Flatten(self.collapsedPaths)[1:] // ignoring root -} - -func (self *CommitFileTreeViewModel) GetItemsLength() int { - return self.tree.Size(self.collapsedPaths) - 1 // ignoring root + return self.GetItemAtIndex(self.GetSelectedLineIdx()) } -func (self *CommitFileTreeViewModel) GetAllFiles() []*models.CommitFile { - return self.files -} - -func (self *CommitFileTreeViewModel) SetFiles(files []*models.CommitFile) { - self.files = files +// duplicated from file_tree_view_model.go. Generics will help here +func (self *CommitFileTreeViewModel) ToggleShowTree() { + selectedNode := self.GetSelectedFileNode() - self.SetTree() -} + self.ICommitFileTree.ToggleShowTree() -func (self *CommitFileTreeViewModel) SetTree() { - if self.showTree { - self.tree = BuildTreeFromCommitFiles(self.files) - } else { - self.tree = BuildFlatTreeFromCommitFiles(self.files) + if selectedNode == nil { + return } -} - -func (self *CommitFileTreeViewModel) IsCollapsed(path string) bool { - return self.collapsedPaths.IsCollapsed(path) -} - -func (self *CommitFileTreeViewModel) ToggleCollapsed(path string) { - self.collapsedPaths.ToggleCollapsed(path) -} + path := selectedNode.Path -func (self *CommitFileTreeViewModel) Tree() INode { - return self.tree -} + if self.InTreeMode() { + self.ExpandToPath(path) + } else if len(selectedNode.Children) > 0 { + path = selectedNode.GetLeaves()[0].Path + } -func (self *CommitFileTreeViewModel) CollapsedPaths() CollapsedPaths { - return self.collapsedPaths + index, found := self.GetIndexForPath(path) + if found { + self.SetSelectedLineIdx(index) + } } diff --git a/pkg/gui/filetree/file_tree.go b/pkg/gui/filetree/file_tree.go index 504707b28..113027e59 100644 --- a/pkg/gui/filetree/file_tree.go +++ b/pkg/gui/filetree/file_tree.go @@ -2,7 +2,6 @@ package filetree import ( "fmt" - "sync" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/sirupsen/logrus" @@ -18,25 +17,28 @@ const ( DisplayConflicted ) -type IFileTree interface { +type ITree interface { InTreeMode() bool ExpandToPath(path string) - FilterFiles(test func(*models.File) bool) []*models.File - SetFilter(filter FileTreeDisplayFilter) ToggleShowTree() - - GetItemAtIndex(index int) *FileNode - GetFile(path string) *models.File GetIndexForPath(path string) (int, bool) - GetAllItems() []*FileNode GetItemsLength() int - GetAllFiles() []*models.File - SetTree() IsCollapsed(path string) bool ToggleCollapsed(path string) Tree() INode CollapsedPaths() CollapsedPaths +} + +type IFileTree interface { + ITree + + FilterFiles(test func(*models.File) bool) []*models.File + SetFilter(filter FileTreeDisplayFilter) + GetItemAtIndex(index int) *FileNode + GetFile(path string) *models.File + GetAllItems() []*FileNode + GetAllFiles() []*models.File GetFilter() FileTreeDisplayFilter } @@ -47,8 +49,6 @@ type FileTree struct { log *logrus.Entry filter FileTreeDisplayFilter collapsedPaths CollapsedPaths - - sync.RWMutex } func NewFileTree(getFiles func() []*models.File, log *logrus.Entry, showTree bool) *FileTree { @@ -58,7 +58,6 @@ func NewFileTree(getFiles func() []*models.File, log *logrus.Entry, showTree boo showTree: showTree, filter: DisplayAll, collapsedPaths: CollapsedPaths{}, - RWMutex: sync.RWMutex{}, } } |