feat: 模块7 - 多行输入支持 (textarea替换textinput)
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user