WIP playlists refactor: unify note and tab colour settings
This commit is contained in:
parent
188623e574
commit
c5f89dbcf4
@ -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,
|
||||
|
||||
110
app/playlists.py
110
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:
|
||||
"""
|
||||
|
||||
Loading…
Reference in New Issue
Block a user