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
|
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"
|
|
||||||
original_next_track_playlist_tab = None
|
|
||||||
if (
|
|
||||||
# If we already have a next tab lined up and it's neither
|
# 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
|
# the "new" next tab nor the current track tab then we need
|
||||||
# to reset the tab colour.
|
# to reset the tab colour.
|
||||||
|
if (
|
||||||
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,
|
||||||
|
|||||||
106
app/playlists.py
106
app/playlists.py
@ -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:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user