Make row number a playlist-only concept

Solves problem of rows being moved in playlist and musicmuster not
knowing which row the current/next track is (but it doesn't need to
know; it only needs to know the PlaylistRows id).
This commit is contained in:
Keith Edmunds 2023-01-07 11:50:05 +00:00
parent 087139f4de
commit 7584ad2090
2 changed files with 29 additions and 16 deletions

View File

@ -120,6 +120,10 @@ class PlaylistTrack:
def __init__(self) -> None:
"""
Only initialises data structure. Call set_plr to populate.
Do NOT store row_number here - that changes if tracks are reordered
in playlist (add, remove, drag/drop) and we shouldn't care about row
number: that's the playlist's problem.
"""
self.artist = None
@ -131,7 +135,6 @@ class PlaylistTrack:
self.playlist_id = None
self.playlist_tab = None
self.plr_id = None
self.row_number = None
self.silence_at = None
self.start_gap = None
self.start_time = None
@ -163,7 +166,6 @@ class PlaylistTrack:
self.path = track.path
self.playlist_id = plr.playlist_id
self.plr_id = plr.id
self.row_number = plr.row_number
self.silence_at = track.silence_at
self.start_gap = track.start_gap
self.start_time = None

View File

@ -720,6 +720,11 @@ class PlaylistTab(QTableWidget):
current_row = self._get_current_track_row_number()
if not current_row:
send_mail(Config.ERRORS_TO,
Config.ERRORS_FROM,
"MusicMuster unexpected failure",
stackprinter.format()
)
return
search_from = current_row + 1
@ -749,6 +754,11 @@ class PlaylistTab(QTableWidget):
# Add the rows
playlist = session.get(Playlists, playlist_id)
if not playlist:
send_mail(Config.ERRORS_TO,
Config.ERRORS_FROM,
"MusicMuster unexpected failure",
stackprinter.format()
)
return
for plr in playlist.rows:
@ -963,8 +973,8 @@ class PlaylistTab(QTableWidget):
- Show unplayed tracks in bold
"""
current_row: Optional[int] = self._get_current_track_row_number()
next_row: Optional[int] = self._get_next_track_row_number()
current_row = self._get_current_track_row_number()
next_row = self._get_next_track_row_number()
played = [
p.row_number for p in PlaylistRows.get_played_rows(
session, self.playlist_id)
@ -1313,23 +1323,13 @@ class PlaylistTab(QTableWidget):
"""Return current track row or None"""
current_track = self.musicmuster.current_track
if not current_track.track_id:
return None
if current_track.playlist_tab == self:
return current_track.row_number
else:
return None
return self._plrid_to_row_number(current_track.plr_id)
def _get_next_track_row_number(self) -> Optional[int]:
"""Return next track row or None"""
next_track = self.musicmuster.next_track
if not next_track.track_id:
return None
if next_track.playlist_tab == self:
return next_track.row_number
else:
return None
return self._plrid_to_row_number(next_track.plr_id)
@staticmethod
def _get_note_text_time(text: str) -> Optional[datetime]:
@ -1571,6 +1571,17 @@ class PlaylistTab(QTableWidget):
open_in_audacity(track.path)
def _plrid_to_row_number(self, plrid: int) -> Optional[int]:
"""
Return row number of passed plrid, or None if not found
"""
for row_number in range(self.rowCount()):
if self._get_playlistrow_id(row_number) == plrid:
return row_number
return None
def _remove_track(self, row: int) -> None:
"""Remove track from row, making it a section header"""