Maintain track headers when changing playlists

This commit is contained in:
Keith Edmunds 2021-04-25 00:04:01 +01:00
parent d157dbd7c0
commit b2fe5f6f38
2 changed files with 48 additions and 43 deletions

View File

@ -50,9 +50,9 @@ class Window(QMainWindow, Ui_MainWindow):
# Hard code to the first playlist for now
# TODO
if self.playlist.load_playlist(1):
self.update_headers()
self.enable_play_next_controls()
self.playlist.load_playlist(1)
self.update_headers()
self.enable_play_next_controls()
self.plLabel = QLabel(f"Playlist: {self.playlist.playlist_name}")
self.statusbar.addPermanentWidget(self.plLabel)

View File

@ -17,6 +17,7 @@ from PyQt5.QtWidgets import (
import helpers
import music
import os
from config import Config
from datetime import datetime, timedelta
@ -25,7 +26,6 @@ from model import Notes, Playdates, Playlists, PlaylistTracks, Settings, Tracks
from ui.dlg_search_database_ui import Ui_Dialog
from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist
class Playlist(QTableWidget):
# Column names
COL_INDEX = 0
@ -364,6 +364,12 @@ class Playlist(QTableWidget):
def calculate_next_start_time(self, row, start):
"Return this row's end time given its start time"
if start is None:
return None
if row is None:
DEBUG("calculate_next_start_time() called with row=None")
return None
duration = Tracks.get_duration(
int(self.item(row, self.COL_INDEX).text()))
return start + timedelta(milliseconds=duration)
@ -387,8 +393,6 @@ class Playlist(QTableWidget):
Load tracks and notes from playlist id.
Set first track as next track to play.
Return True if successful else False.
"""
DEBUG(f"load_playlist(plid={plid})")
@ -416,22 +420,36 @@ class Playlist(QTableWidget):
for item in sorted(data, key=lambda x: x[0]):
self.add_to_playlist(item[1], repaint=False)
# Set the first non-notes row as next track to play
notes_rows = self.meta_get_notes()
for row in range(self.rowCount()):
if row in notes_rows:
continue
self.meta_set_next(row)
self.tracks_changed()
return True
# If this is not the first playlist loaded, we may already have
# a next track set in which case don't change it. Otherwise, set
# the first non-notes row as next track to play.
if not self.next_track:
notes_rows = self.meta_get_notes()
for row in range(self.rowCount()):
if row in notes_rows:
continue
self.cue_next_track(row)
break
return False
# Scroll to top
scroll_to = self.item(0, self.COL_INDEX)
self.scrollToItem(scroll_to, QAbstractItemView.PositionAtTop)
def meta_clear(self, row):
"Clear metadata for row"
self.meta_set(row, None)
def meta_clear_current(self):
"""
Clear current row if there is one. There may not be if
we've changed playlists
"""
current_row = self.meta_get_current()
if current_row:
self.meta_clear(current_row)
def meta_find(self, metadata, one=True):
"""
Search rows for metadata.
@ -568,7 +586,7 @@ class Playlist(QTableWidget):
if row in notes_rows:
continue
if self.item(row, self.COL_INDEX):
self.meta_set_next(row)
self.cue_next_track(row)
break
# Tell database to record it as played
@ -579,7 +597,7 @@ class Playlist(QTableWidget):
self.played_tracks.append(self.current_track.id)
# Update display
self.tracks_changed()
self.repaint()
def search_database(self):
dlg = DbDialog(self)
@ -609,8 +627,7 @@ class Playlist(QTableWidget):
return False
if self.item(row, self.COL_INDEX):
self.meta_set_next(row)
self.tracks_changed()
self.cue_next_track(row)
return True
return False
@ -626,8 +643,8 @@ class Playlist(QTableWidget):
self.previous_track = self.current_track
self.previous_track_position = 0
self.meta_clear(self.meta_get_current())
self.tracks_changed()
self.meta_clear_current()
self.repaint()
def repaint(self, clear_selection=True):
"Set row colours, fonts, etc, and save playlist"
@ -850,31 +867,21 @@ class Playlist(QTableWidget):
item = QTableWidgetItem(time_str)
self.setItem(row, self.COL_START_TIME, item)
def tracks_changed(self):
def cue_next_track(self, next_row):
"""
One or more of current or next track has changed.
The row metadata is definitive because the same track may appear
more than once in the playlist, but only one track may be marked
as current or next.
Update self.current_track and self.next_track.
Set the passed row as the next track to play
"""
# Update instance variables
current_row = self.meta_get_current()
if current_row is not None:
track_id = int(self.item(current_row, self.COL_INDEX).text())
if not self.current_track or self.current_track.id != track_id:
self.current_track = Tracks.get_track(track_id)
else:
self.current_track = None
next_row = self.meta_get_next()
if next_row is not None:
self.meta_set_next(next_row)
track_id = int(self.item(next_row, self.COL_INDEX).text())
if not self.next_track or self.next_track.id != track_id:
self.next_track = Tracks.get_track(track_id)
# Check we can read it
if not self.can_read_track(self.next_track):
self.parent().parent().show_warning(
"Can't read next track",
self.next_track.path)
else:
self.next_track = None
@ -937,13 +944,11 @@ class DbDialog(QDialog):
def double_click(self, entry):
track_id = entry.data(Qt.UserRole)
self.add_track(track_id)
# Select search text to make it easier for next search
self.select_searchtext()
def add_track(self, track_id):
track = Tracks.track_from_id(track_id)
# Store in current playlist in database
db_playlist = Playlists.get_playlist_by_id(self.parent().playlist_id)
db_playlist.add_track(track)
# Add to on-screen playlist
self.parent().add_to_playlist(track)
# Select search text to make it easier for next search
self.select_searchtext()