Speed up moving rows

Fixes #262
Fixed #260
This commit is contained in:
Keith Edmunds 2024-11-16 09:58:08 +00:00
parent b4fcd5f2c9
commit 7cfd2a45a2

View File

@ -990,12 +990,28 @@ class PlaylistModel(QAbstractTableModel):
@line_profiler.profile @line_profiler.profile
def refresh_data(self, session: db.session, dummy_for_profiling=None) -> None: def refresh_data(self, session: db.session, dummy_for_profiling=None) -> None:
"""Populate dicts for data calls""" """Populate self.playlist_rows with playlist data"""
# Populate self.playlist_rows with playlist data # We used to clear self.playlist_rows each time but that's
self.playlist_rows.clear() # expensive and slow on big playlists
# Note where each playlist_id is
plid_to_row: dict[int, int] = {}
for oldrow in self.playlist_rows:
plrdata = self.playlist_rows[oldrow]
plid_to_row[plrdata.playlistrow_id] = plrdata.row_number
# build a new playlist_rows
new_playlist_rows: dict[int, RowAndTrack] = {}
for p in PlaylistRows.get_playlist_rows(session, self.playlist_id): for p in PlaylistRows.get_playlist_rows(session, self.playlist_id):
self.playlist_rows[p.row_number] = RowAndTrack(p) if p.id not in plid_to_row:
new_playlist_rows[p.row_number] = RowAndTrack(p)
else:
new_playlist_rows[p.row_number] = self.playlist_rows[plid_to_row[p.id]]
new_playlist_rows[p.row_number].row_number = p.row_number
# Copy to self.playlist_rows
self.playlist_rows = new_playlist_rows
def refresh_row(self, session, row_number): def refresh_row(self, session, row_number):
"""Populate dict for one row from database""" """Populate dict for one row from database"""