package ui import ( "fmt" "time" "git.patanix.de/git/kettlebell-app/internal/data" "git.patanix.de/git/kettlebell-app/internal/services" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) func MakeTrainingScreen(ts *services.TrainingService, ss *services.SettingsService, parent fyne.Window) fyne.CanvasObject { // UI-Elemente timerLabel := widget.NewLabelWithStyle("20:00", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}) // timerLabel.TextSize = 60 setsLabel := widget.NewLabelWithStyle("0 / 8", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}) // setsLabel.TextSize = 48 // setsLabel.Color = theme.ColorSky400 repsLabel := widget.NewLabelWithStyle("5 Wiederholungen", fyne.TextAlignCenter, fyne.TextStyle{}) // repsLabel.TextSize = 20 var mainTimer *time.Ticker updateUI := func() { state := ts.State timerLabel.SetText(formatDuration(int64(state.RemainingSeconds))) setsLabel.SetText(fmt.Sprintf("%d / %d", state.SetsDone, state.GoalSets)) repsLabel.SetText(fmt.Sprintf("%d Wiederholungen", state.RepsPerSet)) } finishAction := func() { if mainTimer != nil { mainTimer.Stop() } // ... (Logik zum Speichern wie zuvor) ... session := &data.TrainingSession{ Date: time.Now(), Sets: int64(ts.State.SetsDone), WeightLeft: ss.LoadSettings().WeightLeft, WeightRight: ss.LoadSettings().WeightRight, RepsPerSet: int64(ts.State.RepsPerSet), Duration: int64(ts.State.InitialDurationSeconds - ts.State.RemainingSeconds), } ts.FinishTraining(session) fyne.CurrentApp().SendNotification(&fyne.Notification{Title: "Training gespeichert!", Content: "Gut gemacht!"}) updateUI() } startAction := func() { settings := ss.LoadSettings() ts.StartTraining(settings.TrainingTimeMinutes, settings.GoalSets) updateUI() mainTimer = time.NewTicker(time.Second) go func() { for range mainTimer.C { if ts.State.RemainingSeconds <= 0 { finishAction() return } ts.Tick() updateUI() } }() } setAction := func() { ts.CompleteSet() updateUI() } // Layout im "Cockpit"-Stil topPart := container.NewVBox( widget.NewLabelWithStyle("Verbleibende Zeit", fyne.TextAlignCenter, fyne.TextStyle{}), timerLabel, ) middlePart := container.NewVBox( widget.NewLabelWithStyle("Sätze", fyne.TextAlignCenter, fyne.TextStyle{}), setsLabel, repsLabel, ) finishButton := widget.NewButton("Training beenden", finishAction) // Wir simulieren den roten Button durch die Error-Farbe des Themes finishButton.Importance = widget.HighImportance bottomPart := container.NewVBox( widget.NewButton("Satz abschließen", setAction), finishButton, ) // HINWEIS: Start-Button fehlt hier, da der Flow vom Home-Screen ausgeht. // Man könnte ihn bei Bedarf hinzufügen. return container.NewBorder(topPart, bottomPart, nil, nil, container.NewCenter(middlePart)) }