kettlebell-tracker/internal/ui/settings.go

82 lines
2.4 KiB
Go

package ui
import (
"fmt"
"strconv"
"git.patanix.de/git/kettlebell-app/internal/services"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func MakeSettingsScreen(settingsService *services.SettingsService, parent fyne.Window) fyne.CanvasObject {
currentSettings := settingsService.LoadSettings()
timeEntry := widget.NewEntry()
timeEntry.SetText(fmt.Sprintf("%d", currentSettings.TrainingTimeMinutes))
timeEntry.Validator = func(s string) error {
if _, err := strconv.Atoi(s); err != nil {
return fmt.Errorf("muss eine Zahl sein")
}
return nil
}
setsEntry := widget.NewEntry()
setsEntry.SetText(fmt.Sprintf("%d", currentSettings.GoalSets))
setsEntry.Validator = timeEntry.Validator // Gleicher Validator
weightLeftEntry := widget.NewEntry()
weightLeftEntry.SetText(fmt.Sprintf("%.1f", currentSettings.WeightLeft))
weightLeftEntry.Validator = func(s string) error {
if _, err := strconv.ParseFloat(s, 64); err != nil {
return fmt.Errorf("muss eine Zahl sein")
}
return nil
}
weightRightEntry := widget.NewEntry()
weightRightEntry.SetText(fmt.Sprintf("%.1f", currentSettings.WeightRight))
weightRightEntry.Validator = weightLeftEntry.Validator // Gleicher Validator
form := &widget.Form{
Items: []*widget.FormItem{
{Text: "Trainingszeit (Minuten)", Widget: timeEntry},
{Text: "Ziel-Sätze", Widget: setsEntry},
{Text: "Links (kg)", Widget: weightLeftEntry},
{Text: "Rechts (kg)", Widget: weightRightEntry},
},
OnSubmit: func() {
timeMin, _ := strconv.Atoi(timeEntry.Text)
goal, _ := strconv.Atoi(setsEntry.Text)
weightL, _ := strconv.ParseFloat(weightLeftEntry.Text, 64)
weightR, _ := strconv.ParseFloat(weightRightEntry.Text, 64)
newSettings := &services.Settings{
TrainingTimeMinutes: timeMin,
GoalSets: goal,
WeightLeft: weightL,
WeightRight: weightR,
InitialProgram: currentSettings.InitialProgram, // Beibehalten
}
settingsService.SaveSettings(newSettings)
fyne.CurrentApp().SendNotification(&fyne.Notification{
Title: "Gespeichert",
Content: "Die Einstellungen wurden erfolgreich aktualisiert.",
})
},
}
title := widget.NewLabelWithStyle("Einstellungen", fyne.TextAlignLeading, fyne.TextStyle{Bold: true})
title.TextStyle.Monospace = true // Workaround to force refresh on size change
layout := container.NewVBox(
title,
widget.NewSeparator(),
form,
)
return container.NewPadded(layout)
}