From ee40c47864219ab6c87480ecb6a9e6e1a02b0a31 Mon Sep 17 00:00:00 2001 From: ruinivist Date: Thu, 1 Jan 2026 01:54:05 +0000 Subject: [PATCH] add file content render --- fstree/fs_test.go | 5 +++-- fstree/fstree.go | 17 +++++++++++++++++ main.go | 25 +++++++++++++++++++++---- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/fstree/fs_test.go b/fstree/fs_test.go index 66cda77..a9ea59a 100644 --- a/fstree/fs_test.go +++ b/fstree/fs_test.go @@ -57,9 +57,10 @@ func TestWalkFileSystemAndBuildTree(t *testing.T) { t.Errorf("child %q parent pointer incorrect", child.FileName()) } - if child.nodeType == FileNode { + switch child.nodeType { + case FileNode: fileCount++ - } else if child.nodeType == FolderNode { + case FolderNode: folderCount++ if child.FileName() == "folder1" { folder1 = child diff --git a/fstree/fstree.go b/fstree/fstree.go index 8eff0fe..a14bf75 100644 --- a/fstree/fstree.go +++ b/fstree/fstree.go @@ -11,6 +11,7 @@ import ( "errors" "mend/styles" "mend/utils" + "os" "path/filepath" "strings" @@ -195,6 +196,22 @@ func (t *FsTree) ToggleSelectedExpand() error { return nil } +func (t *FsTree) GetSelectedContent() (string, error) { + if t.selected == nil { + return "", errors.New("no node is currently selected") + } + + if t.selected.nodeType != FileNode { + return "", nil + } + + contentBytes, err := os.ReadFile(t.selected.path) + if err != nil { + return "", err + } + return string(contentBytes), nil +} + func (t *FsTree) Render() string { builder := &strings.Builder{} t.renderNode(t.root, 0, builder) diff --git a/main.go b/main.go index 248dd9f..0a500a3 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( fs "mend/fstree" "github.com/charmbracelet/bubbles/spinner" + "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) @@ -43,8 +44,9 @@ type model struct { tree *fs.FsTree // spinner needs to be state as I need to update the spinner on // each tick in update func - spinner spinner.Model - loading bool + spinner spinner.Model + loading bool + viewport viewport.Model } // initial model state @@ -60,6 +62,7 @@ func createModel() model { tree: nil, spinner: s, loading: true, + viewport: viewport.New(0, 0), } } @@ -90,6 +93,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.WindowSizeMsg: m.terminalWidth = msg.Width m.terminalHeight = msg.Height + m.viewport.Width = msg.Width - m.width - 1 + m.viewport.Height = msg.Height return m, nil case treeLoadedMsg: m.tree = msg.tree @@ -115,6 +120,13 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if err := m.tree.ToggleSelectedExpand(); err != nil { fmt.Println("Error toggling expand:", err) } + case "l", "L": + content, err := m.tree.GetSelectedContent() + if err != nil { + fmt.Println("Error getting selected content:", err) + } else { + m.viewport.SetContent(content) + } } } return m, nil @@ -130,7 +142,9 @@ func (m model) View() string { Render(m.tree.Render()) right := lipgloss.NewStyle(). - Render("section2") + Width(m.terminalWidth - m.width - 1). + Height(m.terminalHeight). + Render(m.viewport.View()) divider := lipgloss.NewStyle(). Width(1). @@ -144,7 +158,10 @@ func (m model) View() string { // =================== bubbletea ui fns =================== func main() { - p := tea.NewProgram(createModel(), tea.WithAltScreen() /* <- full screen tui */) + p := tea.NewProgram( + createModel(), + tea.WithAltScreen(), // full screen tui + ) if _, err := p.Run(); err != nil { fmt.Printf("Error: %v", err) os.Exit(1)