Files
LazyPM/pkg/task/taskui.go
2026-02-28 22:17:55 +01:00

109 lines
2.3 KiB
Go

package task
import (
"fmt"
"strings"
"charm.land/lipgloss/v2"
"github.com/LazyBachelor/LazyPM/internal/models"
"github.com/LazyBachelor/LazyPM/internal/style"
"github.com/charmbracelet/bubbles/key"
tea "github.com/charmbracelet/bubbletea"
)
type TaskDetails = models.TaskDetails
type TaskModel struct {
TaskDetails
keys TaskHelpKeys
width, height int
userQuit bool
}
type TaskHelpKeys struct {
Quit key.Binding
Start key.Binding
}
var DefaultTaskKeys = TaskHelpKeys{
Quit: key.NewBinding(
key.WithKeys("q", "ctrl+c"),
key.WithHelp("q", "Quit"),
),
Start: key.NewBinding(
key.WithKeys("enter"),
key.WithHelp("enter", "Start"),
),
}
func NewTaskModel(details TaskDetails) TaskModel {
return TaskModel{
TaskDetails: details,
keys: DefaultTaskKeys,
}
}
func (m TaskModel) Init() tea.Cmd {
return nil
}
func (m TaskModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.WindowSizeMsg:
m.SetSize(msg.Width, msg.Height)
case tea.KeyMsg:
switch {
case key.Matches(msg, m.keys.Quit):
m.userQuit = true
return m, tea.Quit
case key.Matches(msg, m.keys.Start):
return m, tea.Quit
}
}
return m, nil
}
func (m TaskModel) View() string {
if m.width < 55 || m.height < 16 {
return lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center,
style.TextStyle.Render("Terminal too small."))
}
boxWidth := min(m.width-10, 80)
detailsText := fmt.Sprintf("Time to complete: %s | Difficulty: %s", m.TimeToComplete, m.Difficulty)
boxStyle := style.BorderStyle.
Margin(1, 0).Padding(2, 4).Width(boxWidth)
var b strings.Builder
b.WriteString(style.TitleStyle.Render(m.Title))
b.WriteString("\n")
content := lipgloss.JoinVertical(
lipgloss.Center,
style.TextStyle.Render(m.Description),
"\n",
style.TextStyle.Foreground(style.SecondaryColor).Render(detailsText),
)
b.WriteString(boxStyle.Render(content))
b.WriteString("\n")
helpText := "Press " + m.keys.Start.Help().Key + " to start • " + m.keys.Quit.Help().Key + " to quit"
b.WriteString(style.HelpStyle.Render(helpText))
final := lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center, b.String())
return final
}
func (m *TaskModel) SetSize(width, height int) {
m.width, m.height = width, height
}
func (m TaskModel) GetUserQuit() bool {
return m.userQuit
}