diff --git a/app/music.py b/app/music.py index 0c42118..20309d4 100644 --- a/app/music.py +++ b/app/music.py @@ -114,7 +114,6 @@ class Music: self.player = self.VLC.media_player_new(path) if self.player: self.player.audio_set_volume(self.max_volume) - self.current_track_start_time = datetime.now() status = self.player.play() if position: self.player.set_position(position) diff --git a/app/musicmuster.py b/app/musicmuster.py index 570d429..7cbe9d3 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -611,9 +611,9 @@ class Window(QMainWindow, Ui_MainWindow): # doesn't see player=None and kick off end-of-track actions self.playing = False - # Tell playlist_tab track has finished - if self.current_track.playlist_tab: - self.current_track.playlist_tab.play_stopped() + # Repaint playlist to remove currently playing track colour + with Session() as session: + self.current_track.playlist_tab.update_display(session) # Reset PlaylistTrack objects if self.current_track.track_id: @@ -1321,29 +1321,15 @@ class Window(QMainWindow, Ui_MainWindow): """ # Clear next track if on another tab - if self.next_track.playlist_tab != playlist_tab: - # We need to reset the ex-next-track playlist - if self.next_track.playlist_tab: - self.next_track.playlist_tab.clear_next(session) + if self.next_track.playlist_tab and ( + self.next_track.playlist_tab != playlist_tab): + # Repaint ex-next track playlist to remove highlighting + self.next_track.playlist_tab.update_display(session) + # Discard now-incorrect next_track PlaylistTrack + self.next_track = PlaylistTrack() - # Reset tab colour if on other tab - if (self.next_track.playlist_tab != - self.current.track_playlist_tab): - self.set_tab_colour( - self.next_track.playlist_tab, - QColor(Config.COLOUR_NORMAL_TAB)) - - # Note next playlist tab - self.next_track = PlaylistTrack() self.next_track.set_plr(session, plr, playlist_tab) - - # Set next playlist_tab tab colour if it isn't the - # currently-playing tab - if (self.next_track.playlist_tab != - self.current_track.playlist_tab): - self.set_tab_colour( - self.next_track.playlist_tab, - QColor(Config.COLOUR_NEXT_TAB)) + self.next_track.playlist_tab.update_display(session) # Populate footer if we're not currently playing if not self.playing and self.next_track.track_id: diff --git a/app/playlists.py b/app/playlists.py index 0eb854b..85751a7 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -62,13 +62,6 @@ start_time_re = re.compile(r"@\d\d:\d\d:\d\d") HEADER_NOTES_COLUMN = 2 MINIMUM_ROW_HEIGHT = 30 - -class RowMeta: - UNREADABLE = 2 - NEXT = 3 - CURRENT = 4 - - # Columns Column = namedtuple("Column", ['idx', 'heading']) columns = {} @@ -140,7 +133,6 @@ class PlaylistTab(QTableWidget): self.playlist_id = playlist_id self.menu: Optional[QMenu] = None - self.current_track_start_time: Optional[datetime] = None # Don't select text on edit self.setItemDelegate(NoSelectDelegate(self)) @@ -269,8 +261,10 @@ class PlaylistTab(QTableWidget): track_row = track_id > 0 header_row = not track_row if track_row: - current = row_number == self._get_current_track_row() - next_row = row_number == self._get_next_track_row() + current = ( + row_number == self._get_current_track_row_number() + ) + next_row = row_number == self._get_next_track_row_number() else: current = next_row = False @@ -536,12 +530,6 @@ class PlaylistTab(QTableWidget): # # ########## Externally called functions ########## - def clear_next(self, session) -> None: - """Clear next track marker""" - - self._meta_clear_next() - self.update_display(session) - def clear_selection(self) -> None: """Unselect all tracks and reset drag mode""" @@ -653,10 +641,6 @@ class PlaylistTab(QTableWidget): last_played_item = QTableWidgetItem(last_played_str) self.setItem(row, LASTPLAYED, last_played_item) - # Mark track if file is unreadable - if not file_is_readable(plr.track.path): - self._set_unreadable_row(row) - else: # This is a section header so it must have note text if plr.note is None: @@ -734,40 +718,14 @@ class PlaylistTab(QTableWidget): - Update display """ - # Note start time - self.current_track_start_time = datetime.now() - - # Mark next-track row as current - current_row = self._get_next_track_row() - if current_row is None: - return - self._set_current_track_row(current_row) - - # Mark current row as played - self._set_played_row(session, current_row) - - # Set next track - search_from = current_row + 1 + search_from = self._get_current_track_row_number() + 1 next_row = self._find_next_track_row(session, search_from) if next_row: self._set_next(session, next_row) - self._scroll_to_top(next_row) # Update display self.update_display(session) - def play_stopped(self) -> None: - """ - Notification from musicmuster that track has ended. - - Actions required: - - Remove current track marker - - Reset current track start time - """ - - self._clear_current_track_row() - self.current_track_start_time = None - def populate_display(self, session: Session, playlist_id: int, scroll_to_top: bool = True) -> None: """ @@ -856,13 +814,13 @@ class PlaylistTab(QTableWidget): def scroll_current_to_top(self) -> None: """Scroll currently-playing row to top""" - current_row = self._get_current_track_row() + current_row = self._get_current_track_row_number() self._scroll_to_top(current_row) def scroll_next_to_top(self) -> None: """Scroll nextly-playing row to top""" - next_row = self._get_next_track_row() + next_row = self._get_next_track_row_number() self._scroll_to_top(next_row) def set_search(self, text: str) -> None: @@ -992,8 +950,8 @@ class PlaylistTab(QTableWidget): - Show unplayed tracks in bold """ - current_row: Optional[int] = self._get_current_track_row() - next_row: Optional[int] = self._get_next_track_row() + current_row: Optional[int] = self._get_current_track_row_number() + next_row: Optional[int] = self._get_next_track_row_number() played = [ p.row_number for p in PlaylistRows.get_played_rows( session, self.playlist_id) @@ -1074,14 +1032,13 @@ class PlaylistTab(QTableWidget): # Render playing track if row == current_row: - # Set start time - self._set_row_start_time( - row, self.current_track_start_time) # Set last played time to "Today" self.item(row, LASTPLAYED).setText("Today") # Calculate next_start_time next_start_time = self._calculate_end_time( - self.current_track_start_time, track.duration) + self.musicmuster.current_track.start_time, + track.duration + ) # Set end time self._set_row_end_time(row, next_start_time) # Set colour @@ -1221,20 +1178,6 @@ class PlaylistTab(QTableWidget): return start + timedelta(milliseconds=duration) - def _clear_current_track_row(self) -> None: - """ - Clear current row if there is one. - """ - - current_row = self._get_current_track_row() - - if current_row is None: - return - - self._meta_clear_attribute(current_row, RowMeta.CURRENT) - # Reset colour - self._set_row_colour(current_row, None) - def _column_resize(self, idx: int, old: int, new: int) -> None: """ Called when column widths are changed. @@ -1348,23 +1291,15 @@ class PlaylistTab(QTableWidget): return None - def _get_current_track_row(self) -> Optional[int]: - """Return row marked as current, or None""" + def _get_current_track_row_number(self) -> Optional[int]: + """Return current track row or None""" - row = self._meta_search(RowMeta.CURRENT) - if len(row) > 0: - return row[0] - else: - return None + return self.musicmuster.current_track.row_number - def _get_next_track_row(self) -> Optional[int]: - """Return row marked as next, or None""" + def _get_next_track_row_number(self) -> Optional[int]: + """Return next track row or None""" - row = self._meta_search(RowMeta.NEXT) - if len(row) > 0: - return row[0] - else: - return None + return self.musicmuster.next_track.row_number @staticmethod def _get_note_text_time(text: str) -> Optional[datetime]: @@ -1522,15 +1457,6 @@ class PlaylistTab(QTableWidget): new_metadata: int = self._meta_get(row) & ~(1 << attribute) self.item(row, USERDATA).setData(self.ROW_FLAGS, new_metadata) - def _meta_clear_next(self) -> None: - """ - Clear next row if there is one. - """ - - next_row: Optional[int] = self._get_next_track_row() - if next_row is not None: - self._meta_clear_attribute(next_row, RowMeta.NEXT) - def _meta_get(self, row: int) -> int: """Return row metadata""" @@ -1804,12 +1730,6 @@ class PlaylistTab(QTableWidget): else: self.setColumnWidth(idx, Config.DEFAULT_COLUMN_WIDTH) - def _set_current_track_row(self, row: int) -> None: - """Mark this row as current track""" - - self._clear_current_track_row() - self._meta_set_attribute(row, RowMeta.CURRENT) - def _set_next(self, session: Session, row_number: int) -> None: """ Set passed row as next playlist row to play. @@ -1817,9 +1737,8 @@ class PlaylistTab(QTableWidget): Actions required: - Check row has a track - Check track is readable - - Mark as next track - - Update display - Notify musicmuster + - Update display """ track_id = self._get_row_track_id(row_number) @@ -1839,21 +1758,12 @@ class PlaylistTab(QTableWidget): self._set_unreadable_row(row_number) return None - # Mark as next track - self._set_next_track_row(row_number) - - # Update display - self.update_display(session) - # Notify musicmuster plr = session.get(PlaylistRows, self._get_playlistrow_id(row_number)) self.musicmuster.this_is_the_next_playlist_row(session, plr, self) - def _set_next_track_row(self, row: int) -> None: - """Mark this row as next track""" - - self._meta_clear_next() - self._meta_set_attribute(row, RowMeta.NEXT) + # Update display + self.update_display(session) def _set_played_row(self, session: Session, row: int) -> None: """Mark this row as played""" @@ -1927,11 +1837,6 @@ class PlaylistTab(QTableWidget): item = QTableWidgetItem(time_str) self.setItem(row, START_TIME, item) - def _set_unreadable_row(self, row: int) -> None: - """Mark this row as unreadable""" - - self._meta_set_attribute(row, RowMeta.UNREADABLE) - def _get_section_timing_string(self, ms: int, no_end: bool = False) -> None: """Return string describing section duration"""