Спеца 12.11: интерфейс + Nil + TaskDetailText в internal/ui/task_detail.go, Fyne-реализация в internal/ui/desktop/task_detail_panel.go. selectTask делегирует в панель; диалог и «Состояние» — отдельные панели, не трогаем.
54 lines
1.8 KiB
Go
54 lines
1.8 KiB
Go
//go:build cgo
|
|
|
|
package desktop
|
|
|
|
import (
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/widget"
|
|
|
|
"github.com/kamelion/ratatoskr-go/internal/storage"
|
|
"github.com/kamelion/ratatoskr-go/internal/ui"
|
|
)
|
|
|
|
// TaskDetailPanel — Fyne-реализация ui.TaskDetailPanel (спец 12.8, 12.11):
|
|
// детали выбранной задачи (заголовок, статус, детали) — верх right-сплита.
|
|
type TaskDetailPanel struct {
|
|
titleLbl *widget.Label
|
|
statusLbl *widget.Label
|
|
detailLbl *widget.Label
|
|
}
|
|
|
|
// NewTaskDetailPanel создаёт TaskDetailPanel.
|
|
func NewTaskDetailPanel() *TaskDetailPanel {
|
|
p := &TaskDetailPanel{}
|
|
p.titleLbl = widget.NewLabel("—")
|
|
p.titleLbl.TextStyle = fyne.TextStyle{Bold: true}
|
|
p.statusLbl = widget.NewLabel("")
|
|
p.statusLbl.TextStyle = fyne.TextStyle{Italic: true}
|
|
p.detailLbl = widget.NewLabel("")
|
|
p.detailLbl.Wrapping = fyne.TextWrapWord
|
|
return p
|
|
}
|
|
|
|
// Widget возвращает контейнер панели для встраивания в окно (верх right-сплита).
|
|
func (p *TaskDetailPanel) Widget() fyne.CanvasObject {
|
|
return container.NewVBox(p.titleLbl, p.statusLbl, p.detailLbl)
|
|
}
|
|
|
|
// ShowTask рендерит детали из снимка задачи (спец 12.11).
|
|
func (p *TaskDetailPanel) ShowTask(t storage.Task) {
|
|
p.titleLbl.SetText(t.Title)
|
|
p.statusLbl.SetText(string(t.Status))
|
|
p.detailLbl.SetText(ui.TaskDetailText(t))
|
|
}
|
|
|
|
// ShowEmpty сбрасывает к placeholder при недоступной задаче.
|
|
func (p *TaskDetailPanel) ShowEmpty() {
|
|
p.titleLbl.SetText("—")
|
|
p.statusLbl.SetText("")
|
|
p.detailLbl.SetText("")
|
|
}
|
|
|
|
// compile-time проверка реализации контракта.
|
|
var _ ui.TaskDetailPanel = (*TaskDetailPanel)(nil) |