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
# 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,

View File

@ -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:
"""