kettlebell-tracker/internal/ui/history.go

119 lines
3.3 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),
// )
table := widget.NewTable(
func() (int, int) { return len(history), 4 },
func() fyne.CanvasObject { return widget.NewLabel("Template") },
func(id widget.TableCellID, cell fyne.CanvasObject) {
session := history[id.Row]
label := cell.(*widget.Label)
switch id.Col {
case 0:
label.SetText(session.Date.Format("02.01"))
case 1:
label.SetText(fmt.Sprintf("%d Sätze", session.Sets))
case 2:
label.SetText(fmt.Sprintf("%.1fkg", session.WeightLeft))
case 3:
label.SetText(formatDuration(session.Duration))
}
},
)
table.SetColumnWidth(0, 80)
table.SetColumnWidth(1, 100)
table.SetColumnWidth(2, 80)
table.SetColumnWidth(3, 80)
// return container.NewBorder(toolbar, nil, nil, nil, container.NewStack(list, placeholder))
return container.NewBorder(
widget.NewToolbar(widget.NewToolbarAction(theme.ViewRefreshIcon(), refreshData)),
nil, nil, nil,
table,
)
}