feat: 模块7 - 多行输入支持 (textarea替换textinput)

This commit is contained in:
2026-04-06 05:39:21 +08:00
parent 59f9c6de18
commit 5fb0d5c58b
4 changed files with 167 additions and 31 deletions

View File

@@ -3,7 +3,7 @@ package tui
import (
"context"
"github.com/charmbracelet/bubbles/textinput"
"github.com/charmbracelet/bubbles/textarea"
"github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/titor/fanyi/internal/config"
@@ -13,7 +13,7 @@ import (
type model struct {
config *config.Config
translator *translator.Translator
textInput textinput.Model
textArea textarea.Model
result string
errMsg string
targetLang string
@@ -34,7 +34,8 @@ var (
Foreground(lipgloss.Color("#00D9FF"))
inputStyle = lipgloss.NewStyle().
Foreground(lipgloss.Color("#FAFAFA")).
Background(lipgloss.Color("#1A1A2E"))
Background(lipgloss.Color("#1A1A2E")).
Width(50)
resultStyle = lipgloss.NewStyle().
Foreground(lipgloss.Color("#98FB98")).
Background(lipgloss.Color("#0D1B2A"))
@@ -64,16 +65,17 @@ func NewApp(cfg *config.Config, t *translator.Translator) *tea.Program {
targetLang = cfg.DefaultTargetLang
}
ti := textinput.New()
ti.Placeholder = "输入要翻译的文本..."
ti.Focus()
ti.Prompt = "> "
ti.TextStyle = inputStyle
ta := textarea.New()
ta.Placeholder = "输入要翻译的文本..."
ta.Focus()
ta.Prompt = "| "
ta.SetWidth(50)
ta.SetHeight(5)
return tea.NewProgram(model{
config: cfg,
translator: t,
textInput: ti,
textArea: ta,
targetLang: targetLang,
})
}
@@ -103,7 +105,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if m.loading {
return m, nil
}
text := m.textInput.Value()
text := m.textArea.Value()
if text == "" {
return m, nil
}
@@ -115,7 +117,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, tea.Quit
case tea.KeyCtrlL:
m.textInput.SetValue("")
m.textArea.SetValue("")
m.result = ""
m.errMsg = ""
return m, nil
@@ -130,7 +132,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
}
m.textInput, cmd = m.textInput.Update(msg)
m.textArea, cmd = m.textArea.Update(msg)
return m, cmd
}
@@ -153,39 +155,33 @@ func (m model) doTranslate(text, toLang string) tea.Cmd {
func (m model) View() string {
resultBox := m.renderResult()
helpText := helpStyle.Render("\n " +
keyStyle.Render("Ctrl+L") + " 清空 " +
keyStyle.Render("Ctrl+T") + " 切换语言 " +
keyStyle.Render("Enter") + " 翻译 " +
keyStyle.Render("Ctrl+C") + " 退出")
return "\n" +
" " + headerStyle.Render("YOYO翻译") + "\n" +
" " + dividerStyle.Render("─────────────────────") + "\n\n" +
" " + m.textInput.View() + "\n\n" +
m.textArea.View() + "\n\n" +
resultBox +
helpText +
"\n" +
m.renderStatusBar()
}
func (m model) renderResult() string {
if m.loading {
return " " + loadingStyle.Render("正在翻译...") + "\n"
return " " + loadingStyle.Render("正在翻译...") + "\n\n"
}
if m.errMsg != "" {
return " " + errorStyle.Render("错误: "+m.errMsg) + "\n"
return " " + errorStyle.Render("错误: "+m.errMsg) + "\n\n"
}
if m.result == "" {
return " " + helpStyle.Render("翻译结果将显示在这里...") + "\n"
return " " + helpStyle.Render("翻译结果将显示在这里...") + "\n\n"
}
return " " + resultStyle.Render(m.result) + "\n"
return " " + resultStyle.Render(m.result) + "\n\n"
}
func (m model) renderStatusBar() string {
divider := dividerStyle.Render("─")
langInfo := langStyle.Render("目标: " + m.targetLang)
hint := helpStyle.Render("按 / 显示命令")
return "\n " + divider + "\n" +
" " + statusBarStyle.Render(" "+langInfo+" ")
return " " + divider + "\n" +
" " + statusBarStyle.Render(" "+langInfo+" ") + " " + hint
}