Adding new task menu, better tab bar ui using lipgloss

This commit is contained in:
june 2025-03-09 10:40:37 +13:00
parent 4d2028cd01
commit ac37f53069
Signed by untrusted user who does not match committer: breadone
GPG Key ID: FDC19FE143200483
4 changed files with 32 additions and 11 deletions

View File

@ -2,7 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/charmbracelet/lipgloss"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
) )
@ -12,6 +12,8 @@ func (m model) Init() tea.Cmd {
} }
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
switch msg := msg.(type) { switch msg := msg.(type) {
// Is it a key press? // Is it a key press?
@ -26,23 +28,23 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
// The "up" and "k" keys move the cursor up // The "up" and "k" keys move the cursor up
case "up", "k": case "up", "k":
if m.cursor > 0 { if m.cursor > 0 && !m.addTask {
m.cursor-- m.cursor--
} }
// The "down" and "j" keys move the cursor down // The "down" and "j" keys move the cursor down
case "down", "j": case "down", "j":
if m.cursor < len(m.todos)-1 { if m.cursor < len(m.todos)-1 && !m.addTask {
m.cursor++ m.cursor++
} }
case "left", "h": case "left", "h":
if m.tab > 0 { if m.tab > 0 && !m.addTask {
m.tab-- m.tab--
} }
case "right", "l": case "right", "l":
if m.tab < 4 { if m.tab < 4 && !m.addTask {
m.tab++ m.tab++
} }
@ -65,9 +67,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
} }
} }
m.textinput, cmd = m.textinput.Update(msg)
// Return the updated model to the Bubble Tea runtime for processing. // Return the updated model to the Bubble Tea runtime for processing.
// Note that we're not returning a command. // Note that we're not returning a command.
return m, nil return m, cmd
} }
func (m model) View() string { func (m model) View() string {
@ -111,22 +115,26 @@ func (m model) View() string {
s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice) s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice)
} }
// render tab bar
for i, v := range []string{"Inbox", "Today", "Tomorrow", "Scheduled", "Anytime"} { for i, v := range []string{"Inbox", "Today", "Tomorrow", "Scheduled", "Anytime"} {
if i == m.tab { if i == m.tab {
s += fmt.Sprintf("**%s** ", v) s += lipgloss.NewStyle().Bold(true).Render(fmt.Sprintf("%s ", v))
} else { } else {
s += fmt.Sprintf("%s ", v) s += fmt.Sprintf("%s ", v)
} }
} }
// The footer // The footer
s += "\nn: new\n" s += "\nn: new"
s += "q: quit.\n"
if m.addTask { if m.addTask {
s += ": >"
m.textinput.Prompt = "New Task..."
s += m.textinput.View()
} }
s += "\nq: quit.\n"
// Send the UI for rendering // Send the UI for rendering
return s return s
} }

6
go.mod
View File

@ -2,9 +2,13 @@ module breadone/gotd
go 1.24.1 go 1.24.1
require github.com/charmbracelet/bubbletea v1.3.4 require (
github.com/charmbracelet/bubbles v0.20.0
github.com/charmbracelet/bubbletea v1.3.4
)
require ( require (
github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/charmbracelet/lipgloss v1.0.0 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect github.com/charmbracelet/x/ansi v0.8.0 // indirect

4
go.sum
View File

@ -1,5 +1,9 @@
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=

View File

@ -1,5 +1,9 @@
package main package main
import (
"github.com/charmbracelet/bubbles/textinput"
)
type todo struct { type todo struct {
name string name string
done bool done bool
@ -16,6 +20,7 @@ type model struct {
selected map[int]struct{} // which to-do items are selected selected map[int]struct{} // which to-do items are selected
tab int // which tab is selected tab int // which tab is selected
addTask bool // defines if the new task window is shown addTask bool // defines if the new task window is shown
textinput textinput.Model
} }
func initialModel() model { func initialModel() model {