crud implementation for a filepicker
This commit is contained in:
@@ -4,11 +4,13 @@ import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/charmbracelet/bubbles/filepicker"
|
||||
"github.com/charmbracelet/bubbles/textinput"
|
||||
"github.com/charmbracelet/bubbletea"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
|
||||
"bspviz/internal/app"
|
||||
@@ -63,6 +65,8 @@ type model struct {
|
||||
output string
|
||||
errMsg string
|
||||
running bool
|
||||
showPicker bool
|
||||
picker filepicker.Model
|
||||
}
|
||||
|
||||
func initialModel() model {
|
||||
@@ -108,6 +112,17 @@ func initialModel() model {
|
||||
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)
|
||||
return m
|
||||
}
|
||||
@@ -117,6 +132,29 @@ func (m model) Init() 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) {
|
||||
case tea.KeyMsg:
|
||||
switch msg.String() {
|
||||
@@ -142,6 +180,28 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
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":
|
||||
if !m.running {
|
||||
var cmd tea.Cmd
|
||||
@@ -215,6 +275,12 @@ func (m model) View() string {
|
||||
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 != "" {
|
||||
b.WriteString("\n")
|
||||
b.WriteString(boxStyle.Render(m.output))
|
||||
@@ -222,7 +288,7 @@ func (m model) View() string {
|
||||
}
|
||||
|
||||
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")
|
||||
|
||||
return b.String()
|
||||
|
||||
1
go.mod
1
go.mod
@@ -16,6 +16,7 @@ require (
|
||||
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
|
||||
github.com/charmbracelet/x/term v0.2.1 // 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/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-localereader v0.0.1 // indirect
|
||||
|
||||
2
go.sum
2
go.sum
@@ -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/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/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/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
|
||||
Reference in New Issue
Block a user