summaryrefslogtreecommitdiffstats
path: root/pkg/gui/presentation/files.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/presentation/files.go')
-rw-r--r--pkg/gui/presentation/files.go77
1 files changed, 56 insertions, 21 deletions
diff --git a/pkg/gui/presentation/files.go b/pkg/gui/presentation/files.go
index cb4d19cec..394b39f73 100644
--- a/pkg/gui/presentation/files.go
+++ b/pkg/gui/presentation/files.go
@@ -30,9 +30,10 @@ func RenderFileTree(
diffName string,
submoduleConfigs []*models.SubmoduleConfig,
) []string {
- return renderAux(tree.Tree(), tree.CollapsedPaths(), "", -1, func(n filetree.INode, depth int) string {
- castN := n.(*filetree.FileNode)
- return getFileLine(castN.GetHasUnstagedChanges(), castN.GetHasStagedChanges(), castN.NameAtDepth(depth), diffName, submoduleConfigs, castN.File)
+ return renderAux(tree.GetRoot().Raw(), tree.CollapsedPaths(), "", -1, func(node *filetree.Node[models.File], depth int) string {
+ fileNode := filetree.NewFileNode(node)
+
+ return getFileLine(fileNode.GetHasUnstagedChanges(), fileNode.GetHasStagedChanges(), fileNameAtDepth(node, depth), diffName, submoduleConfigs, node.File)
})
}
@@ -41,19 +42,17 @@ func RenderCommitFileTree(
diffName string,
patchManager *patch.PatchManager,
) []string {
- return renderAux(tree.Tree(), tree.CollapsedPaths(), "", -1, func(n filetree.INode, depth int) string {
- castN := n.(*filetree.CommitFileNode)
-
+ return renderAux(tree.GetRoot().Raw(), tree.CollapsedPaths(), "", -1, func(node *filetree.Node[models.CommitFile], depth int) string {
// This is a little convoluted because we're dealing with either a leaf or a non-leaf.
// But this code actually applies to both. If it's a leaf, the status will just
// be whatever status it is, but if it's a non-leaf it will determine its status
// based on the leaves of that subtree
var status patch.PatchStatus
- if castN.EveryFile(func(file *models.CommitFile) bool {
+ if node.EveryFile(func(file *models.CommitFile) bool {
return patchManager.GetFileStatus(file.Name, tree.GetRef().RefName()) == patch.WHOLE
}) {
status = patch.WHOLE
- } else if castN.EveryFile(func(file *models.CommitFile) bool {
+ } else if node.EveryFile(func(file *models.CommitFile) bool {
return patchManager.GetFileStatus(file.Name, tree.GetRef().RefName()) == patch.UNSELECTED
}) {
status = patch.UNSELECTED
@@ -61,37 +60,37 @@ func RenderCommitFileTree(
status = patch.PART
}
- return getCommitFileLine(castN.NameAtDepth(depth), diffName, castN.File, status)
+ return getCommitFileLine(commitFileNameAtDepth(node, depth), diffName, node.File, status)
})
}
-func renderAux(
- s filetree.INode,
+func renderAux[T any](
+ node *filetree.Node[T],
collapsedPaths *filetree.CollapsedPaths,
prefix string,
depth int,
- renderLine func(filetree.INode, int) string,
+ renderLine func(*filetree.Node[T], int) string,
) []string {
- if s == nil || s.IsNil() {
+ if node == nil {
return []string{}
}
isRoot := depth == -1
- if s.IsLeaf() {
+ if node.IsFile() {
if isRoot {
return []string{}
}
- return []string{prefix + renderLine(s, depth)}
+ return []string{prefix + renderLine(node, depth)}
}
- if collapsedPaths.IsCollapsed(s.GetPath()) {
- return []string{prefix + COLLAPSED_ARROW + " " + renderLine(s, depth)}
+ if collapsedPaths.IsCollapsed(node.GetPath()) {
+ return []string{prefix + COLLAPSED_ARROW + " " + renderLine(node, depth)}
}
arr := []string{}
if !isRoot {
- arr = append(arr, prefix+EXPANDED_ARROW+" "+renderLine(s, depth))
+ arr = append(arr, prefix+EXPANDED_ARROW+" "+renderLine(node, depth))
}
newPrefix := prefix
@@ -101,8 +100,8 @@ func renderAux(
newPrefix = strings.TrimSuffix(prefix, INNER_ITEM) + NESTED
}
- for i, child := range s.GetChildren() {
- isLast := i == len(s.GetChildren())-1
+ for i, child := range node.Children {
+ isLast := i == len(node.Children)-1
var childPrefix string
if isRoot {
@@ -113,7 +112,7 @@ func renderAux(
childPrefix = newPrefix + INNER_ITEM
}
- arr = append(arr, renderAux(child, collapsedPaths, childPrefix, depth+1+s.GetCompressionLevel(), renderLine)...)
+ arr = append(arr, renderAux(child, collapsedPaths, childPrefix, depth+1+node.CompressionLevel, renderLine)...)
}
return arr
@@ -220,3 +219,39 @@ func getColorForChangeStatus(changeStatus string) style.TextStyle {
return theme.DefaultTextColor
}
}
+
+func fileNameAtDepth(node *filetree.Node[models.File], depth int) string {
+ splitName := split(node.Path)
+ name := join(splitName[depth:])
+
+ if node.File != nil && node.File.IsRename() {
+ splitPrevName := split(node.File.PreviousName)
+
+ prevName := node.File.PreviousName
+ // if the file has just been renamed inside the same directory, we can shave off
+ // the prefix for the previous path too. Otherwise we'll keep it unchanged
+ sameParentDir := len(splitName) == len(splitPrevName) && join(splitName[0:depth]) == join(splitPrevName[0:depth])
+ if sameParentDir {
+ prevName = join(splitPrevName[depth:])
+ }
+
+ return prevName + " → " + name
+ }
+
+ return name
+}
+
+func commitFileNameAtDepth(node *filetree.Node[models.CommitFile], depth int) string {
+ splitName := split(node.Path)
+ name := join(splitName[depth:])
+
+ return name
+}
+
+func split(str string) []string {
+ return strings.Split(str, "/")
+}
+
+func join(strs []string) string {
+ return strings.Join(strs, "/")
+}