// Package ui — контроллер и представления десктопного интерфейса (Fyne). // // Слой обмена с ядром: однонаправленный поток (спец 12.2–12.5). // - Core мутирует состояние; UI только читает снимки и реагирует на события. // - Действия UI = команды (CreateTask/ApproveTask/...), которые зовут Core. // - Подписчик шины (Controller) получает события и перекладывает их в View // (реализация Fyne) через fyne.Do — никаких прямых вызовов Fyne из core. // // Контракты компонентов-виджетов (спец 12.8): интерфейс + Nil-реализация. package ui // LogPanel — панель «Логи» (спец 12.9): поток системных логов (сырые строки). // // Содержит строки лога в буфере ограниченного размера; при превышении лимита // старые строки отбрасываются. Контейнер виджета отдаётся окну для встраивания // в таб «Логи» — реализация (Fyne) сама владеет своим виджетом. type LogPanel interface { // Append добавляет строку лога. Реализация обязана перекладывать работу // на поток Fyne (fyne.Do / fyne.DoAndWait), т.к. вызывается из горутин Hub. Append(text string) } // NilLogPanel — no-op реализация LogPanel для headless-режима и тестов. type NilLogPanel struct{} // NewNilLogPanel создаёт NilLogPanel. func NewNilLogPanel() *NilLogPanel { return &NilLogPanel{} } func (NilLogPanel) Append(string) {}