Eddited Settings View

Added Interactive Settings View
This commit is contained in:
2026-05-03 20:27:14 +02:00
parent e9a6c57ff5
commit 904d5702f5

165
main.go
View File

@@ -2,20 +2,20 @@ package main
import (
"fmt"
"net"
"os"
"os/exec"
"strconv"
"strings"
"net"
"time"
"pulsegate/internal/config"
"pulsegate/internal/models"
"pulsegate/internal/secret"
"github.com/charmbracelet/bubbles/textinput"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/charmbracelet/bubbles/textinput"
"golang.org/x/term"
)
@@ -49,6 +49,9 @@ type model struct {
commandTitle string
commandError string
serverStatus map[int]string
settingsSelected int
settingsEditingTerm bool
settingsTermInput textinput.Model
}
var (
@@ -117,6 +120,7 @@ func initialModel() model {
}
m.initAddInputs()
m.initSettingsInput()
return m
}
@@ -161,6 +165,16 @@ func (m *model) initAddInputs() {
}
}
func (m *model) initSettingsInput() {
input := textinput.New()
input.Placeholder = "TERM Override"
input.CharLimit = 80
input.Width = 32
input.SetValue(m.cfg.Settings.Terminal.Term)
m.settingsTermInput = input
}
func (m *model) saveNewServer() error {
port, err := strconv.Atoi(m.addInputs[3].Value())
if err != nil {
@@ -326,6 +340,74 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
}
if m.view == ViewSettings {
if m.settingsEditingTerm {
switch msg.String() {
case "ctrl+c":
return m, tea.Quit
case "esc":
m.settingsEditingTerm = false
m.settingsTermInput.Blur()
m.settingsTermInput.SetValue(m.cfg.Settings.Terminal.Term)
return m, nil
case "enter":
m.cfg.Settings.Terminal.Term = strings.TrimSpace(m.settingsTermInput.Value())
if err := m.saveSettings(); err != nil {
m.err = err
}
m.settingsEditingTerm = false
m.settingsTermInput.Blur()
return m, nil
}
var cmd tea.Cmd
m.settingsTermInput, cmd = m.settingsTermInput.Update(msg)
return m, cmd
}
switch msg.String() {
case "ctrl+c":
return m, tea.Quit
case "q", "esc":
m.view = ViewServers
return m, nil
case "up", "k":
if m.settingsSelected > 0 {
m.settingsSelected--
}
return m, nil
case "down", "j":
if m.settingsSelected < settingsOptionCount()-1 {
m.settingsSelected++
}
return m, nil
case "enter", " ":
switch m.settingsSelected {
case 0:
m.cfg.Settings.Terminal.EnableKittyFix = !m.cfg.Settings.Terminal.EnableKittyFix
if err := m.saveSettings(); err != nil {
m.err = err
}
case 1:
m.settingsEditingTerm = true
m.settingsTermInput.SetValue(m.cfg.Settings.Terminal.Term)
m.settingsTermInput.Focus()
case 2:
m.cfg.Settings.Theme = nextTheme(m.cfg.Settings.Theme)
if err := m.saveSettings(); err != nil {
m.err = err
}
}
return m, nil
}
}
// Normale Navigation
switch msg.String() {
case "ctrl+c":
@@ -370,6 +452,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case "s":
m.view = ViewSettings
m.settingsEditingTerm = false
m.settingsTermInput.Blur()
return m, nil
case "h":
@@ -586,19 +670,57 @@ func (m model) renderServerList() string {
}
func (m model) renderSettingsContent() string {
kittyValue := "aus"
if m.cfg.Settings.Terminal.EnableKittyFix {
kittyValue = "an"
}
termValue := m.cfg.Settings.Terminal.Term
if termValue == "" {
termValue = "xterm-256color"
}
themeValue := m.cfg.Settings.Theme
if themeValue == "" {
themeValue = "neon-green"
}
options := []string{
fmt.Sprintf("Kitty Fix global: %s", kittyValue),
fmt.Sprintf("TERM Override: %s", termValue),
fmt.Sprintf("Theme: %s", themeValue),
}
lines := []string{
badgeStyle.Render(" SETTINGS "),
"",
selectedStyle.Render("Terminal"),
fmt.Sprintf(" Kitty Fix global: %v", m.cfg.Settings.Terminal.EnableKittyFix),
fmt.Sprintf(" TERM Override: %s", m.cfg.Settings.Terminal.Term),
}
for i, option := range options {
if i == 1 && m.settingsEditingTerm {
option = "TERM Override: " + m.settingsTermInput.View()
}
if i == m.settingsSelected {
lines = append(lines, selectedStyle.Render("> "+option))
} else {
lines = append(lines, normalStyle.Render(" "+option))
}
}
lines = append(lines,
"",
selectedStyle.Render("Hinweis"),
" Wenn Kitty Fix aktiv ist, startet SSH mit TERM=xterm-256color.",
" Wenn Kitty Fix aktiv ist, startet SSH mit dem gewählten TERM-Wert.",
" Das verhindert auf Ubuntu/Debian oft:",
" 'Error opening terminal: xterm-kitty'",
"",
mutedStyle.Render("Später bauen wir hier Toggle-Optionen mit Enter ein."),
mutedStyle.Render("↑/↓ Auswahl Enter/Space ändern Esc/q zurück"),
)
if m.settingsEditingTerm {
lines = append(lines, mutedStyle.Render("TERM bearbeiten: Enter speichern Esc abbrechen"))
}
return panelStyle.
@@ -607,6 +729,35 @@ func (m model) renderSettingsContent() string {
Render(strings.Join(lines, "\n"))
}
func settingsOptionCount() int {
return 3
}
func nextTheme(current string) string {
themes := []string{"neon-green", "cyan", "plain"}
for i, theme := range themes {
if current == theme {
return themes[(i+1)%len(themes)]
}
}
return themes[0]
}
func (m *model) saveSettings() error {
if m.cfg.Settings.Terminal.Term == "" {
m.cfg.Settings.Terminal.Term = "xterm-256color"
m.settingsTermInput.SetValue(m.cfg.Settings.Terminal.Term)
}
if m.cfg.Settings.Theme == "" {
m.cfg.Settings.Theme = "neon-green"
}
return config.SaveConfig(getConfigPath(), m.cfg)
}
func (m model) renderHelpContent() string {
lines := []string{
badgeStyle.Render(" HELP "),
@@ -731,7 +882,6 @@ func max(a, b int) int {
return b
}
func (m *model) loadServerIntoForm(server models.Server) {
m.initAddInputs()
@@ -822,7 +972,6 @@ func (m *model) deleteSelectedServer() error {
return nil
}
func (m model) renderEditServerContent() string {
return m.renderServerFormContent(" EDIT SERVER ", "Server bearbeiten")
}