From c2a3caea5dc37a2ba516198fced9d4440d4d6b28 Mon Sep 17 00:00:00 2001 From: sunglocto Date: Sat, 30 Aug 2025 16:28:42 +0100 Subject: [PATCH] Add break/work functionality --- main.go | 77 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index f3f23f8..2bcf212 100644 --- a/main.go +++ b/main.go @@ -3,31 +3,39 @@ package main import ( + "time" + "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" - "time" ) func main() { var timer time.Duration 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() - w := a.NewWindow("matocock") + w := a.NewWindow(status) w.SetFixedSize(true) w.Resize(fyne.NewSize(400, 50)) workEntry := widget.NewEntry() - workEntry.SetText("3s") + workEntry.SetText(defaultWorkTime) workEntry.TextStyle.Monospace = true workEntry.Refresh() breakEntry := widget.NewEntry() - breakEntry.SetText("5m") + breakEntry.SetText(defaultBreakTime) breakEntry.TextStyle.Monospace = true + breakEntry.Refresh() var beginButton *widget.Button @@ -35,7 +43,13 @@ func main() { go func() { if !ticking { 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 { neww := fyne.CurrentApp().NewWindow("Error") neww.Resize(fyne.NewSize(500, 500)) @@ -61,31 +75,47 @@ func main() { }) timer = duration timeStarted := time.Now() - workEntry.Disable() for ticking { 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 { - ticking = false - a.SendNotification(fyne.NewNotification("matocock", "timer is done")) - workEntry.Enable() - beginButton.Icon = theme.Icon(theme.IconNameMediaPlay) - fyne.Do(func() { - beginButton.SetText("Start") - }) - beginButton.Importance = widget.HighImportance - fyne.Do(func() { - beginButton.Refresh() - }) + if status == "WORK TIME" { + status = "BREAK TIME" + workEntry.SetText(defaultWorkTime) + workEntry.Enable() + timer, err = time.ParseDuration(breakEntry.Text) + if err != nil { + panic(err) + } + timer = timer + cur + 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 { time.Sleep(time.Second * 1) } } } else { ticking = false - workEntry.Enable() + breakEntry.Enable() beginButton.Icon = theme.Icon(theme.IconNameMediaPlay) fyne.Do(func() { beginButton.SetText("Start") @@ -100,7 +130,14 @@ func main() { 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() { neww := fyne.CurrentApp().NewWindow("Help") neww.Resize(fyne.NewSize(500, 500))