From fb2f9b6e3011d1dc16dfb307cc793ad9810b7236 Mon Sep 17 00:00:00 2001 From: mixeme Date: Thu, 25 Jun 2026 22:24:59 +0300 Subject: [PATCH] fix(ui): restore History column sort after Fyne 2.7 header-tap change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fyne 2.7.4 made Table.Select() reject cells with Row < 0, so OnSelected was never fired for header clicks and the Time sort toggle stopped working. Replace the plain Label header with a custom historyHeader widget that implements fyne.Tappable; UpdateHeader wires OnTapped for col 0 directly. Also swap "asc"/"desc" text for ▲/▼ glyphs. Co-Authored-By: Claude Sonnet 4.6 --- src/ui/history_view.go | 58 ++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/src/ui/history_view.go b/src/ui/history_view.go index 9089d3a..aa38eaa 100644 --- a/src/ui/history_view.go +++ b/src/ui/history_view.go @@ -73,15 +73,46 @@ func logColumnWidth(events []event) float32 { return width } +// historyHeader is a bold tappable label used in the History table header row. +// In Fyne 2.7+ OnSelected is not fired for header cells (Row < 0), so the sort +// toggle is wired through the Tappable interface instead. +type historyHeader struct { + widget.BaseWidget + label *widget.Label + OnTapped func() +} + +func newHistoryHeader() *historyHeader { + h := &historyHeader{label: widget.NewLabel("")} + h.label.TextStyle = fyne.TextStyle{Bold: true} + h.label.Wrapping = fyne.TextTruncate + h.ExtendBaseWidget(h) + return h +} + +func (h *historyHeader) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(h.label) +} + +func (h *historyHeader) Tapped(*fyne.PointEvent) { + if h.OnTapped != nil { + h.OnTapped() + } +} + +func (h *historyHeader) SetText(text string) { + h.label.SetText(text) +} + func newHistoryView(events *[]event) (*fyne.Container, func()) { descending := false headerText := func(id widget.TableCellID) string { headers := []string{"Time", "Trigger", "Job", "State", "Detail", "Log"} if id.Row < 0 && id.Col == 0 { if descending { - return "Time desc" + return "Time ▼" } - return "Time asc" + return "Time ▲" } if id.Row < 0 && id.Col >= 0 && id.Col < len(headers) { return headers[id.Col] @@ -117,21 +148,22 @@ func newHistoryView(events *[]event) (*fyne.Container, func()) { ) table.ShowHeaderRow = true table.CreateHeader = func() fyne.CanvasObject { - label := widget.NewLabel("") - label.Wrapping = fyne.TextTruncate - return label + return newHistoryHeader() } table.UpdateHeader = func(id widget.TableCellID, item fyne.CanvasObject) { - label := item.(*widget.Label) - label.SetText(headerText(id)) - label.TextStyle = fyne.TextStyle{Bold: true} - label.Refresh() + h := item.(*historyHeader) + h.SetText(headerText(id)) + if id.Row < 0 && id.Col == 0 { + h.OnTapped = func() { + descending = !descending + table.Refresh() + } + } else { + h.OnTapped = nil + } + h.Refresh() } table.OnSelected = func(id widget.TableCellID) { - if id.Row < 0 && id.Col == 0 { - descending = !descending - table.Refresh() - } table.Unselect(id) } table.SetColumnWidth(0, 150)