diff --git a/cmd/tui/main.go b/cmd/tui/main.go index 254e9cf..cfb33dc 100644 --- a/cmd/tui/main.go +++ b/cmd/tui/main.go @@ -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() diff --git a/go.mod b/go.mod index 5696909..45e19ea 100644 --- a/go.mod +++ b/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 diff --git a/go.sum b/go.sum index 1030bd8..c76533e 100644 --- a/go.sum +++ b/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=