diff --git a/app/musicmuster.py b/app/musicmuster.py index c5d4ef6..eb06f11 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -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 diff --git a/app/playlists.py b/app/playlists.py index bdbe2ae..a609ab8 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -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"""