Спеца 12.12: интерфейс + Nil + FormatRole в internal/ui/chat_panel.go, Fyne-реализация в internal/ui/desktop/chat_panel.go (транскрипт + композитор). Окно как chat.Channel рендерит Send/Ask/историю через Append; state_panel не трогаем.
39 lines
1.7 KiB
Go
39 lines
1.7 KiB
Go
package ui
|
|
|
|
// ChatPanel — панель «Диалог» (спец 12.12): транскрипт диалога выбранной
|
|
// задачи + композитор (поле ввода и кнопки команд).
|
|
//
|
|
// Транскрипт — буфер ограниченного размера; при превышении лимита старые
|
|
// строки отбрасываются. Композитор подключается к ui.Commands через
|
|
// SetCommands. Обновление — на потоке Fyne; вызывающий уже внутри fyne.Do.
|
|
type ChatPanel interface {
|
|
// SetTranscript заменяет содержимое диалога полным рендером.
|
|
SetTranscript(text string)
|
|
// Append добавляет строку в диалог (буфер ограничен).
|
|
Append(text string)
|
|
// Clear очищает диалог (задача недоступна/не выбрана).
|
|
Clear()
|
|
// SetCommands подключает команды к композитору (ввод + кнопки).
|
|
SetCommands(c *Commands)
|
|
}
|
|
|
|
// NilChatPanel — no-op реализация ChatPanel для headless-режима и тестов.
|
|
type NilChatPanel struct{}
|
|
|
|
// NewNilChatPanel создаёт NilChatPanel.
|
|
func NewNilChatPanel() *NilChatPanel { return &NilChatPanel{} }
|
|
|
|
func (NilChatPanel) SetTranscript(string) {}
|
|
func (NilChatPanel) Append(string) {}
|
|
func (NilChatPanel) Clear() {}
|
|
func (NilChatPanel) SetCommands(*Commands) {}
|
|
|
|
// FormatRole — строка роли в диалоге (pure-функция, спец 12.12).
|
|
func FormatRole(role string) string {
|
|
switch role {
|
|
case "user":
|
|
return "👤 "
|
|
default:
|
|
return "🤖 "
|
|
}
|
|
} |