package ui import ( "github.com/kamelion/ratatoskr-go/internal/storage" ) // TaskListPanel — панель «Список задач» (спец 12.10): все задачи строками. // // Данные — снимки-копии из Store (спец 12.5), заменяются через SetTasks. // Состояние выбора живёт в окне: окно зовёт Select, чтобы подсветить строку. // Контейнер виджета отдаётся окну — реализация (Fyne) сама владеет виджетом. type TaskListPanel interface { // SetTasks заменяет снимок списка и перерисовывает виджет. SetTasks(tasks []storage.Task) // Select подсвечивает строку задачи id (управляется окном). Select(id int64) // OnSelect регистрирует колбэк клика по строке (окно грузит детали). OnSelect(fn func(id int64)) } // NilTaskListPanel — no-op реализация TaskListPanel для headless-режима и тестов. type NilTaskListPanel struct { onSelect func(id int64) } // NewNilTaskListPanel создаёт NilTaskListPanel. func NewNilTaskListPanel() *NilTaskListPanel { return &NilTaskListPanel{} } func (p *NilTaskListPanel) SetTasks([]storage.Task) {} func (p *NilTaskListPanel) Select(int64) {} func (p *NilTaskListPanel) OnSelect(fn func(int64)) { p.onSelect = fn } // TaskTitle — строка задачи в списке (pure-функция, спец 12.10). func TaskTitle(t storage.Task) string { title := t.Title if title == "" { title = "(без названия)" } return title + "\n" + string(t.Status) }