From de7c49eca3e15a332b55a2499f64005fcde3283a Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 23 Jan 2026 18:30:32 -0800 Subject: [PATCH] optimize tracklist rendering --- ui/widgets/tracklistrow.go | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/ui/widgets/tracklistrow.go b/ui/widgets/tracklistrow.go index d5063f4..4beb16a 100644 --- a/ui/widgets/tracklistrow.go +++ b/ui/widgets/tracklistrow.go @@ -410,6 +410,17 @@ func (t *tracklistRowBase) TrackID() string { } func (t *tracklistRowBase) Update(tm *util.TrackListModel, rowNum int, onUpdate func()) { + // Show only columns configured to be visible + for i := 2; i < len(t.tracklist.columns); i++ { + t.setColVisibility(i, !t.tracklist.visibleColumns[i]) + } + + // Ealy return if nothing else needs updating + if !t.needsUpdate(tm, rowNum) { + return + } + + // Throttle updates when many are happening in a short time if tracklistUpdateCounter.NumEventsSince(time.Now().Add(-300*time.Millisecond)) > 10 { t.doUpdate(&emptyTrack, 1) if t.nextUpdateModel == nil { @@ -434,6 +445,26 @@ func (t *tracklistRowBase) Update(tm *util.TrackListModel, rowNum int, onUpdate } } +func (t *tracklistRowBase) needsUpdate(tm *util.TrackListModel, rowNum int) bool { + tr := tm.Track() + if tm.Selected != t.Selected { + return true + } + if t.trackID != tr.ID || t.trackNum != rowNum { + return true + } + if t.playCount != tr.PlayCount || t.isFavorite != tr.Favorite || t.rating.Rating != tr.Rating { + return true + } + if t.rating.IsDisabled != t.tracklist.Options.DisableRating { + return true + } + if isPlaying := t.tracklist.nowPlayingID == tr.ID; isPlaying != t.isPlaying { + return true + } + return false +} + func (t *tracklistRowBase) doUpdate(tm *util.TrackListModel, rowNum int) { changed := false if tm.Selected != t.Selected { @@ -535,13 +566,6 @@ func (t *tracklistRowBase) doUpdate(tm *util.TrackListModel, rowNum int) { t.rating.Refresh() } - // Show only columns configured to be visible - for i := 2; i < len(t.tracklist.columns); i++ { - if ch := t.setColVisibility(i, !t.tracklist.visibleColumns[i]); ch { - changed = true - } - } - if changed { tracklistUpdateCounter.Add() t.Refresh()