From bf167e1d8a30de5e3dc04ba5e3c54cd79791e622 Mon Sep 17 00:00:00 2001 From: ruinivist Date: Wed, 31 Dec 2025 03:56:32 +0000 Subject: [PATCH] render fs tree --- fstree/fs.go | 7 ++++++- fstree/fstree.go | 31 +++++++++++++++++++++++++++++-- main.go | 10 ++++++---- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/fstree/fs.go b/fstree/fs.go index 2076a52..3248966 100644 --- a/fstree/fs.go +++ b/fstree/fs.go @@ -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) diff --git a/fstree/fstree.go b/fstree/fstree.go index 4fccdea..54d75ec 100644 --- a/fstree/fstree.go +++ b/fstree/fstree.go @@ -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) + } + } +} diff --git a/main.go b/main.go index 58c2dce..6102573 100644 --- a/main.go +++ b/main.go @@ -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