Tutorials

File Picker

Let users select files with the file picker component.

Browse and select files with the file picker bubble!

The Code

package main

import (
    "github.com/charmbracelet/bubbles/v2/filepicker"
    tea "github.com/charmbracelet/bubbletea/v2"
)

type model struct {
    filepicker   filepicker.Model
    selectedFile string
}

func (m model) Init() tea.Cmd {
    return m.filepicker.Init()
}

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    switch msg := msg.(type) {
    case tea.KeyPressMsg:
        if msg.String() == "q" {
            return m, tea.Quit
        }
    }
    
    var cmd tea.Cmd
    m.filepicker, cmd = m.filepicker.Update(msg)
    
    // Did the user select a file?
    if didSelect, path := m.filepicker.DidSelectFile(msg); didSelect {
        m.selectedFile = path
    }
    
    return m, cmd
}

func (m model) View() string {
    var s string
    if m.selectedFile != "" {
        s = "Selected: " + m.selectedFile + "\n\n"
    }
    return s + m.filepicker.View()
}

func main() {
    fp := filepicker.New()
    fp.CurrentDirectory = "."
    fp.AllowedTypes = []string{".go", ".md", ".txt"}
    
    tea.NewProgram(model{filepicker: fp}, tea.WithAltScreen()).Run()
}

Options

fp.AllowedTypes = []string{".go", ".md"}  // Filter by extension
fp.ShowHidden = true                        // Show hidden files
fp.CurrentDirectory = "/home/user"          // Start directory