WIP playlists refactor: unify note and tab colour settings

This commit is contained in:
Keith Edmunds 2023-03-05 19:44:13 +00:00
parent 188623e574
commit c5f89dbcf4
2 changed files with 88 additions and 56 deletions

View File

@ -740,13 +740,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.playing = False self.playing = False
# Remove currently playing track colour # Remove currently playing track colour
if ( if self.current_track.playlist_tab:
self.current_track and self.current_track.playlist_tab.play_ended()
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)
# Reset PlaylistTrack objects # Reset PlaylistTrack objects
if self.current_track.track_id: if self.current_track.track_id:
@ -1276,8 +1271,7 @@ class Window(QMainWindow, Ui_MainWindow):
self.current_track.playlist_tab != self.visible_playlist_tab() self.current_track.playlist_tab != self.visible_playlist_tab()
and self.previous_track.plr_id and self.previous_track.plr_id
): ):
self.previous_track.playlist_tab.reset_plr_row_colour( self.previous_track.playlist_tab.reset_next()
self.previous_track.plr_id)
# Update headers # Update headers
self.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, def this_is_the_next_playlist_row(self, session: scoped_session,
plr: PlaylistRows, plr: PlaylistRows,
playlist_tab: PlaylistTab) -> None: next_track_playlist_tab: PlaylistTab) -> None:
""" """
This is notification from a playlist tab that it holds the next This is notification from a playlist tab that it holds the next
playlist row to be played. playlist row to be played.
@ -1534,7 +1528,7 @@ class Window(QMainWindow, Ui_MainWindow):
- Clear next track if on other tab - Clear next track if on other tab
- Reset tab colour if on other tab - Reset tab colour if on other tab
- Note next playlist tab - Note next playlist tab
- Set next playlist_tab tab colour - Set next next_track_playlist_tab tab colour
- Note next track - Note next track
- Update headers - Update headers
- Populate info tabs - Populate info tabs
@ -1544,24 +1538,24 @@ class Window(QMainWindow, Ui_MainWindow):
if plr.track_id is None: if plr.track_id is None:
return return
# Clean up if we are replacing an existing "next track" # If we already have a next tab lined up and it's neither
original_next_track_playlist_tab = None # the "new" next tab nor the current track tab then we need
# to reset the tab colour.
if ( 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 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 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, self.set_tab_colour(self.next_track.playlist_tab,
QColor(Config.COLOUR_NORMAL_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.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.next_track.playlist_tab:
if self.current_track.playlist_tab != 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, self.set_tab_colour(self.next_track.playlist_tab,

View File

@ -339,11 +339,17 @@ class PlaylistTab(QTableWidget):
self._set_row_start_time(row, start_time) self._set_row_start_time(row, start_time)
else: else:
self._set_row_start_time(row, None) 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 # Update note display
self._set_row_note(session, row, new_text) # If this is a header row, also calcuate track times in case
# If this is a header row, ecalcuate track times in case
# note added a start time # 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() self._update_start_end_times()
else: else:
track = None track = None
@ -516,6 +522,8 @@ class PlaylistTab(QTableWidget):
row_number = self.get_new_row_number() row_number = self.get_new_row_number()
plr = PlaylistRows(session, self.playlist_id, None, row_number, note) plr = PlaylistRows(session, self.playlist_id, None, row_number, note)
self.insert_row(session, plr) self.insert_row(session, plr)
self._set_row_note_colour(session, row_number, note,
section_header=True)
self.save_playlist(session) self.save_playlist(session)
def insert_row(self, session: scoped_session, plr: PlaylistRows, def insert_row(self, session: scoped_session, plr: PlaylistRows,
@ -534,6 +542,9 @@ class PlaylistTab(QTableWidget):
self._set_row_bold(row) self._set_row_bold(row)
else: else:
_ = self._set_row_userdata(row, self.PLAYED, True) _ = 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: else:
# This is a section header so it must have note text # This is a section header so it must have note text
if plr.note is None: if plr.note is None:
@ -547,7 +558,8 @@ class PlaylistTab(QTableWidget):
self._set_item_text(row, i, None) self._set_item_text(row, i, None)
self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1) 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 # Save (or clear) track_id
_ = self._set_row_track_id(row, 0) _ = self._set_row_track_id(row, 0)
@ -597,16 +609,15 @@ class PlaylistTab(QTableWidget):
# Let display update, then save playlist # Let display update, then save playlist
QTimer.singleShot(0, lambda: self.save_playlist(session)) 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: if not row:
return return
self.musicmuster.clear_next() self._set_row_colour_default(row)
self._set_row_colour(row, None)
self.clear_selection() self.clear_selection()
def play_started(self, session: scoped_session) -> None: def play_started(self, session: scoped_session) -> None:
@ -638,8 +649,7 @@ class PlaylistTab(QTableWidget):
self._set_next(session, next_row) self._set_next(session, next_row)
# Display row as current track # Display row as current track
self._set_row_colour(current_row, self._set_row_colour_current(current_row)
QColor(Config.COLOUR_CURRENT_PLAYLIST))
# Update start/stop times # Update start/stop times
self._update_start_end_times() self._update_start_end_times()
@ -699,14 +709,17 @@ class PlaylistTab(QTableWidget):
for row in sorted(row_numbers, reverse=True): for row in sorted(row_numbers, reverse=True):
self.removeRow(row) self.removeRow(row)
def reset_plr_row_colour(self, plr_id: int) -> None: def reset_next(self) -> None:
"""Reset background of row pointed to by plr_id""" """
Unmark next track
"""
row = self._plrid_to_row_number(plr_id) row = self._get_next_track_row_number()
if not row: if not row:
return return
self.musicmuster.clear_next()
self._set_row_colour(row, None) self._set_row_colour_default(row)
self.clear_selection()
def save_playlist(self, session: scoped_session) -> None: def save_playlist(self, session: scoped_session) -> None:
""" """
@ -881,8 +894,8 @@ class PlaylistTab(QTableWidget):
# Update attributes of row # Update attributes of row
self._set_row_bold(row) self._set_row_bold(row)
self._set_row_colour(plr.row_number, None) self._set_row_colour_default(plr.row_number)
_ = self._set_row_note(session, row, plr.note) _ = self._set_row_note_colour(session, row, plr.note)
self._update_row_track_info(session, row, track) self._update_row_track_info(session, row, track)
self.clear_selection() self.clear_selection()
@ -956,7 +969,7 @@ class PlaylistTab(QTableWidget):
# Unmark as next # Unmark as next
if next_row: if next_row:
self._add_context_menu("Unmark as next track", self._add_context_menu("Unmark as next track",
self.mark_unnext) self.reset_next)
# ---------------------- # ----------------------
self.menu.addSeparator() self.menu.addSeparator()
@ -1510,12 +1523,12 @@ class PlaylistTab(QTableWidget):
"""Rescan track""" """Rescan track"""
with Session() as session: with Session() as session:
row_colour = None
track = session.get(Tracks, track_id) track = session.get(Tracks, track_id)
if track: if track:
if not file_is_readable(track.path): if not file_is_readable(track.path):
row_colour = QColor(Config.COLOUR_UNREADABLE) self._set_row_colour_unreadable(row)
else: else:
self._set_row_colour_default(row)
set_track_metadata(session, track) set_track_metadata(session, track)
self._update_row_track_info(session, row, track) self._update_row_track_info(session, row, track)
else: else:
@ -1525,14 +1538,13 @@ class PlaylistTab(QTableWidget):
note_text = "" note_text = ""
else: else:
note_text += f"{track_id=} not found" 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( log.error(
f"playlists._rescan({track_id=}): " f"playlists._rescan({track_id=}): "
"Track not found" "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() self.clear_selection()
def _run_subprocess(self, args): def _run_subprocess(self, args):
@ -1725,7 +1737,7 @@ class PlaylistTab(QTableWidget):
# Clear any existing next track # Clear any existing next track
next_track_row = self._get_next_track_row_number() next_track_row = self._get_next_track_row_number()
if next_track_row: if next_track_row:
self._set_row_colour(next_track_row, None) self._set_row_colour_default(next_track_row)
# Notify musicmuster # Notify musicmuster
plr = self._get_row_plr(session, row_number) 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) self.musicmuster.this_is_the_next_playlist_row(session, plr, self)
# Display row as next track # 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 # Update start/stop times
self.clear_selection() self.clear_selection()
@ -1818,13 +1830,40 @@ class PlaylistTab(QTableWidget):
brush = QBrush() brush = QBrush()
for column in range(1, self.columnCount()): for column in range(1, self.columnCount()):
# Don't change colour on start gap columns if column in [START_GAP, BITRATE]:
if column == START_GAP:
continue continue
item = self.item(row, column) item = self.item(row, column)
if item: if item:
item.setBackground(brush) 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, def _set_row_duration(self, row: int,
ms: Optional[int]) -> QTableWidgetItem: ms: Optional[int]) -> QTableWidgetItem:
"""Set duration of this row. Also set in row metadata""" """Set duration of this row. Also set in row metadata"""
@ -1861,10 +1900,10 @@ class PlaylistTab(QTableWidget):
self._set_row_bold(row, False) self._set_row_bold(row, False)
def _set_row_note(self, session: scoped_session, row: int, def _set_row_note_colour(self, session: scoped_session, row: int,
note_text: Optional[str], note_text: Optional[str],
section_header: bool = False) -> QTableWidgetItem: section_header: bool = False) -> QTableWidgetItem:
"""Set row note""" """Set row note and colour"""
if section_header: if section_header:
column = HEADER_NOTES_COLUMN column = HEADER_NOTES_COLUMN
@ -1877,10 +1916,9 @@ class PlaylistTab(QTableWidget):
notes_item = self._set_item_text(row, column, note_text) notes_item = self._set_item_text(row, column, note_text)
note_colour = NoteColours.get_colour(session, 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 note_colour = Config.COLOUR_NOTES_PLAYLIST
else:
note_colour = NoteColours.get_colour(session, note_text)
if note_colour: if note_colour:
notes_item.setBackground(QColor(note_colour)) notes_item.setBackground(QColor(note_colour))
@ -2035,7 +2073,7 @@ class PlaylistTab(QTableWidget):
_ = self._set_row_track_path(row, track.path) _ = self._set_row_track_path(row, track.path)
if not file_is_readable(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: def _update_section_headers(self, session: scoped_session) -> None:
""" """