refactor(ui): вынести панель «Диалог» (ChatPanel) из монолита окна
Спеца 12.12: интерфейс + Nil + FormatRole в internal/ui/chat_panel.go, Fyne-реализация в internal/ui/desktop/chat_panel.go (транскрипт + композитор). Окно как chat.Channel рендерит Send/Ask/историю через Append; state_panel не трогаем.
This commit is contained in:
39
internal/ui/chat_panel.go
Normal file
39
internal/ui/chat_panel.go
Normal file
@@ -0,0 +1,39 @@
|
||||
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 "🤖 "
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user