92 lines
2.6 KiB
Go
92 lines
2.6 KiB
Go
package ui
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"time"
|
||
|
||
"git.patanix.de/git/kettlebell-app/internal/data"
|
||
"git.patanix.de/git/kettlebell-app/internal/services"
|
||
|
||
"git.patanix.de/git/kettlebell-app/internal/ui/theme"
|
||
"git.patanix.de/git/kettlebell-app/internal/ui/utils"
|
||
|
||
"fyne.io/fyne/v2"
|
||
"fyne.io/fyne/v2/canvas"
|
||
"fyne.io/fyne/v2/container"
|
||
"fyne.io/fyne/v2/widget"
|
||
)
|
||
|
||
func MakeHomeScreen(ts *services.TrainingService, db *data.DatabaseService, onStart func()) fyne.CanvasObject {
|
||
headerTitle := canvas.NewText("Kettlebell Workout Tracker", theme.OneDarkText)
|
||
headerTitle.TextSize = 28
|
||
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)),
|
||
startButton,
|
||
),
|
||
)
|
||
centerContent := container.NewCenter(nextTrainingCard)
|
||
|
||
setsValue := widget.NewLabelWithStyle("–", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})
|
||
durationValue := widget.NewLabelWithStyle("–", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})
|
||
weightValue := widget.NewLabelWithStyle("–", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})
|
||
|
||
statsCard := widget.NewCard("Letzte Leistung", "", container.NewGridWithColumns(3,
|
||
container.NewVBox(widget.NewLabel("Sätze"), setsValue),
|
||
container.NewVBox(widget.NewLabel("Dauer"), durationValue),
|
||
container.NewVBox(widget.NewLabel("Gewicht"), weightValue),
|
||
))
|
||
|
||
loadLastPerformance := func() {
|
||
lastSession, err := db.GetLastTraining()
|
||
if err != nil {
|
||
log.Printf("Fehler beim Laden der letzten Session: %v", err)
|
||
return
|
||
}
|
||
if lastSession != nil {
|
||
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()
|
||
}
|
||
}
|
||
}
|
||
|
||
borderLayout := container.NewBorder(
|
||
header,
|
||
statsCard,
|
||
nil,
|
||
nil,
|
||
centerContent,
|
||
)
|
||
|
||
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
|
||
}
|