Спеца 12.10: интерфейс + Nil + TaskTitle в internal/ui/task_list_panel.go, Fyne-реализация в internal/ui/desktop/task_list_panel.go. Состояние выбора живёт в окне; выбранная строка подсвечивается (Select/Unselect).
40 lines
1.7 KiB
Go
40 lines
1.7 KiB
Go
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)
|
|
} |