crud implementation for a filepicker

This commit is contained in:
Doc
2025-09-28 13:53:36 +02:00
parent a5a28840b1
commit eec2ca5cc9
3 changed files with 71 additions and 2 deletions

View File

@@ -4,11 +4,13 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"os" "os"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
"github.com/charmbracelet/bubbles/filepicker"
"github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/bubbles/textinput"
"github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss"
"bspviz/internal/app" "bspviz/internal/app"
@@ -63,6 +65,8 @@ type model struct {
output string output string
errMsg string errMsg string
running bool running bool
showPicker bool
picker filepicker.Model
} }
func initialModel() model { func initialModel() model {
@@ -108,6 +112,17 @@ func initialModel() model {
m.inputs[i] = ti m.inputs[i] = ti
} }
picker := filepicker.New()
picker.AllowedTypes = []string{".wad", ".WAD"}
picker.DirAllowed = false
picker.FileAllowed = true
picker.ShowPermissions = false
picker.ShowSize = true
picker.ShowHidden = false
picker.AutoHeight = false
picker.Height = 12
m.picker = picker
m.setFocus(0) m.setFocus(0)
return m return m
} }
@@ -117,6 +132,29 @@ func (m model) Init() tea.Cmd {
} }
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if m.showPicker {
switch key := msg.(type) {
case tea.KeyMsg:
if key.Type == tea.KeyEsc {
m.showPicker = false
m.status = "Dateiauswahl abgebrochen"
return m, nil
}
}
var cmd tea.Cmd
m.picker, cmd = m.picker.Update(msg)
if selected, path := m.picker.DidSelectFile(msg); selected {
m.inputs[inputWadPath].SetValue(path)
m.showPicker = false
m.status = "WAD gewählt"
m.errMsg = ""
m.setFocus(inputWadPath)
return m, cmd
}
return m, cmd
}
switch msg := msg.(type) { switch msg := msg.(type) {
case tea.KeyMsg: case tea.KeyMsg:
switch msg.String() { switch msg.String() {
@@ -142,6 +180,28 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.toggles[idx] = !m.toggles[idx] m.toggles[idx] = !m.toggles[idx]
} }
} }
case "f2":
if !m.running {
current := strings.TrimSpace(m.inputs[inputWadPath].Value())
if current != "" {
info, err := os.Stat(current)
if err == nil {
if info.IsDir() {
m.picker.CurrentDirectory = current
} else {
m.picker.CurrentDirectory = filepath.Dir(current)
}
} else {
m.picker.CurrentDirectory = filepath.Dir(current)
}
} else {
m.picker.CurrentDirectory = "."
}
m.showPicker = true
m.status = "Datei auswählen"
m.errMsg = ""
return m, m.picker.Init()
}
case "ctrl+r": case "ctrl+r":
if !m.running { if !m.running {
var cmd tea.Cmd var cmd tea.Cmd
@@ -215,6 +275,12 @@ func (m model) View() string {
b.WriteString("\n") b.WriteString("\n")
} }
if m.showPicker {
b.WriteString("\nDatei auswählen (Enter übernehmen, Esc abbrechen)\n")
b.WriteString(boxStyle.Render(m.picker.View()))
b.WriteString("\n")
}
if m.output != "" { if m.output != "" {
b.WriteString("\n") b.WriteString("\n")
b.WriteString(boxStyle.Render(m.output)) b.WriteString(boxStyle.Render(m.output))
@@ -222,7 +288,7 @@ func (m model) View() string {
} }
b.WriteString("\n") b.WriteString("\n")
b.WriteString("Steuerung: TAB/Shift+TAB navigieren • Space toggeln • Ctrl+R ausführen • Ctrl+C beenden") b.WriteString("Steuerung: TAB/Shift+TAB navigieren • Space toggeln • Ctrl+R ausführen • F2 Datei wählen • Ctrl+C beenden")
b.WriteString("\n") b.WriteString("\n")
return b.String() return b.String()

1
go.mod
View File

@@ -16,6 +16,7 @@ require (
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-localereader v0.0.1 // indirect

2
go.sum
View File

@@ -18,6 +18,8 @@ github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQ
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY=
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
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/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=