render fs tree
This commit is contained in:
+6
-1
@@ -28,6 +28,11 @@ func walkFileSystemAndBuildTree(rootPath string, node *FsNode) error {
|
||||
}
|
||||
|
||||
for _, entry := range entries {
|
||||
// dot folders and files skipped
|
||||
if len(entry.Name()) > 0 && entry.Name()[0] == '.' {
|
||||
continue
|
||||
}
|
||||
|
||||
childPath := filepath.Join(rootPath, entry.Name())
|
||||
|
||||
var nodeType FsNodeType
|
||||
@@ -42,7 +47,7 @@ func walkFileSystemAndBuildTree(rootPath string, node *FsNode) error {
|
||||
path: childPath,
|
||||
children: make([]*FsNode, 0),
|
||||
parent: node,
|
||||
expanded: false,
|
||||
expanded: true,
|
||||
}
|
||||
|
||||
node.children = append(node.children, childNode)
|
||||
|
||||
+29
-2
@@ -11,6 +11,7 @@ import (
|
||||
"errors"
|
||||
"mend/utils"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// enums for node types
|
||||
@@ -72,7 +73,7 @@ func (t *FsTree) CreateNode(parent *FsNode, name string, nodeType FsNodeType) er
|
||||
path: filepath.Join(parent.path, name),
|
||||
children: make([]*FsNode, 0),
|
||||
parent: parent,
|
||||
expanded: false,
|
||||
expanded: true,
|
||||
}
|
||||
|
||||
parent.children = append(parent.children, newNode)
|
||||
@@ -92,7 +93,6 @@ func (t *FsTree) DeleteNode(node *FsNode) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ToggleExpand toggles the expanded state of a node
|
||||
func (t *FsTree) ToggleExpand(node *FsNode) error {
|
||||
if node == nil {
|
||||
return errors.New("node cannot be nil")
|
||||
@@ -104,3 +104,30 @@ func (t *FsTree) ToggleExpand(node *FsNode) error {
|
||||
node.expanded = !node.expanded
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *FsTree) Render() string {
|
||||
builder := &strings.Builder{}
|
||||
t.renderNode(t.root, 0, builder)
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
func (t *FsTree) renderNode(node *FsNode, depth int, builder *strings.Builder) {
|
||||
if node == nil {
|
||||
return
|
||||
}
|
||||
|
||||
indent := strings.Repeat(" ", depth)
|
||||
icon := "-"
|
||||
if node.nodeType == FolderNode {
|
||||
icon = "> "
|
||||
}
|
||||
|
||||
line := indent + icon + " " + node.FileName() + "\n"
|
||||
builder.WriteString(line)
|
||||
|
||||
if node.expanded {
|
||||
for _, child := range node.children {
|
||||
t.renderNode(child, depth+1, builder)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ func createModel() model {
|
||||
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
|
||||
|
||||
return model{
|
||||
width: 20, // char count
|
||||
width: 30, // char count
|
||||
tree: nil,
|
||||
spinner: s,
|
||||
loading: true,
|
||||
@@ -67,7 +67,7 @@ type treeLoadedMsg struct {
|
||||
}
|
||||
|
||||
func loadTreeCmd() tea.Msg {
|
||||
time.Sleep(3 * time.Second) // delay sim
|
||||
time.Sleep(1 * time.Second) // delay sim
|
||||
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
@@ -107,14 +107,16 @@ func (m model) View() string {
|
||||
|
||||
left := lipgloss.NewStyle().
|
||||
Width(m.width).
|
||||
Render("section1")
|
||||
Render(m.tree.Render())
|
||||
|
||||
right := lipgloss.NewStyle().
|
||||
Render("section2")
|
||||
|
||||
leftHeight := lipgloss.Height(left)
|
||||
|
||||
divider := lipgloss.NewStyle().
|
||||
Width(1).
|
||||
Height(5).
|
||||
Height(leftHeight).
|
||||
Background(styles.Primary).
|
||||
Render("") // everything is a string in tui
|
||||
|
||||
|
||||
Reference in New Issue
Block a user