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"
"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()