Expose stopwatch StartStopMsg and ResetMsg and bind them to IDs

This commit is contained in:
Christian Rocha 2021-12-20 17:53:19 -05:00
parent 86e0c53e88
commit 7b20f4fe24

View File

@ -28,15 +28,20 @@ type TickMsg struct {
// //
// Note, however, that a stopwatch will reject ticks from other // Note, however, that a stopwatch will reject ticks from other
// stopwatches, so it's safe to flow all TickMsgs through all stopwatches // stopwatches, so it's safe to flow all TickMsgs through all stopwatches
// and hvae them still behave appropriately. // and have them still behave appropriately.
ID int ID int
} }
type startStopMsg struct { // StartStopMsg is sent when the stopwatch should start or stop.
type StartStopMsg struct {
ID int
running bool running bool
} }
type resetMsg struct{} // ResetMsg is sent when the stopwatch should reset.
type ResetMsg struct {
ID int
}
// Model for the stopwatch component. // Model for the stopwatch component.
type Model struct { type Model struct {
@ -67,7 +72,7 @@ func (m Model) ID() int {
return m.id return m.id
} }
// Init starts the stopwatch.. // Init starts the stopwatch.
func (m Model) Init() tea.Cmd { func (m Model) Init() tea.Cmd {
return m.Start() return m.Start()
} }
@ -75,14 +80,14 @@ func (m Model) Init() tea.Cmd {
// Start starts the stopwatch. // Start starts the stopwatch.
func (m Model) Start() tea.Cmd { func (m Model) Start() tea.Cmd {
return tea.Batch(func() tea.Msg { return tea.Batch(func() tea.Msg {
return startStopMsg{true} return StartStopMsg{ID: m.id, running: true}
}, tick(m.id, m.Interval)) }, tick(m.id, m.Interval))
} }
// Stop stops the stopwatch. // Stop stops the stopwatch.
func (m Model) Stop() tea.Cmd { func (m Model) Stop() tea.Cmd {
return func() tea.Msg { return func() tea.Msg {
return startStopMsg{false} return StartStopMsg{ID: m.id, running: false}
} }
} }
@ -97,7 +102,7 @@ func (m Model) Toggle() tea.Cmd {
// Reset restes the stopwatch to 0. // Reset restes the stopwatch to 0.
func (m Model) Reset() tea.Cmd { func (m Model) Reset() tea.Cmd {
return func() tea.Msg { return func() tea.Msg {
return resetMsg{} return ResetMsg{ID: m.id}
} }
} }
@ -109,12 +114,18 @@ func (m Model) Running() bool {
// Update handles the timer tick. // Update handles the timer tick.
func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
switch msg := msg.(type) { switch msg := msg.(type) {
case startStopMsg: case StartStopMsg:
if msg.ID != m.id {
return m, nil
}
m.running = msg.running m.running = msg.running
case resetMsg: case ResetMsg:
if msg.ID != m.id {
return m, nil
}
m.d = 0 m.d = 0
case TickMsg: case TickMsg:
if !m.running || (msg.ID != 0 && msg.ID != m.id) { if !m.running || msg.ID != m.id {
break break
} }
m.d += m.Interval m.d += m.Interval