Compare commits

..

2 Commits

Author SHA1 Message Date
mixeme 5f36c7a0e1 feat(ui): rename pause/resume all to Disable/Enable auto with pause icon
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 22:30:30 +03:00
mixeme fb2f9b6e30 fix(ui): restore History column sort after Fyne 2.7 header-tap change
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 <noreply@anthropic.com>
2026-06-25 22:24:59 +03:00
2 changed files with 50 additions and 18 deletions
+43 -11
View File
@@ -73,15 +73,46 @@ func logColumnWidth(events []event) float32 {
return width 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()) { func newHistoryView(events *[]event) (*fyne.Container, func()) {
descending := false descending := false
headerText := func(id widget.TableCellID) string { headerText := func(id widget.TableCellID) string {
headers := []string{"Time", "Trigger", "Job", "State", "Detail", "Log"} headers := []string{"Time", "Trigger", "Job", "State", "Detail", "Log"}
if id.Row < 0 && id.Col == 0 { if id.Row < 0 && id.Col == 0 {
if descending { if descending {
return "Time desc" return "Time "
} }
return "Time asc" return "Time "
} }
if id.Row < 0 && id.Col >= 0 && id.Col < len(headers) { if id.Row < 0 && id.Col >= 0 && id.Col < len(headers) {
return headers[id.Col] return headers[id.Col]
@@ -117,21 +148,22 @@ func newHistoryView(events *[]event) (*fyne.Container, func()) {
) )
table.ShowHeaderRow = true table.ShowHeaderRow = true
table.CreateHeader = func() fyne.CanvasObject { table.CreateHeader = func() fyne.CanvasObject {
label := widget.NewLabel("") return newHistoryHeader()
label.Wrapping = fyne.TextTruncate
return label
} }
table.UpdateHeader = func(id widget.TableCellID, item fyne.CanvasObject) { table.UpdateHeader = func(id widget.TableCellID, item fyne.CanvasObject) {
label := item.(*widget.Label) h := item.(*historyHeader)
label.SetText(headerText(id)) h.SetText(headerText(id))
label.TextStyle = fyne.TextStyle{Bold: true}
label.Refresh()
}
table.OnSelected = func(id widget.TableCellID) {
if id.Row < 0 && id.Col == 0 { if id.Row < 0 && id.Col == 0 {
h.OnTapped = func() {
descending = !descending descending = !descending
table.Refresh() table.Refresh()
} }
} else {
h.OnTapped = nil
}
h.Refresh()
}
table.OnSelected = func(id widget.TableCellID) {
table.Unselect(id) table.Unselect(id)
} }
table.SetColumnWidth(0, 150) table.SetColumnWidth(0, 150)
+5 -5
View File
@@ -202,9 +202,9 @@ func newJobsView(w fyne.Window, svc *app.Service) (fyne.CanvasObject, func()) {
refreshView() refreshView()
}) })
stopAllText, stopAllIcon := "Pause all", theme.MediaStopIcon() stopAllText, stopAllIcon := "Disable auto", theme.MediaPauseIcon()
if schedulerPaused { if schedulerPaused {
stopAllText, stopAllIcon = "Resume all", theme.MediaPlayIcon() stopAllText, stopAllIcon = "Enable auto", theme.MediaPlayIcon()
} }
schedulerStateText := "Scheduler running" schedulerStateText := "Scheduler running"
if schedulerPaused { if schedulerPaused {
@@ -223,12 +223,12 @@ func newJobsView(w fyne.Window, svc *app.Service) (fyne.CanvasObject, func()) {
} }
if schedulerPaused { if schedulerPaused {
schedulerState.SetText("Scheduler paused") schedulerState.SetText("Scheduler paused")
stopAllButton.SetText("Resume all") stopAllButton.SetText("Enable auto")
stopAllButton.SetIcon(theme.MediaPlayIcon()) stopAllButton.SetIcon(theme.MediaPlayIcon())
} else { } else {
schedulerState.SetText("Scheduler running") schedulerState.SetText("Scheduler running")
stopAllButton.SetText("Pause all") stopAllButton.SetText("Disable auto")
stopAllButton.SetIcon(theme.MediaStopIcon()) stopAllButton.SetIcon(theme.MediaPauseIcon())
} }
list.Refresh() list.Refresh()
refreshView() refreshView()