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 { var timeEntry, setsEntry, weightLeftEntry, weightRightEntry *widget.Entry loadData := func() { currentSettings := settingsService.LoadSettings() timeEntry.SetText(fmt.Sprintf("%d", currentSettings.TrainingTimeMinutes)) setsEntry.SetText(fmt.Sprintf("%d", currentSettings.GoalSets)) weightLeftEntry.SetText(fmt.Sprintf("%.1f", currentSettings.WeightLeft)) weightRightEntry.SetText(fmt.Sprintf("%.1f", currentSettings.WeightRight)) } timeEntry = widget.NewEntry() 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.Validator = timeEntry.Validator weightLeftEntry = widget.NewEntry() 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.Validator = weightLeftEntry.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: settingsService.LoadSettings().InitialProgram, } 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}) layout := container.NewVBox(title, widget.NewSeparator(), form) paddedLayout := container.NewPadded(layout) if paddedLayout.Visible() { loadData() } return paddedLayout }