summaryrefslogtreecommitdiffstats
path: root/pkg/gui/filetree
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-01-30 16:38:07 +1100
committerJesse Duffield <jessedduffield@gmail.com>2022-03-17 19:13:40 +1100
commitb5515da00b916bcf79f680b360d5c00e08932338 (patch)
tree689e04bf5c79ea6578a3f7a09f25b93a9ce75809 /pkg/gui/filetree
parentc084abb378bc4ae2902e52f399c0f53968d1e717 (diff)
move commit files context into new structure
Diffstat (limited to 'pkg/gui/filetree')
-rw-r--r--pkg/gui/filetree/commit_file_tree.go107
-rw-r--r--pkg/gui/filetree/commit_file_tree_view_model.go126
-rw-r--r--pkg/gui/filetree/file_tree.go25
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{},
}
}