From 90c9124b0ae3156e3ef0a119a9b93c73ea77bee5 Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Mon, 6 Mar 2023 11:54:26 -0500 Subject: [PATCH] Filepicker Example (#683) * feat: filepicker example * fix: use new API * docs(examples): update file selection comment in filepicker example * chore: bump bubbles --------- Co-authored-by: Christian Rocha --- examples/file-picker/main.go | 69 ++++++++++++++++++++++++++++++++++++ examples/go.mod | 3 +- examples/go.sum | 10 ++++-- 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 examples/file-picker/main.go diff --git a/examples/file-picker/main.go b/examples/file-picker/main.go new file mode 100644 index 0000000..30ecf01 --- /dev/null +++ b/examples/file-picker/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "fmt" + "os" + "strings" + + "github.com/charmbracelet/bubbles/filepicker" + tea "github.com/charmbracelet/bubbletea" +) + +type model struct { + filepicker filepicker.Model + selectedFile string + quitting bool +} + +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.KeyMsg: + switch msg.String() { + case "ctrl+c", "q": + m.quitting = true + 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 { + // Get the path of the selected file. + m.selectedFile = path + } + + return m, cmd +} + +func (m model) View() string { + if m.quitting { + return "" + } + var s strings.Builder + s.WriteString("\n ") + if m.selectedFile == "" { + s.WriteString("Pick a file:") + } else { + s.WriteString("Selected file: " + m.filepicker.Styles.Selected.Render(m.selectedFile)) + } + s.WriteString("\n\n" + m.filepicker.View() + "\n") + return s.String() +} + +func main() { + fp := filepicker.New() + fp.Path, _ = os.UserHomeDir() + + m := model{ + filepicker: fp, + } + tm, _ := tea.NewProgram(&m, tea.WithOutput(os.Stderr)).Run() + mm := tm.(model) + fmt.Println("\n You selected: " + m.filepicker.Styles.Selected.Render(mm.selectedFile) + "\n") +} diff --git a/examples/go.mod b/examples/go.mod index 47bf1ab..7f51863 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -3,7 +3,7 @@ module examples go 1.17 require ( - github.com/charmbracelet/bubbles v0.15.0 + github.com/charmbracelet/bubbles v0.15.1-0.20230306155959-3372cf1aea2b github.com/charmbracelet/bubbletea v0.23.2 github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/harmonica v0.2.0 @@ -22,6 +22,7 @@ require ( github.com/aymerick/douceur v0.2.0 // indirect github.com/containerd/console v1.0.3 // indirect github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect diff --git a/examples/go.sum b/examples/go.sum index caa14e9..729ba0d 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -7,8 +7,12 @@ github.com/aymanbagabas/go-osc52 v1.2.1 h1:q2sWUyDcozPLcLabEMd+a+7Ea2DitxZVN9hTx github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI= -github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= +github.com/charmbracelet/bubbles v0.15.1-0.20230303180827-c01b49080882 h1:bhZOZDpFHFKZhROCENdN+cUHNknH3MY8CUE2xJ9a3HM= +github.com/charmbracelet/bubbles v0.15.1-0.20230303180827-c01b49080882/go.mod h1:39HL8bnL0foloiENA/KvD+3mNg5SqWQV2Qh3eY/4ey4= +github.com/charmbracelet/bubbles v0.15.1-0.20230303214459-958a0ea710f1 h1:BcxSgchb4ZV1lJe9W9+LhQj6S3JouC39yYswVI4YOrw= +github.com/charmbracelet/bubbles v0.15.1-0.20230303214459-958a0ea710f1/go.mod h1:39HL8bnL0foloiENA/KvD+3mNg5SqWQV2Qh3eY/4ey4= +github.com/charmbracelet/bubbles v0.15.1-0.20230306155959-3372cf1aea2b h1:K9dWJ2spDhDhIrqnchjG867djPxWWe3mwdk6RdLMfhg= +github.com/charmbracelet/bubbles v0.15.1-0.20230306155959-3372cf1aea2b/go.mod h1:39HL8bnL0foloiENA/KvD+3mNg5SqWQV2Qh3eY/4ey4= github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ= @@ -22,6 +26,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776 h1:VRIbnDWRmAh5yBdz+J6yFMF5vso1It6vn+WmM/5l7MA= github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776/go.mod h1:9wvnDu3YOfxzWM9Cst40msBF1C2UdQgDv962oTxSuMs= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=