kettlebell-tracker/internal/ui/history.go

87 lines
2.6 KiB
Go

package ui
import (
"fmt"
"log"
"git.patanix.de/git/kettlebell-app/internal/data"
"git.patanix.de/git/kettlebell-app/internal/ui/utils"
"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 MakeHistoryScreen(db *data.DatabaseService, parent fyne.Window) fyne.CanvasObject {
var history []data.TrainingSession
placeholder := widget.NewLabel("Noch keine Trainingsdaten vorhanden.")
list := widget.NewList(
func() int {
return len(history)
},
func() fyne.CanvasObject {
return widget.NewCard("", "", container.NewVBox(
widget.NewLabel(""),
widget.NewSeparator(),
container.NewGridWithColumns(3,
container.NewVBox(widget.NewLabel("Sätze"), widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
container.NewVBox(widget.NewLabel("Dauer"), widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
container.NewVBox(widget.NewLabel("Reps/Satz"), widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
),
))
},
func(i widget.ListItemID, o fyne.CanvasObject) {
session := history[i]
card := o.(*widget.Card)
card.SetTitle(session.Date.Format("02.01.2006 15:04"))
content := card.Content.(*fyne.Container)
programLabel := content.Objects[0].(*widget.Label)
statsGrid := content.Objects[2].(*fyne.Container)
programLabel.SetText(fmt.Sprintf("%s - Tag %d", session.Program, session.BlockDay))
statsGrid.Objects[0].(*fyne.Container).Objects[1].(*widget.Label).SetText(fmt.Sprintf("%d", session.Sets))
statsGrid.Objects[1].(*fyne.Container).Objects[1].(*widget.Label).SetText(utils.FormatDuration(session.Duration))
statsGrid.Objects[2].(*fyne.Container).Objects[1].(*widget.Label).SetText(fmt.Sprintf("%d", session.RepsPerSet))
},
)
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 {
list.Hide()
placeholder.Show()
} else {
list.Show()
placeholder.Hide()
}
list.Refresh()
}
list.OnSelected = func(id widget.ListItemID) {
list.Unselect(id)
}
toolbar := widget.NewToolbar(
widget.NewToolbarAction(theme.ViewRefreshIcon(), refreshData),
)
layout := container.NewBorder(toolbar, nil, nil, nil, container.NewStack(list, container.NewCenter(placeholder)))
wrapper := container.NewMax(layout)
if wrapper.Visible() {
refreshData()
}
// wrapper.OnVisible = refreshData
return wrapper
}