crud implementation for a filepicker
This commit is contained in:
@@ -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
1
go.mod
@@ -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
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/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=
|
||||||
|
|||||||
Reference in New Issue
Block a user