Add break/work functionality

This commit is contained in:
2025-08-30 16:28:42 +01:00
parent c142de963b
commit c2a3caea5d

77
main.go
View File

@@ -3,31 +3,39 @@
package main package main
import ( import (
"time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/app" "fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"time"
) )
func main() { func main() {
var timer time.Duration var timer time.Duration
var ticking bool = false var ticking bool = false
var status string = "WORK TIME"
// TODO: GET DEFAULT WORK AND BREAK TIMES FROM FILESYSTEM
var defaultWorkTime string = "25m"
var defaultBreakTime string = "5m"
a := app.New() a := app.New()
w := a.NewWindow("matocock") w := a.NewWindow(status)
w.SetFixedSize(true) w.SetFixedSize(true)
w.Resize(fyne.NewSize(400, 50)) w.Resize(fyne.NewSize(400, 50))
workEntry := widget.NewEntry() workEntry := widget.NewEntry()
workEntry.SetText("3s") workEntry.SetText(defaultWorkTime)
workEntry.TextStyle.Monospace = true workEntry.TextStyle.Monospace = true
workEntry.Refresh() workEntry.Refresh()
breakEntry := widget.NewEntry() breakEntry := widget.NewEntry()
breakEntry.SetText("5m") breakEntry.SetText(defaultBreakTime)
breakEntry.TextStyle.Monospace = true breakEntry.TextStyle.Monospace = true
breakEntry.Refresh() breakEntry.Refresh()
var beginButton *widget.Button var beginButton *widget.Button
@@ -35,7 +43,13 @@ func main() {
go func() { go func() {
if !ticking { if !ticking {
ticking = true ticking = true
duration, err := time.ParseDuration(workEntry.Text) var duration time.Duration
var err error
if status == "WORK TIME" {
duration, err = time.ParseDuration(workEntry.Text)
} else {
duration, err = time.ParseDuration(breakEntry.Text)
}
if err != nil { if err != nil {
neww := fyne.CurrentApp().NewWindow("Error") neww := fyne.CurrentApp().NewWindow("Error")
neww.Resize(fyne.NewSize(500, 500)) neww.Resize(fyne.NewSize(500, 500))
@@ -61,31 +75,47 @@ func main() {
}) })
timer = duration timer = duration
timeStarted := time.Now() timeStarted := time.Now()
workEntry.Disable()
for ticking { for ticking {
cur := time.Since(timeStarted) cur := time.Since(timeStarted)
workEntry.SetText((cur.Round(time.Second) - timer.Round(time.Second)).Abs().String()) if status == "WORK TIME" {
workEntry.Disable()
workEntry.SetText((cur.Round(time.Second) - timer.Round(time.Second)).Abs().String())
} else {
breakEntry.Disable()
breakEntry.SetText((cur.Round(time.Second) - timer.Round(time.Second)).Abs().String())
}
if cur >= timer { if cur >= timer {
ticking = false if status == "WORK TIME" {
a.SendNotification(fyne.NewNotification("matocock", "timer is done")) status = "BREAK TIME"
workEntry.Enable() workEntry.SetText(defaultWorkTime)
beginButton.Icon = theme.Icon(theme.IconNameMediaPlay) workEntry.Enable()
fyne.Do(func() { timer, err = time.ParseDuration(breakEntry.Text)
beginButton.SetText("Start") if err != nil {
}) panic(err)
beginButton.Importance = widget.HighImportance }
fyne.Do(func() { timer = timer + cur
beginButton.Refresh() w.SetTitle(status)
}) } else {
status = "WORK TIME"
breakEntry.SetText(defaultBreakTime)
breakEntry.Enable()
timer, err = time.ParseDuration(workEntry.Text)
if err != nil {
panic(err)
}
timer = timer + cur
w.SetTitle(status)
}
} else { } else {
time.Sleep(time.Second * 1) time.Sleep(time.Second * 1)
} }
} }
} else { } else {
ticking = false ticking = false
workEntry.Enable() workEntry.Enable()
breakEntry.Enable()
beginButton.Icon = theme.Icon(theme.IconNameMediaPlay) beginButton.Icon = theme.Icon(theme.IconNameMediaPlay)
fyne.Do(func() { fyne.Do(func() {
beginButton.SetText("Start") beginButton.SetText("Start")
@@ -100,7 +130,14 @@ func main() {
beginButton.Importance = widget.HighImportance beginButton.Importance = widget.HighImportance
w.SetContent(container.NewGridWithColumns(3, workEntry, breakEntry, beginButton)) w.SetContent(container.NewGridWithColumns(3, workEntry, breakEntry, container.NewVBox(beginButton, widget.NewButtonWithIcon("Skip", theme.Icon(theme.IconNameMediaSkipNext), func() {
if status == "WORK TIME" {
status = "BREAK TIME"
} else {
status = "WORK TIME"
}
w.SetTitle(status)
}))))
menu := fyne.NewMainMenu(fyne.NewMenu("root"), fyne.NewMenu("help", fyne.NewMenuItem("valid time arguments", func() { menu := fyne.NewMainMenu(fyne.NewMenu("root"), fyne.NewMenu("help", fyne.NewMenuItem("valid time arguments", func() {
neww := fyne.CurrentApp().NewWindow("Help") neww := fyne.CurrentApp().NewWindow("Help")
neww.Resize(fyne.NewSize(500, 500)) neww.Resize(fyne.NewSize(500, 500))