recator: use timer signals instead of shared.Message.TimeLeft

- remove shared.Message.TimeLeft
- modify Timer struct
  - add TimeLeft signal
  - add End and Abort signals
- add syncronised ticker
- update RunPomodoro to use goroutines for timer starts
  - add waitForTimer function
This commit is contained in:
Sebastian Mark 2024-10-25 23:13:06 +02:00
parent aa5c24f06d
commit 3eae584d6d
2 changed files with 44 additions and 22 deletions

View file

@ -9,6 +9,19 @@ import (
var mu sync.Mutex // to synchronize access to shared state
var timer Timer
func waitForTimer(t Timer) bool {
for {
select {
case <-t.End:
return true
case <-t.Abort:
return false
case shared.Message.TimeLeft = <-t.TimeLeft:
// do nothing, just let the timer update the message
}
}
}
// RunPomodoro iterates the Pomodoro work/break sessions.
func RunPomodoro() {
mu.Lock()
@ -24,18 +37,21 @@ func RunPomodoro() {
shared.Message.Session = session
shared.Message.Mode = "Work"
if !timer.Start(pomodoroConfig.Work) {
go timer.Start(pomodoroConfig.Work)
if !waitForTimer(timer) {
break
}
if session > pomodoroConfig.Sessions {
if session < pomodoroConfig.Sessions {
shared.Message.Mode = "ShortBreak"
if !timer.Start(pomodoroConfig.ShortBreak) {
go timer.Start(pomodoroConfig.ShortBreak)
if !waitForTimer(timer) {
break
}
} else { // last phase, prepare for finish
shared.Message.Mode = "LongBreak"
if !timer.Start(pomodoroConfig.LongBreak) {
go timer.Start(pomodoroConfig.LongBreak)
if !waitForTimer(timer) {
break
}
shared.Message.Mode = "End"