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) }