Files
agent-chain/internal/tui/update.go
T

161 lines
3.3 KiB
Go

package tui
import (
"fmt"
"learning-assistant/internal/ai/generators"
"learning-assistant/internal/clipboard"
"strings"
tea "github.com/charmbracelet/bubbletea"
)
// handleKeyPress 处理按键
func (m Model) handleKeyPress(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
switch m.state {
case StateInput:
return m.handleInputKey(msg)
case StateResult:
return m.handleResultKey(msg)
default:
return m, nil
}
}
// handleInputKey 处理输入状态下的按键
func (m Model) handleInputKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
switch msg.Type {
case tea.KeyCtrlC:
return m, tea.Quit
case tea.KeyEnter:
input := strings.TrimSpace(m.inputText)
if input == "" {
return m, nil
}
// 切换到加载状态
m.state = StateLoading
// 启动5个生成器
return m, m.startGeneration()
case tea.KeyBackspace:
// 退格键处理
if len(m.inputText) > 0 {
m.inputText = m.inputText[:len(m.inputText)-1]
}
return m, nil
case tea.KeyRunes:
// 普通字符输入
m.inputText += string(msg.Runes)
return m, nil
default:
return m, nil
}
}
// handleResultKey 处理结果状态下的按键
func (m Model) handleResultKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
switch msg.Type {
case tea.KeyCtrlC, tea.KeyCtrlQ:
return m, tea.Quit
case tea.KeyLeft:
m.activeTab = (m.activeTab - 1 + len(m.tabs)) % len(m.tabs)
return m, nil
case tea.KeyRight:
m.activeTab = (m.activeTab + 1) % len(m.tabs)
return m, nil
default:
return m, nil
}
}
// startGeneration 开始生成内容
func (m Model) startGeneration() tea.Cmd {
resultChan := make(chan generators.GenerateResult, 5)
// 启动5个生成器
generatorTypes := []generators.GeneratorType{
generators.GeneratorMermaid,
generators.GeneratorGuodegang,
generators.GeneratorQuiz,
generators.GeneratorCard,
generators.GeneratorScenario,
}
for _, genType := range generatorTypes {
go func(gt generators.GeneratorType) {
m.generator.Generate(gt, m.inputText, resultChan)
}(genType)
}
// 立即启动一个命令来监听结果
return func() tea.Msg {
for range generatorTypes {
result := <-resultChan
if result.Error != nil {
return errorMessage{
Type: result.Type,
Error: result.Error,
}
}
return contentMsg{
Type: result.Type,
Content: result.Content,
}
}
return nil
}
}
// handleContentResult 处理内容生成结果
func (m Model) handleContentResult(msg contentMsg) (tea.Model, tea.Cmd) {
m.loadingStatus[msg.Type] = true
switch msg.Type {
case generators.GeneratorGuodegang:
m.results[TabGuodegang] = msg.Content
case generators.GeneratorQuiz:
m.results[TabQuiz] = msg.Content
case generators.GeneratorCard:
m.results[TabCard] = msg.Content
case generators.GeneratorScenario:
m.results[TabScenario] = msg.Content
case generators.GeneratorMermaid:
// Mermaid复制到剪切板
clipboard.Write(msg.Content)
}
// 检查是否全部完成
allDone := true
for _, done := range m.loadingStatus {
if !done {
allDone = false
break
}
}
if allDone {
m.state = StateResult
}
return m, nil
}
// handleError 处理错误
func (m Model) handleError(msg errorMessage) (tea.Model, tea.Cmd) {
m.state = StateError
m.errorMsg = fmt.Sprintf("生成失败: %v", msg.Error)
return m, nil
}
// handleInput 处理用户输入
func (m *Model) handleInput(input string) {
m.inputText = strings.TrimSpace(input)
}