Don't use row metadat for next/current track

Get them from musicmuster.
This commit is contained in:
Keith Edmunds 2023-01-01 10:49:54 +00:00
parent daf8069de2
commit 5e75659c48
3 changed files with 31 additions and 141 deletions

View File

@ -114,7 +114,6 @@ class Music:
self.player = self.VLC.media_player_new(path)
if self.player:
self.player.audio_set_volume(self.max_volume)
self.current_track_start_time = datetime.now()
status = self.player.play()
if position:
self.player.set_position(position)

View File

@ -611,9 +611,9 @@ class Window(QMainWindow, Ui_MainWindow):
# doesn't see player=None and kick off end-of-track actions
self.playing = False
# Tell playlist_tab track has finished
if self.current_track.playlist_tab:
self.current_track.playlist_tab.play_stopped()
# Repaint playlist to remove currently playing track colour
with Session() as session:
self.current_track.playlist_tab.update_display(session)
# Reset PlaylistTrack objects
if self.current_track.track_id:
@ -1321,29 +1321,15 @@ class Window(QMainWindow, Ui_MainWindow):
"""
# Clear next track if on another tab
if self.next_track.playlist_tab != playlist_tab:
# We need to reset the ex-next-track playlist
if self.next_track.playlist_tab:
self.next_track.playlist_tab.clear_next(session)
if self.next_track.playlist_tab and (
self.next_track.playlist_tab != playlist_tab):
# Repaint ex-next track playlist to remove highlighting
self.next_track.playlist_tab.update_display(session)
# Discard now-incorrect next_track PlaylistTrack
self.next_track = PlaylistTrack()
# Reset tab colour if on other tab
if (self.next_track.playlist_tab !=
self.current.track_playlist_tab):
self.set_tab_colour(
self.next_track.playlist_tab,
QColor(Config.COLOUR_NORMAL_TAB))
# Note next playlist tab
self.next_track = PlaylistTrack()
self.next_track.set_plr(session, plr, playlist_tab)
# Set next playlist_tab tab colour if it isn't the
# currently-playing tab
if (self.next_track.playlist_tab !=
self.current_track.playlist_tab):
self.set_tab_colour(
self.next_track.playlist_tab,
QColor(Config.COLOUR_NEXT_TAB))
self.next_track.playlist_tab.update_display(session)
# Populate footer if we're not currently playing
if not self.playing and self.next_track.track_id:

View File

@ -62,13 +62,6 @@ start_time_re = re.compile(r"@\d\d:\d\d:\d\d")
HEADER_NOTES_COLUMN = 2
MINIMUM_ROW_HEIGHT = 30
class RowMeta:
UNREADABLE = 2
NEXT = 3
CURRENT = 4
# Columns
Column = namedtuple("Column", ['idx', 'heading'])
columns = {}
@ -140,7 +133,6 @@ class PlaylistTab(QTableWidget):
self.playlist_id = playlist_id
self.menu: Optional[QMenu] = None
self.current_track_start_time: Optional[datetime] = None
# Don't select text on edit
self.setItemDelegate(NoSelectDelegate(self))
@ -269,8 +261,10 @@ class PlaylistTab(QTableWidget):
track_row = track_id > 0
header_row = not track_row
if track_row:
current = row_number == self._get_current_track_row()
next_row = row_number == self._get_next_track_row()
current = (
row_number == self._get_current_track_row_number()
)
next_row = row_number == self._get_next_track_row_number()
else:
current = next_row = False
@ -536,12 +530,6 @@ class PlaylistTab(QTableWidget):
# # ########## Externally called functions ##########
def clear_next(self, session) -> None:
"""Clear next track marker"""
self._meta_clear_next()
self.update_display(session)
def clear_selection(self) -> None:
"""Unselect all tracks and reset drag mode"""
@ -653,10 +641,6 @@ class PlaylistTab(QTableWidget):
last_played_item = QTableWidgetItem(last_played_str)
self.setItem(row, LASTPLAYED, last_played_item)
# Mark track if file is unreadable
if not file_is_readable(plr.track.path):
self._set_unreadable_row(row)
else:
# This is a section header so it must have note text
if plr.note is None:
@ -734,40 +718,14 @@ class PlaylistTab(QTableWidget):
- Update display
"""
# Note start time
self.current_track_start_time = datetime.now()
# Mark next-track row as current
current_row = self._get_next_track_row()
if current_row is None:
return
self._set_current_track_row(current_row)
# Mark current row as played
self._set_played_row(session, current_row)
# Set next track
search_from = current_row + 1
search_from = self._get_current_track_row_number() + 1
next_row = self._find_next_track_row(session, search_from)
if next_row:
self._set_next(session, next_row)
self._scroll_to_top(next_row)
# Update display
self.update_display(session)
def play_stopped(self) -> None:
"""
Notification from musicmuster that track has ended.
Actions required:
- Remove current track marker
- Reset current track start time
"""
self._clear_current_track_row()
self.current_track_start_time = None
def populate_display(self, session: Session, playlist_id: int,
scroll_to_top: bool = True) -> None:
"""
@ -856,13 +814,13 @@ class PlaylistTab(QTableWidget):
def scroll_current_to_top(self) -> None:
"""Scroll currently-playing row to top"""
current_row = self._get_current_track_row()
current_row = self._get_current_track_row_number()
self._scroll_to_top(current_row)
def scroll_next_to_top(self) -> None:
"""Scroll nextly-playing row to top"""
next_row = self._get_next_track_row()
next_row = self._get_next_track_row_number()
self._scroll_to_top(next_row)
def set_search(self, text: str) -> None:
@ -992,8 +950,8 @@ class PlaylistTab(QTableWidget):
- Show unplayed tracks in bold
"""
current_row: Optional[int] = self._get_current_track_row()
next_row: Optional[int] = self._get_next_track_row()
current_row: Optional[int] = self._get_current_track_row_number()
next_row: Optional[int] = self._get_next_track_row_number()
played = [
p.row_number for p in PlaylistRows.get_played_rows(
session, self.playlist_id)
@ -1074,14 +1032,13 @@ class PlaylistTab(QTableWidget):
# Render playing track
if row == current_row:
# Set start time
self._set_row_start_time(
row, self.current_track_start_time)
# Set last played time to "Today"
self.item(row, LASTPLAYED).setText("Today")
# Calculate next_start_time
next_start_time = self._calculate_end_time(
self.current_track_start_time, track.duration)
self.musicmuster.current_track.start_time,
track.duration
)
# Set end time
self._set_row_end_time(row, next_start_time)
# Set colour
@ -1221,20 +1178,6 @@ class PlaylistTab(QTableWidget):
return start + timedelta(milliseconds=duration)
def _clear_current_track_row(self) -> None:
"""
Clear current row if there is one.
"""
current_row = self._get_current_track_row()
if current_row is None:
return
self._meta_clear_attribute(current_row, RowMeta.CURRENT)
# Reset colour
self._set_row_colour(current_row, None)
def _column_resize(self, idx: int, old: int, new: int) -> None:
"""
Called when column widths are changed.
@ -1348,23 +1291,15 @@ class PlaylistTab(QTableWidget):
return None
def _get_current_track_row(self) -> Optional[int]:
"""Return row marked as current, or None"""
def _get_current_track_row_number(self) -> Optional[int]:
"""Return current track row or None"""
row = self._meta_search(RowMeta.CURRENT)
if len(row) > 0:
return row[0]
else:
return None
return self.musicmuster.current_track.row_number
def _get_next_track_row(self) -> Optional[int]:
"""Return row marked as next, or None"""
def _get_next_track_row_number(self) -> Optional[int]:
"""Return next track row or None"""
row = self._meta_search(RowMeta.NEXT)
if len(row) > 0:
return row[0]
else:
return None
return self.musicmuster.next_track.row_number
@staticmethod
def _get_note_text_time(text: str) -> Optional[datetime]:
@ -1522,15 +1457,6 @@ class PlaylistTab(QTableWidget):
new_metadata: int = self._meta_get(row) & ~(1 << attribute)
self.item(row, USERDATA).setData(self.ROW_FLAGS, new_metadata)
def _meta_clear_next(self) -> None:
"""
Clear next row if there is one.
"""
next_row: Optional[int] = self._get_next_track_row()
if next_row is not None:
self._meta_clear_attribute(next_row, RowMeta.NEXT)
def _meta_get(self, row: int) -> int:
"""Return row metadata"""
@ -1804,12 +1730,6 @@ class PlaylistTab(QTableWidget):
else:
self.setColumnWidth(idx, Config.DEFAULT_COLUMN_WIDTH)
def _set_current_track_row(self, row: int) -> None:
"""Mark this row as current track"""
self._clear_current_track_row()
self._meta_set_attribute(row, RowMeta.CURRENT)
def _set_next(self, session: Session, row_number: int) -> None:
"""
Set passed row as next playlist row to play.
@ -1817,9 +1737,8 @@ class PlaylistTab(QTableWidget):
Actions required:
- Check row has a track
- Check track is readable
- Mark as next track
- Update display
- Notify musicmuster
- Update display
"""
track_id = self._get_row_track_id(row_number)
@ -1839,21 +1758,12 @@ class PlaylistTab(QTableWidget):
self._set_unreadable_row(row_number)
return None
# Mark as next track
self._set_next_track_row(row_number)
# Update display
self.update_display(session)
# Notify musicmuster
plr = session.get(PlaylistRows, self._get_playlistrow_id(row_number))
self.musicmuster.this_is_the_next_playlist_row(session, plr, self)
def _set_next_track_row(self, row: int) -> None:
"""Mark this row as next track"""
self._meta_clear_next()
self._meta_set_attribute(row, RowMeta.NEXT)
# Update display
self.update_display(session)
def _set_played_row(self, session: Session, row: int) -> None:
"""Mark this row as played"""
@ -1927,11 +1837,6 @@ class PlaylistTab(QTableWidget):
item = QTableWidgetItem(time_str)
self.setItem(row, START_TIME, item)
def _set_unreadable_row(self, row: int) -> None:
"""Mark this row as unreadable"""
self._meta_set_attribute(row, RowMeta.UNREADABLE)
def _get_section_timing_string(self, ms: int,
no_end: bool = False) -> None:
"""Return string describing section duration"""