Handle UDAs for editing; Fix layout; Add annotations
This commit is contained in:
@ -15,7 +15,7 @@ type Common struct {
|
||||
TW taskwarrior.TaskWarrior
|
||||
Keymap *Keymap
|
||||
Styles *Styles
|
||||
Udas []string
|
||||
Udas []taskwarrior.Uda
|
||||
|
||||
pageStack *Stack[Component]
|
||||
width int
|
||||
@ -54,5 +54,11 @@ func (c *Common) PushPage(page Component) {
|
||||
}
|
||||
|
||||
func (c *Common) PopPage() (Component, error) {
|
||||
return c.pageStack.Pop()
|
||||
component, err := c.pageStack.Pop()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
component.SetSize(c.width, c.height)
|
||||
return component, nil
|
||||
}
|
||||
|
||||
200
common/styles.go
200
common/styles.go
@ -20,6 +20,8 @@ type TableStyle struct {
|
||||
}
|
||||
|
||||
type Styles struct {
|
||||
Colors map[string]*lipgloss.Style
|
||||
|
||||
Base lipgloss.Style
|
||||
|
||||
Form *huh.Theme
|
||||
@ -28,61 +30,22 @@ type Styles struct {
|
||||
ColumnFocused lipgloss.Style
|
||||
ColumnBlurred lipgloss.Style
|
||||
ColumnInsert lipgloss.Style
|
||||
|
||||
Colors map[string]lipgloss.Style
|
||||
|
||||
// TODO: make color config completely dynamic to account for keyword., project., tag. and uda. colors
|
||||
Active lipgloss.Style
|
||||
Alternate lipgloss.Style
|
||||
Blocked lipgloss.Style
|
||||
Blocking lipgloss.Style
|
||||
BurndownDone lipgloss.Style
|
||||
BurndownPending lipgloss.Style
|
||||
BurndownStarted lipgloss.Style
|
||||
CalendarDue lipgloss.Style
|
||||
CalendarDueToday lipgloss.Style
|
||||
CalendarHoliday lipgloss.Style
|
||||
CalendarOverdue lipgloss.Style
|
||||
CalendarScheduled lipgloss.Style
|
||||
CalendarToday lipgloss.Style
|
||||
CalendarWeekend lipgloss.Style
|
||||
CalendarWeeknumber lipgloss.Style
|
||||
Completed lipgloss.Style
|
||||
Debug lipgloss.Style
|
||||
Deleted lipgloss.Style
|
||||
Due lipgloss.Style
|
||||
DueToday lipgloss.Style
|
||||
Error lipgloss.Style
|
||||
Footnote lipgloss.Style
|
||||
Header lipgloss.Style
|
||||
HistoryAdd lipgloss.Style
|
||||
HistoryDelete lipgloss.Style
|
||||
HistoryDone lipgloss.Style
|
||||
Label lipgloss.Style
|
||||
LabelSort lipgloss.Style
|
||||
Overdue lipgloss.Style
|
||||
ProjectNone lipgloss.Style
|
||||
Recurring lipgloss.Style
|
||||
Scheduled lipgloss.Style
|
||||
SummaryBackground lipgloss.Style
|
||||
SummaryBar lipgloss.Style
|
||||
SyncAdded lipgloss.Style
|
||||
SyncChanged lipgloss.Style
|
||||
SyncRejected lipgloss.Style
|
||||
TagNext lipgloss.Style
|
||||
TagNone lipgloss.Style
|
||||
Tagged lipgloss.Style
|
||||
UdaPriorityH lipgloss.Style
|
||||
UdaPriorityL lipgloss.Style
|
||||
UdaPriorityM lipgloss.Style
|
||||
UndoAfter lipgloss.Style
|
||||
UndoBefore lipgloss.Style
|
||||
Until lipgloss.Style
|
||||
Warning lipgloss.Style
|
||||
}
|
||||
|
||||
func NewStyles(config *taskwarrior.TWConfig) *Styles {
|
||||
styles := parseColors(config.GetConfig())
|
||||
styles := Styles{}
|
||||
|
||||
colors := make(map[string]*lipgloss.Style)
|
||||
|
||||
for key, value := range config.GetConfig() {
|
||||
if strings.HasPrefix(key, "color.") {
|
||||
_, color, _ := strings.Cut(key, ".")
|
||||
colors[color] = parseColorString(value)
|
||||
}
|
||||
}
|
||||
|
||||
styles.Colors = colors
|
||||
|
||||
styles.Base = lipgloss.NewStyle()
|
||||
|
||||
styles.TableStyle = TableStyle{
|
||||
@ -94,11 +57,12 @@ func NewStyles(config *taskwarrior.TWConfig) *Styles {
|
||||
|
||||
formTheme := huh.ThemeBase()
|
||||
formTheme.Focused.Title = formTheme.Focused.Title.Bold(true)
|
||||
formTheme.Focused.SelectSelector = formTheme.Focused.SelectSelector.SetString("> ")
|
||||
formTheme.Focused.SelectSelector = formTheme.Focused.SelectSelector.SetString("→ ")
|
||||
formTheme.Focused.SelectedOption = formTheme.Focused.SelectedOption.Bold(true)
|
||||
formTheme.Focused.MultiSelectSelector = formTheme.Focused.MultiSelectSelector.SetString("> ")
|
||||
formTheme.Focused.MultiSelectSelector = formTheme.Focused.MultiSelectSelector.SetString("→ ")
|
||||
formTheme.Focused.SelectedPrefix = formTheme.Focused.SelectedPrefix.SetString("✓ ")
|
||||
formTheme.Focused.UnselectedPrefix = formTheme.Focused.SelectedPrefix.SetString("• ")
|
||||
formTheme.Blurred.Title = formTheme.Blurred.Title.Bold(true)
|
||||
formTheme.Blurred.SelectSelector = formTheme.Blurred.SelectSelector.SetString(" ")
|
||||
formTheme.Blurred.SelectedOption = formTheme.Blurred.SelectedOption.Bold(true)
|
||||
formTheme.Blurred.MultiSelectSelector = formTheme.Blurred.MultiSelectSelector.SetString(" ")
|
||||
@ -107,131 +71,23 @@ func NewStyles(config *taskwarrior.TWConfig) *Styles {
|
||||
|
||||
styles.Form = formTheme
|
||||
|
||||
styles.ColumnFocused = lipgloss.NewStyle().Width(50).Height(30).Border(lipgloss.DoubleBorder(), true)
|
||||
styles.ColumnBlurred = lipgloss.NewStyle().Width(50).Height(30).Border(lipgloss.HiddenBorder(), true)
|
||||
styles.ColumnInsert = lipgloss.NewStyle().Width(50).Height(30).Border(lipgloss.DoubleBorder(), true).BorderForeground(styles.Active.GetForeground())
|
||||
|
||||
return styles
|
||||
}
|
||||
|
||||
func parseColors(config map[string]string) *Styles {
|
||||
styles := Styles{}
|
||||
colors := make(map[string]lipgloss.Style)
|
||||
|
||||
for key, value := range config {
|
||||
if strings.HasPrefix(key, "color.") {
|
||||
_, colorValue, _ := strings.Cut(key, ".")
|
||||
colors[colorValue] = parseColorString(value)
|
||||
switch colorValue {
|
||||
case "active":
|
||||
styles.Active = parseColorString(value)
|
||||
case "alternate":
|
||||
styles.Alternate = parseColorString(value)
|
||||
case "blocked":
|
||||
styles.Blocked = parseColorString(value)
|
||||
case "blocking":
|
||||
styles.Blocking = parseColorString(value)
|
||||
case "burndown.done":
|
||||
styles.BurndownDone = parseColorString(value)
|
||||
case "burndown.pending":
|
||||
styles.BurndownPending = parseColorString(value)
|
||||
case "burndown.started":
|
||||
styles.BurndownStarted = parseColorString(value)
|
||||
case "calendar.due":
|
||||
styles.CalendarDue = parseColorString(value)
|
||||
case "calendar.due.today":
|
||||
styles.CalendarDueToday = parseColorString(value)
|
||||
case "calendar.holiday":
|
||||
styles.CalendarHoliday = parseColorString(value)
|
||||
case "calendar.overdue":
|
||||
styles.CalendarOverdue = parseColorString(value)
|
||||
case "calendar.scheduled":
|
||||
styles.CalendarScheduled = parseColorString(value)
|
||||
case "calendar.today":
|
||||
styles.CalendarToday = parseColorString(value)
|
||||
case "calendar.weekend":
|
||||
styles.CalendarWeekend = parseColorString(value)
|
||||
case "calendar.weeknumber":
|
||||
styles.CalendarWeeknumber = parseColorString(value)
|
||||
case "completed":
|
||||
styles.Completed = parseColorString(value)
|
||||
case "debug":
|
||||
styles.Debug = parseColorString(value)
|
||||
case "deleted":
|
||||
styles.Deleted = parseColorString(value)
|
||||
case "due":
|
||||
styles.Due = parseColorString(value)
|
||||
case "due.today":
|
||||
styles.DueToday = parseColorString(value)
|
||||
case "error":
|
||||
styles.Error = parseColorString(value)
|
||||
case "footnote":
|
||||
styles.Footnote = parseColorString(value)
|
||||
case "header":
|
||||
styles.Header = parseColorString(value)
|
||||
case "history.add":
|
||||
styles.HistoryAdd = parseColorString(value)
|
||||
case "history.delete":
|
||||
styles.HistoryDelete = parseColorString(value)
|
||||
case "history.done":
|
||||
styles.HistoryDone = parseColorString(value)
|
||||
case "label":
|
||||
styles.Label = parseColorString(value)
|
||||
case "label.sort":
|
||||
styles.LabelSort = parseColorString(value)
|
||||
case "overdue":
|
||||
styles.Overdue = parseColorString(value)
|
||||
case "project.none":
|
||||
styles.ProjectNone = parseColorString(value)
|
||||
case "recurring":
|
||||
styles.Recurring = parseColorString(value)
|
||||
case "scheduled":
|
||||
styles.Scheduled = parseColorString(value)
|
||||
case "summary.background":
|
||||
styles.SummaryBackground = parseColorString(value)
|
||||
case "summary.bar":
|
||||
styles.SummaryBar = parseColorString(value)
|
||||
case "sync.added":
|
||||
styles.SyncAdded = parseColorString(value)
|
||||
case "sync.changed":
|
||||
styles.SyncChanged = parseColorString(value)
|
||||
case "sync.rejected":
|
||||
styles.SyncRejected = parseColorString(value)
|
||||
case "tag.next":
|
||||
styles.TagNext = parseColorString(value)
|
||||
case "tag.none":
|
||||
styles.TagNone = parseColorString(value)
|
||||
case "tagged":
|
||||
styles.Tagged = parseColorString(value)
|
||||
case "uda.priority.H":
|
||||
styles.UdaPriorityH = parseColorString(value)
|
||||
case "uda.priority.L":
|
||||
styles.UdaPriorityL = parseColorString(value)
|
||||
case "uda.priority.M":
|
||||
styles.UdaPriorityM = parseColorString(value)
|
||||
case "undo.after":
|
||||
styles.UndoAfter = parseColorString(value)
|
||||
case "undo.before":
|
||||
styles.UndoBefore = parseColorString(value)
|
||||
case "until":
|
||||
styles.Until = parseColorString(value)
|
||||
case "warning":
|
||||
styles.Warning = parseColorString(value)
|
||||
}
|
||||
}
|
||||
styles.ColumnFocused = lipgloss.NewStyle().Border(lipgloss.RoundedBorder(), true).Padding(1)
|
||||
styles.ColumnBlurred = lipgloss.NewStyle().Border(lipgloss.HiddenBorder(), true).Padding(1)
|
||||
styles.ColumnInsert = lipgloss.NewStyle().Border(lipgloss.RoundedBorder(), true).Padding(1)
|
||||
if styles.Colors["active"] != nil {
|
||||
styles.ColumnInsert = styles.ColumnInsert.BorderForeground(styles.Colors["active"].GetForeground())
|
||||
}
|
||||
|
||||
styles.Colors = colors
|
||||
|
||||
return &styles
|
||||
}
|
||||
|
||||
func parseColorString(color string) lipgloss.Style {
|
||||
style := lipgloss.NewStyle()
|
||||
func parseColorString(color string) *lipgloss.Style {
|
||||
if color == "" {
|
||||
return style
|
||||
return nil
|
||||
}
|
||||
|
||||
style := lipgloss.NewStyle()
|
||||
|
||||
if strings.Contains(color, "on") {
|
||||
fgbg := strings.Split(color, "on")
|
||||
fg := strings.TrimSpace(fgbg[0])
|
||||
@ -246,7 +102,7 @@ func parseColorString(color string) lipgloss.Style {
|
||||
style = style.Foreground(parseColor(strings.TrimSpace(color)))
|
||||
}
|
||||
|
||||
return style
|
||||
return &style
|
||||
}
|
||||
|
||||
func parseColor(color string) lipgloss.Color {
|
||||
|
||||
Reference in New Issue
Block a user