better debouncing of track row updates on fast scrolling

This commit is contained in:
Drew Weymouth
2025-02-21 07:33:10 -08:00
parent 6ae61d3bad
commit 2d209a29f5
2 changed files with 22 additions and 13 deletions
+1 -1
View File
@@ -184,7 +184,7 @@ func NewTracklist(tracks []*mediaprovider.Track, im *backend.ImageManager, useCo
if t.Options.AutoNumber {
i = itemID + 1
}
tr.Update(model, i)
tr.Update(model, i, func() {})
if t.OnTrackShown != nil {
t.OnTrackShown(itemID)
}
+21 -12
View File
@@ -169,6 +169,7 @@ type tracklistRowBase struct {
tracklist *Tracklist
trackNum int
trackID string
coverID string
isPlaying bool
isFavorite bool
playCount int
@@ -202,7 +203,7 @@ type TracklistRow interface {
SetOnTappedSecondary(func(_ *fyne.PointEvent, trackNum int))
TrackID() string
Update(model *util.TrackListModel, rowNum int)
Update(model *util.TrackListModel, rowNum int, onDone func())
}
type ExpandedTracklistRow struct {
@@ -254,11 +255,13 @@ func NewExpandedTracklistRow(tracklist *Tracklist, im *backend.ImageManager, pla
return t
}
func (t *ExpandedTracklistRow) Update(tm *util.TrackListModel, rowNum int) {
if t.trackID != tm.Track().ID {
t.imageLoader.Load(tm.Track().CoverArtID)
func (t *ExpandedTracklistRow) Update(tm *util.TrackListModel, rowNum int, _ func()) {
if t.trackID != tm.Track().ID && t.img.HaveImage() {
t.img.SetImage(nil, false)
}
t.tracklistRowBase.Update(tm, rowNum)
t.tracklistRowBase.Update(tm, rowNum, func() {
t.imageLoader.Load(t.coverID)
})
}
func NewCompactTracklistRow(tracklist *Tracklist, playingIcon fyne.CanvasObject) *CompactTracklistRow {
@@ -342,23 +345,28 @@ func (t *tracklistRowBase) TrackID() string {
return t.trackID
}
func (t *tracklistRowBase) Update(tm *util.TrackListModel, rowNum int) {
func (t *tracklistRowBase) Update(tm *util.TrackListModel, rowNum int, onUpdate func()) {
if tracklistUpdateCounter.NumEventsSince(time.Now().Add(-150*time.Millisecond)) > 20 {
t.doUpdate(&emptyTrack, 1)
if t.nextUpdateModel == nil {
// queue to run later
fyne.Do(func() {
if t.nextUpdateModel != nil {
t.doUpdate(t.nextUpdateModel, t.nextUpdateRowNum)
}
t.nextUpdateModel = nil
})
go func() {
<-time.After(10 * time.Millisecond)
fyne.Do(func() {
if t.nextUpdateModel != nil {
t.doUpdate(t.nextUpdateModel, t.nextUpdateRowNum)
onUpdate()
}
t.nextUpdateModel = nil
})
}()
}
t.nextUpdateModel = tm
t.nextUpdateRowNum = rowNum
} else {
t.nextUpdateModel = nil
t.doUpdate(tm, rowNum)
onUpdate()
}
}
@@ -375,6 +383,7 @@ func (t *tracklistRowBase) doUpdate(tm *util.TrackListModel, rowNum int) {
if id := tr.ID; id != t.trackID {
t.EnsureUnfocused()
t.trackID = id
t.coverID = tr.CoverArtID
t.name.Segments[0].(*widget.TextSegment).Text = tr.Title
t.name.SetToolTip(tr.Title)