mirror of
https://github.com/go-task/task.git
synced 2026-06-29 07:34:18 +00:00
feat: getting starting with a tui
This commit is contained in:
43
internal/tui/list.go
Normal file
43
internal/tui/list.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/charmbracelet/bubbles/v2/list"
|
||||
"github.com/charmbracelet/bubbles/v2/spinner"
|
||||
tea "github.com/charmbracelet/bubbletea/v2"
|
||||
)
|
||||
|
||||
type listModel struct {
|
||||
spinner spinner.Model
|
||||
list list.Model
|
||||
selectedIndex int
|
||||
isLoading bool
|
||||
}
|
||||
|
||||
func newListModel() listModel {
|
||||
return listModel{
|
||||
spinner: newSpinner(),
|
||||
list: list.New([]list.Item{}, list.NewDefaultDelegate(), 0, 0),
|
||||
isLoading: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (m listModel) Init() tea.Cmd {
|
||||
return m.spinner.Tick
|
||||
}
|
||||
|
||||
func (m listModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
var cmd tea.Cmd
|
||||
m.spinner, cmd = m.spinner.Update(msg)
|
||||
return m, cmd
|
||||
}
|
||||
|
||||
func (m listModel) View() string {
|
||||
switch {
|
||||
case m.isLoading:
|
||||
return fmt.Sprintf("%s %s", m.spinner.View(), "Loading tasks...")
|
||||
default:
|
||||
return "todo!"
|
||||
}
|
||||
}
|
||||
59
internal/tui/main.go
Normal file
59
internal/tui/main.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
tea "github.com/charmbracelet/bubbletea/v2"
|
||||
)
|
||||
|
||||
type page int
|
||||
|
||||
const (
|
||||
pageList = iota + 1
|
||||
)
|
||||
|
||||
type mainModel struct {
|
||||
page page
|
||||
listPage listModel
|
||||
isQuitting bool
|
||||
}
|
||||
|
||||
func newMainModel() mainModel {
|
||||
return mainModel{
|
||||
page: pageList,
|
||||
listPage: newListModel(),
|
||||
}
|
||||
}
|
||||
|
||||
func (m mainModel) Init() tea.Cmd {
|
||||
return m.listPage.Init()
|
||||
}
|
||||
|
||||
func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
switch msg := msg.(type) {
|
||||
case tea.KeyMsg:
|
||||
switch msg.String() {
|
||||
case "ctrl+c", "ctrl+q":
|
||||
m.isQuitting = true
|
||||
return m, tea.Quit
|
||||
}
|
||||
}
|
||||
|
||||
switch m.page {
|
||||
case pageList:
|
||||
model, cmd := m.listPage.Update(msg)
|
||||
m.listPage = model.(listModel)
|
||||
return m, cmd
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (m mainModel) View() string {
|
||||
switch {
|
||||
case m.isQuitting:
|
||||
return "Quitting..."
|
||||
case m.page == pageList:
|
||||
return m.listPage.View()
|
||||
default:
|
||||
return "..."
|
||||
}
|
||||
}
|
||||
16
internal/tui/spinner.go
Normal file
16
internal/tui/spinner.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"github.com/charmbracelet/bubbles/v2/spinner"
|
||||
"github.com/charmbracelet/lipgloss/v2"
|
||||
"github.com/charmbracelet/x/exp/charmtone"
|
||||
)
|
||||
|
||||
var spinnerStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(charmtone.Violet.Hex()))
|
||||
|
||||
func newSpinner() spinner.Model {
|
||||
return spinner.New(
|
||||
spinner.WithSpinner(spinner.MiniDot),
|
||||
spinner.WithStyle(spinnerStyle),
|
||||
)
|
||||
}
|
||||
13
internal/tui/tui.go
Normal file
13
internal/tui/tui.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
tea "github.com/charmbracelet/bubbletea/v2"
|
||||
)
|
||||
|
||||
func Run() error {
|
||||
m := newMainModel()
|
||||
p := tea.NewProgram(m)
|
||||
|
||||
_, err := p.Run()
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user