forked from Mirrors/bubbletea
Every sends the time at which the timer ticked
This commit is contained in:
parent
ac67237eab
commit
d503d5dbf6
|
@ -12,7 +12,11 @@ import (
|
||||||
|
|
||||||
type model int
|
type model int
|
||||||
|
|
||||||
type tickMsg struct{}
|
type tickMsg time.Time
|
||||||
|
|
||||||
|
func newTickMsg(t time.Time) tea.Msg {
|
||||||
|
return tickMsg(t)
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
tea.AltScreen()
|
tea.AltScreen()
|
||||||
|
@ -55,7 +59,7 @@ func update(message tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
|
||||||
|
|
||||||
func subscriptions(_ tea.Model) tea.Subs {
|
func subscriptions(_ tea.Model) tea.Subs {
|
||||||
return tea.Subs{
|
return tea.Subs{
|
||||||
"tick": tea.Every(time.Second, tickMsg{}),
|
"tick": tea.Every(time.Second, newTickMsg),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ type Model int
|
||||||
|
|
||||||
// Messages are events that we respond to in our Update function. This
|
// Messages are events that we respond to in our Update function. This
|
||||||
// particular one indicates that the timer has ticked.
|
// particular one indicates that the timer has ticked.
|
||||||
type TickMsg struct{}
|
type tickMsg time.Time
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Initialize our program
|
// Initialize our program
|
||||||
|
@ -41,7 +41,7 @@ func update(msg tea.Msg, model tea.Model) (tea.Model, tea.Cmd) {
|
||||||
switch msg.(type) {
|
switch msg.(type) {
|
||||||
case tea.KeyMsg:
|
case tea.KeyMsg:
|
||||||
return m, tea.Quit
|
return m, tea.Quit
|
||||||
case TickMsg:
|
case tickMsg:
|
||||||
m -= 1
|
m -= 1
|
||||||
if m <= 0 {
|
if m <= 0 {
|
||||||
return m, tea.Quit
|
return m, tea.Quit
|
||||||
|
@ -61,6 +61,8 @@ func view(model tea.Model) string {
|
||||||
// second, sends a tick, and then restarts.
|
// second, sends a tick, and then restarts.
|
||||||
func subscriptions(_ tea.Model) tea.Subs {
|
func subscriptions(_ tea.Model) tea.Subs {
|
||||||
return tea.Subs{
|
return tea.Subs{
|
||||||
"tick": tea.Every(time.Second, TickMsg{}),
|
"tick": tea.Every(time.Second, func(t time.Time) tea.Msg {
|
||||||
|
return tickMsg(t)
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,20 +12,6 @@ import (
|
||||||
"github.com/fogleman/ease"
|
"github.com/fogleman/ease"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Model contains the data for our application.
|
|
||||||
type Model struct {
|
|
||||||
Choice int
|
|
||||||
Chosen bool
|
|
||||||
Ticks int
|
|
||||||
Frames int
|
|
||||||
Progress float64
|
|
||||||
Loaded bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type tickMsg struct{}
|
|
||||||
|
|
||||||
type frameMsg struct{}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
p := tea.NewProgram(
|
p := tea.NewProgram(
|
||||||
initialize,
|
initialize,
|
||||||
|
@ -38,6 +24,32 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MSG
|
||||||
|
|
||||||
|
type tickMsg time.Time
|
||||||
|
|
||||||
|
func newTickMsg(t time.Time) tea.Msg {
|
||||||
|
return tickMsg(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
type frameMsg time.Time
|
||||||
|
|
||||||
|
func newFrameMsg(t time.Time) tea.Msg {
|
||||||
|
return frameMsg(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODEL
|
||||||
|
|
||||||
|
// Model contains the data for our application.
|
||||||
|
type Model struct {
|
||||||
|
Choice int
|
||||||
|
Chosen bool
|
||||||
|
Ticks int
|
||||||
|
Frames int
|
||||||
|
Progress float64
|
||||||
|
Loaded bool
|
||||||
|
}
|
||||||
|
|
||||||
// INIT
|
// INIT
|
||||||
|
|
||||||
func initialize() (tea.Model, tea.Cmd) {
|
func initialize() (tea.Model, tea.Cmd) {
|
||||||
|
@ -50,15 +62,15 @@ func subscriptions(model tea.Model) tea.Subs {
|
||||||
m, _ := model.(Model)
|
m, _ := model.(Model)
|
||||||
if !m.Chosen || m.Loaded {
|
if !m.Chosen || m.Loaded {
|
||||||
return tea.Subs{
|
return tea.Subs{
|
||||||
"tick": tea.Every(time.Second, tickMsg{}),
|
"tick": tea.Every(time.Second, newTickMsg),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tea.Subs{
|
return tea.Subs{
|
||||||
"frame": tea.Every(time.Second/60, frameMsg{}),
|
"frame": tea.Every(time.Second/60, newFrameMsg),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UPDATES
|
// UPDATE
|
||||||
|
|
||||||
func update(msg tea.Msg, model tea.Model) (tea.Model, tea.Cmd) {
|
func update(msg tea.Msg, model tea.Model) (tea.Model, tea.Cmd) {
|
||||||
m, _ := model.(Model)
|
m, _ := model.(Model)
|
||||||
|
@ -145,7 +157,7 @@ func updateChosen(msg tea.Msg, m Model) (tea.Model, tea.Cmd) {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// VIEWS
|
// VIEW
|
||||||
|
|
||||||
func view(model tea.Model) string {
|
func view(model tea.Model) string {
|
||||||
m, _ := model.(Model)
|
m, _ := model.(Model)
|
||||||
|
|
|
@ -4,18 +4,22 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewEverMsg is used by Every to create a new message. It contains the time
|
||||||
|
// at which the timer finished.
|
||||||
|
type NewEveryMsg func(time.Time) Msg
|
||||||
|
|
||||||
// Every is a subscription that ticks with the system clock at the given
|
// Every is a subscription that ticks with the system clock at the given
|
||||||
// duration
|
// duration.
|
||||||
//
|
//
|
||||||
// TODO: make it cancelable
|
// TODO: make it cancelable
|
||||||
func Every(duration time.Duration, msg Msg) Sub {
|
func Every(duration time.Duration, newMsg NewEveryMsg) Sub {
|
||||||
return func() Msg {
|
return func() Msg {
|
||||||
n := time.Now()
|
n := time.Now()
|
||||||
d := n.Truncate(duration).Add(duration).Sub(n)
|
d := n.Truncate(duration).Add(duration).Sub(n)
|
||||||
t := time.NewTimer(d)
|
t := time.NewTimer(d)
|
||||||
select {
|
select {
|
||||||
case <-t.C:
|
case now := <-t.C:
|
||||||
return msg
|
return newMsg(now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue