diff --git a/internal/services/training.go b/internal/services/training.go index 9a0c11d..db5ad67 100644 --- a/internal/services/training.go +++ b/internal/services/training.go @@ -221,26 +221,26 @@ type TrainingState struct { } func calculateStateByDayCount(totalDays int) (program string, blockDay, reps int) { - program = "giant_1.0" + program = "clean_1.0" blockDay = 1 reps = 5 if totalDays > 0 { cycleIndex := (totalDays / 12) % 6 - programs := []string{"giant_1.0", "ksk_1.0", "giant_1.1", "ksk_1.1", "giant_1.2", "ksk_1.2"} + programs := []string{"clean_1.0", "snatch_1.0", "clean_1.1", "snatch_1.1", "clean_1.2", "snatch_1.2"} program = programs[cycleIndex] blockDay = (totalDays % 3) + 1 } repsMap := map[string][]int{ - "giant_1.0": {5, 6, 4}, - "giant_1.1": {6, 8, 7}, - "giant_1.2": {7, 9, 8}, - "ksk_1.0": {5, 6, 4}, - "ksk_1.1": {6, 8, 7}, - "ksk_1.2": {7, 9, 8}, + "clean_1.0": {5, 6, 4}, + "clean_1.1": {6, 8, 7}, + "clean_1.2": {7, 9, 8}, + "snatch_1.0": {5, 6, 4}, + "snatch_1.1": {6, 8, 7}, + "snatch_1.2": {7, 9, 8}, } if r, ok := repsMap[program]; ok && len(r) >= blockDay { @@ -339,7 +339,6 @@ func (s *TrainingService) FinishTraining(session *data.TrainingSession) error { return err } - // s.sendToBackend(session) go s.apiService.SendTrainingData(session) s.ResetTraining() diff --git a/internal/ui/home.go b/internal/ui/home.go index 998db37..19dedf8 100644 --- a/internal/ui/home.go +++ b/internal/ui/home.go @@ -3,6 +3,7 @@ package ui import ( "fmt" "log" + "time" "git.patanix.de/git/kettlebell-app/internal/data" "git.patanix.de/git/kettlebell-app/internal/services" @@ -22,18 +23,23 @@ func MakeHomeScreen(ts *services.TrainingService, db *data.DatabaseService, onSt headerTitle.TextStyle.Bold = true header := container.NewCenter( + widget.NewSeparator(), headerTitle, ) state := ts.State + startButton := widget.NewButton("Training starten", onStart) + startButton.Importance = widget.HighImportance + nextTrainingCard := widget.NewCard( "Nächstes Training", fmt.Sprintf("%s - Tag %d", state.CurrentProgram, state.CurrentBlockDay), container.NewVBox( widget.NewLabel(fmt.Sprintf("Ziel: %d Wiederholungen pro Satz", state.CurrentReps)), - widget.NewButton("Training starten", onStart), + startButton, ), ) + centerContent := container.NewCenter(nextTrainingCard) setsValue := widget.NewLabelWithStyle("–", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}) durationValue := widget.NewLabelWithStyle("–", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}) @@ -55,20 +61,32 @@ func MakeHomeScreen(ts *services.TrainingService, db *data.DatabaseService, onSt setsValue.SetText(fmt.Sprintf("%d", lastSession.Sets)) durationValue.SetText(utils.FormatDuration(lastSession.Duration)) weightValue.SetText(fmt.Sprintf("%.1fkg", lastSession.WeightLeft)) + trainedToday := false + trainedToday = EqualDate(lastSession.Date, time.Now()) + if trainedToday { + startButton.Disabled() + } } } - layout := container.NewVBox( + borderLayout := container.NewBorder( header, - widget.NewSeparator(), - nextTrainingCard, statsCard, + nil, + nil, + centerContent, ) - paddedLayout := container.NewPadded(layout) + paddedLayout := container.NewPadded(borderLayout) if paddedLayout.Visible() { loadLastPerformance() } return paddedLayout } + +func EqualDate(date1, date2 time.Time) bool { + y1, m1, d1 := date1.Date() + y2, m2, d2 := date2.Date() + return y1 == y2 && m1 == m2 && d1 == d2 +} diff --git a/internal/ui/training.go b/internal/ui/training.go index 5480a4d..49bd708 100644 --- a/internal/ui/training.go +++ b/internal/ui/training.go @@ -30,6 +30,8 @@ func MakeTrainingScreen(ts *services.TrainingService, ss *services.SettingsServi repsLabel.TextSize = 20 repsLabel.Alignment = fyne.TextAlignCenter + var finishButton *widget.Button + var mainTimer *time.Ticker updateUI := func() { @@ -38,18 +40,29 @@ func MakeTrainingScreen(ts *services.TrainingService, ss *services.SettingsServi setsLabel.Text = fmt.Sprintf("%d / %d", state.SetsDone, state.GoalSets) repsLabel.Text = fmt.Sprintf("%d Wiederholungen", state.RepsPerSet) + if finishButton != nil { + if state.RemainingSeconds <= 0 && state.IsTrainingRunning { + finishButton.Show() + } else { + finishButton.Hide() + } + } + timerLabel.Refresh() setsLabel.Refresh() repsLabel.Refresh() } finishAction := func() { + if ts.State.RemainingSeconds > 0 { + return + } if mainTimer != nil { mainTimer.Stop() mainTimer = nil } if !ts.State.IsTrainingRunning { - return // Nichts tun, wenn kein Training läuft + return } session := &data.TrainingSession{ Date: time.Now(), @@ -66,7 +79,7 @@ func MakeTrainingScreen(ts *services.TrainingService, ss *services.SettingsServi startAction := func() { if ts.State.IsTrainingRunning { - return // Verhindere Neustart + return } settings := ss.LoadSettings() ts.StartTraining(settings.TrainingTimeMinutes, settings.GoalSets) @@ -96,7 +109,8 @@ func MakeTrainingScreen(ts *services.TrainingService, ss *services.SettingsServi 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) + finishButton = widget.NewButton("Training beenden", finishAction) + finishButton.Hide() // oder: finishButton.Hide() // finishButton.Disable() setButton := widget.NewButton("Satz abschließen", setAction) setButton.Importance = widget.HighImportance setButton.Resize(fyne.NewSize(120, 60))