92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"git.patanix.de/git/kettlebell-app/internal/data"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/dialog"
|
|
"fyne.io/fyne/v2/theme"
|
|
"fyne.io/fyne/v2/widget"
|
|
)
|
|
|
|
func formatDuration(totalSeconds int64) string {
|
|
mins := totalSeconds / 60
|
|
secs := totalSeconds % 60
|
|
return fmt.Sprintf("%02d:%02d", mins, secs)
|
|
}
|
|
|
|
// MakeHistoryScreen erstellt den Bildschirm für die Trainingshistorie.
|
|
func MakeHistoryScreen(db *data.DatabaseService, parent fyne.Window) fyne.CanvasObject {
|
|
var history []data.TrainingSession
|
|
|
|
// Platzhalter, wenn die Liste leer ist
|
|
placeholder := widget.NewLabel("Noch keine Trainingsdaten vorhanden.")
|
|
placeholder.Alignment = fyne.TextAlignCenter
|
|
|
|
list := widget.NewList(
|
|
func() int {
|
|
return len(history)
|
|
},
|
|
func() fyne.CanvasObject {
|
|
// Template für einen Listeneintrag
|
|
return widget.NewCard("", "", container.NewVBox(
|
|
widget.NewLabel(""), // Datum
|
|
widget.NewSeparator(),
|
|
widget.NewLabel(""), // Sätze
|
|
widget.NewLabel(""), // Gewicht
|
|
widget.NewLabel(""), // Reps
|
|
widget.NewLabel(""), // Dauer
|
|
))
|
|
},
|
|
func(i widget.ListItemID, o fyne.CanvasObject) {
|
|
// Template mit Daten füllen
|
|
session := history[i]
|
|
card := o.(*widget.Card)
|
|
|
|
// Datum als Titel der Karte
|
|
card.SetTitle(session.Date.Format("02.01.2006 15:04"))
|
|
|
|
// Details im Inhalt der Karte
|
|
box := card.Content.(*fyne.Container)
|
|
labels := box.Objects
|
|
labels[0].(*widget.Label).SetText(fmt.Sprintf("Programm: %s - Tag %d", session.Program, session.BlockDay))
|
|
labels[2].(*widget.Label).SetText(fmt.Sprintf("Sätze: %d", session.Sets))
|
|
labels[3].(*widget.Label).SetText(fmt.Sprintf("Kettlebells: %.1fkg / %.1fkg", session.WeightLeft, session.WeightRight))
|
|
labels[4].(*widget.Label).SetText(fmt.Sprintf("Reps pro Satz: %d", session.RepsPerSet))
|
|
labels[5].(*widget.Label).SetText(fmt.Sprintf("Dauer: %s", formatDuration(session.Duration)))
|
|
},
|
|
)
|
|
|
|
// Funktion zum Neuladen der Daten
|
|
refreshData := func() {
|
|
var err error
|
|
history, err = db.GetHistory()
|
|
if err != nil {
|
|
log.Printf("Fehler beim Laden der Historie: %v", err)
|
|
dialog.ShowError(err, parent)
|
|
}
|
|
|
|
if len(history) == 0 {
|
|
placeholder.Show()
|
|
list.Hide()
|
|
} else {
|
|
placeholder.Hide()
|
|
list.Show()
|
|
}
|
|
list.Refresh()
|
|
}
|
|
|
|
// Initiales Laden
|
|
refreshData()
|
|
|
|
// Toolbar mit Refresh-Button
|
|
toolbar := widget.NewToolbar(
|
|
widget.NewToolbarAction(theme.ViewRefreshIcon(), refreshData),
|
|
)
|
|
|
|
return container.NewBorder(toolbar, nil, nil, nil, container.NewStack(list, placeholder))
|
|
}
|