From c5f89dbcf47b65b6388b0cc81ba309a98aa0b36e Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 5 Mar 2023 19:44:13 +0000 Subject: [PATCH] WIP playlists refactor: unify note and tab colour settings --- app/musicmuster.py | 34 ++++++-------- app/playlists.py | 110 ++++++++++++++++++++++++++++++--------------- 2 files changed, 88 insertions(+), 56 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index 0c981cf..e166470 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -740,13 +740,8 @@ class Window(QMainWindow, Ui_MainWindow): self.playing = False # Remove currently playing track colour - if ( - self.current_track and - self.current_track.playlist_tab and - self.current_track.plr_id - ): - self.current_track.playlist_tab.reset_plr_row_colour( - self.current_track.plr_id) + if self.current_track.playlist_tab: + self.current_track.playlist_tab.play_ended() # Reset PlaylistTrack objects if self.current_track.track_id: @@ -1276,8 +1271,7 @@ class Window(QMainWindow, Ui_MainWindow): self.current_track.playlist_tab != self.visible_playlist_tab() and self.previous_track.plr_id ): - self.previous_track.playlist_tab.reset_plr_row_colour( - self.previous_track.plr_id) + self.previous_track.playlist_tab.reset_next() # Update headers self.update_headers() @@ -1525,7 +1519,7 @@ class Window(QMainWindow, Ui_MainWindow): def this_is_the_next_playlist_row(self, session: scoped_session, plr: PlaylistRows, - playlist_tab: PlaylistTab) -> None: + next_track_playlist_tab: PlaylistTab) -> None: """ This is notification from a playlist tab that it holds the next playlist row to be played. @@ -1534,7 +1528,7 @@ class Window(QMainWindow, Ui_MainWindow): - Clear next track if on other tab - Reset tab colour if on other tab - Note next playlist tab - - Set next playlist_tab tab colour + - Set next next_track_playlist_tab tab colour - Note next track - Update headers - Populate ‘info’ tabs @@ -1544,24 +1538,24 @@ class Window(QMainWindow, Ui_MainWindow): if plr.track_id is None: return - # Clean up if we are replacing an existing "next track" - original_next_track_playlist_tab = None + # If we already have a next tab lined up and it's neither + # the "new" next tab nor the current track tab then we need + # to reset the tab colour. if ( - # If we already have a next tab lined up and it's neither - # the "new" next tab nor the current track tab then we need - # to reset the tab colour. self.next_track.playlist_tab and - self.next_track.playlist_tab != playlist_tab and + self.next_track.playlist_tab != next_track_playlist_tab and self.next_track.playlist_tab != self.current_track.playlist_tab ): - original_next_track_playlist_tab = self.next_track.playlist_tab self.set_tab_colour(self.next_track.playlist_tab, QColor(Config.COLOUR_NORMAL_TAB)) - # Discard now-incorrect next_track PlaylistTrack + # Discard now-incorrect next_track PlaylistTrack and tell + # playlist_tab too + self.next_track.playlist_tab.reset_next() self.clear_next() - self.next_track.set_plr(session, plr, playlist_tab) + # Populate self.next_track + self.next_track.set_plr(session, plr, next_track_playlist_tab) if self.next_track.playlist_tab: if self.current_track.playlist_tab != self.next_track.playlist_tab: self.set_tab_colour(self.next_track.playlist_tab, diff --git a/app/playlists.py b/app/playlists.py index 35fa1f3..14aa045 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -339,11 +339,17 @@ class PlaylistTab(QTableWidget): self._set_row_start_time(row, start_time) else: self._set_row_start_time(row, None) + self._set_row_note_colour(session, row, new_text, + section_header=not bool(track_id)) # Update note display - self._set_row_note(session, row, new_text) - # If this is a header row, ecalcuate track times in case + # If this is a header row, also calcuate track times in case # note added a start time - if not track_id: + if track_id: + self._set_row_note_colour(session, row, new_text, + section_header=False) + else: + self._set_row_note_colour(session, row, new_text, + section_header=True) self._update_start_end_times() else: track = None @@ -516,6 +522,8 @@ class PlaylistTab(QTableWidget): row_number = self.get_new_row_number() plr = PlaylistRows(session, self.playlist_id, None, row_number, note) self.insert_row(session, plr) + self._set_row_note_colour(session, row_number, note, + section_header=True) self.save_playlist(session) def insert_row(self, session: scoped_session, plr: PlaylistRows, @@ -534,6 +542,9 @@ class PlaylistTab(QTableWidget): self._set_row_bold(row) else: _ = self._set_row_userdata(row, self.PLAYED, True) + if plr.note is None: + plr.note = "" + self._set_row_note_colour(session, row, plr.note) else: # This is a section header so it must have note text if plr.note is None: @@ -547,7 +558,8 @@ class PlaylistTab(QTableWidget): self._set_item_text(row, i, None) self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1) - _ = self._set_row_note(session, row, plr.note, section_header=True) + _ = self._set_row_note_colour(session, row, plr.note, + section_header=True) # Save (or clear) track_id _ = self._set_row_track_id(row, 0) @@ -597,16 +609,15 @@ class PlaylistTab(QTableWidget): # Let display update, then save playlist QTimer.singleShot(0, lambda: self.save_playlist(session)) - def mark_unnext(self) -> None: + def play_ended(self) -> None: """ - Unmark passed row as next track + Called by musicmuster when play has ended """ - row = self._get_next_track_row_number() + row = self._get_current_track_row_number() if not row: return - self.musicmuster.clear_next() - self._set_row_colour(row, None) + self._set_row_colour_default(row) self.clear_selection() def play_started(self, session: scoped_session) -> None: @@ -638,8 +649,7 @@ class PlaylistTab(QTableWidget): self._set_next(session, next_row) # Display row as current track - self._set_row_colour(current_row, - QColor(Config.COLOUR_CURRENT_PLAYLIST)) + self._set_row_colour_current(current_row) # Update start/stop times self._update_start_end_times() @@ -699,14 +709,17 @@ class PlaylistTab(QTableWidget): for row in sorted(row_numbers, reverse=True): self.removeRow(row) - def reset_plr_row_colour(self, plr_id: int) -> None: - """Reset background of row pointed to by plr_id""" + def reset_next(self) -> None: + """ + Unmark next track + """ - row = self._plrid_to_row_number(plr_id) + row = self._get_next_track_row_number() if not row: return - - self._set_row_colour(row, None) + self.musicmuster.clear_next() + self._set_row_colour_default(row) + self.clear_selection() def save_playlist(self, session: scoped_session) -> None: """ @@ -881,8 +894,8 @@ class PlaylistTab(QTableWidget): # Update attributes of row self._set_row_bold(row) - self._set_row_colour(plr.row_number, None) - _ = self._set_row_note(session, row, plr.note) + self._set_row_colour_default(plr.row_number) + _ = self._set_row_note_colour(session, row, plr.note) self._update_row_track_info(session, row, track) self.clear_selection() @@ -956,7 +969,7 @@ class PlaylistTab(QTableWidget): # Unmark as next if next_row: self._add_context_menu("Unmark as next track", - self.mark_unnext) + self.reset_next) # ---------------------- self.menu.addSeparator() @@ -1510,12 +1523,12 @@ class PlaylistTab(QTableWidget): """Rescan track""" with Session() as session: - row_colour = None track = session.get(Tracks, track_id) if track: if not file_is_readable(track.path): - row_colour = QColor(Config.COLOUR_UNREADABLE) + self._set_row_colour_unreadable(row) else: + self._set_row_colour_default(row) set_track_metadata(session, track) self._update_row_track_info(session, row, track) else: @@ -1525,14 +1538,13 @@ class PlaylistTab(QTableWidget): note_text = "" else: note_text += f"{track_id=} not found" - self._set_row_note(session, row, note_text) + self._set_row_note_colour(session, row, note_text) log.error( f"playlists._rescan({track_id=}): " "Track not found" ) - row_colour = QColor(Config.COLOUR_UNREADABLE) + self._set_row_colour_unreadable(row) - self._set_row_colour(row, row_colour) self.clear_selection() def _run_subprocess(self, args): @@ -1725,7 +1737,7 @@ class PlaylistTab(QTableWidget): # Clear any existing next track next_track_row = self._get_next_track_row_number() if next_track_row: - self._set_row_colour(next_track_row, None) + self._set_row_colour_default(next_track_row) # Notify musicmuster plr = self._get_row_plr(session, row_number) @@ -1735,7 +1747,7 @@ class PlaylistTab(QTableWidget): self.musicmuster.this_is_the_next_playlist_row(session, plr, self) # Display row as next track - self._set_row_colour(row_number, QColor(Config.COLOUR_NEXT_PLAYLIST)) + self._set_row_colour_next(row_number) # Update start/stop times self.clear_selection() @@ -1818,13 +1830,40 @@ class PlaylistTab(QTableWidget): brush = QBrush() for column in range(1, self.columnCount()): - # Don't change colour on start gap columns - if column == START_GAP: + if column in [START_GAP, BITRATE]: continue item = self.item(row, column) if item: item.setBackground(brush) + def _set_row_colour_current(self, row: int) -> None: + """ + Set current track row colour + """ + + self._set_row_colour(row, QColor(Config.COLOUR_CURRENT_PLAYLIST)) + + def _set_row_colour_default(self, row: int) -> None: + """ + Set default row colour + """ + + self._set_row_colour(row, None) + + def _set_row_colour_next(self, row: int) -> None: + """ + Set next track row colour + """ + + self._set_row_colour(row, QColor(Config.COLOUR_NEXT_PLAYLIST)) + + def _set_row_colour_unreadable(self, row: int) -> None: + """ + Set unreadable row colour + """ + + self._set_row_colour(row, QColor(Config.COLOUR_UNREADABLE)) + def _set_row_duration(self, row: int, ms: Optional[int]) -> QTableWidgetItem: """Set duration of this row. Also set in row metadata""" @@ -1861,10 +1900,10 @@ class PlaylistTab(QTableWidget): self._set_row_bold(row, False) - def _set_row_note(self, session: scoped_session, row: int, - note_text: Optional[str], - section_header: bool = False) -> QTableWidgetItem: - """Set row note""" + def _set_row_note_colour(self, session: scoped_session, row: int, + note_text: Optional[str], + section_header: bool = False) -> QTableWidgetItem: + """Set row note and colour""" if section_header: column = HEADER_NOTES_COLUMN @@ -1877,10 +1916,9 @@ class PlaylistTab(QTableWidget): notes_item = self._set_item_text(row, column, note_text) note_colour = NoteColours.get_colour(session, note_text) - if section_header: + + if section_header and not note_colour: note_colour = Config.COLOUR_NOTES_PLAYLIST - else: - note_colour = NoteColours.get_colour(session, note_text) if note_colour: notes_item.setBackground(QColor(note_colour)) @@ -2035,7 +2073,7 @@ class PlaylistTab(QTableWidget): _ = self._set_row_track_path(row, track.path) if not file_is_readable(track.path): - self._set_row_colour(row, QColor(Config.COLOUR_UNREADABLE)) + self._set_row_colour_unreadable(row) def _update_section_headers(self, session: scoped_session) -> None: """