Fix next start times

Fixes #113
This commit is contained in:
Keith Edmunds 2022-04-17 10:42:20 +01:00
parent 0fe26e8a75
commit 9e65eef621

View File

@ -67,6 +67,7 @@ class PlaylistTab(QTableWidget):
# Qt.UserRoles
ROW_METADATA = Qt.UserRole
CONTENT_OBJECT = Qt.UserRole + 1
ROW_DURATION = Qt.UserRole + 2
def __init__(self, musicmuster: QMainWindow, session: Session,
playlist_id: int, *args, **kwargs):
@ -358,6 +359,7 @@ class PlaylistTab(QTableWidget):
duration_item: QTableWidgetItem = QTableWidgetItem(
helpers.ms_to_mmss(track.duration)
)
self._set_row_duration(row, track.duration)
self.setItem(row, self.COL_DURATION, duration_item)
last_playtime: Optional[datetime] = Playdates.last_played(
@ -713,12 +715,6 @@ class PlaylistTab(QTableWidget):
# For unplayed tracks, if there's a 'current' or 'next'
# track marked, populate start times from then onwards. A note
# with a start time will reset the next track start time.
if current_row and next_row:
start_times_row = min(current_row, next_row)
else:
start_times_row = current_row or next_row
if not start_times_row:
start_times_row = 0
# Cycle through all rows
for row in range(self.rowCount()):
@ -778,8 +774,8 @@ class PlaylistTab(QTableWidget):
last_played_str)
# Calculate next_start_time
next_start_time = self._calculate_track_end_time(
track, self.current_track_start_time)
next_start_time = self._calculate_row_end_time(
row, self.current_track_start_time)
# Set end time
self._set_row_end_time(row, next_start_time)
@ -795,8 +791,9 @@ class PlaylistTab(QTableWidget):
# Render next track
if row == next_row:
# if there's a track playing, set start time from that
if current_row:
start_time = self.current_track_start_time
if current_row is not None:
start_time = self._calculate_row_end_time(
current_row, self.current_track_start_time)
else:
# No current track to base from, but don't change
# time if it's already set
@ -806,8 +803,7 @@ class PlaylistTab(QTableWidget):
self._set_row_start_time(row, start_time)
# Set end time
next_start_time = self._calculate_track_end_time(
track, start_time)
next_start_time = self._calculate_row_end_time(row, start_time)
self._set_row_end_time(row, next_start_time)
# Set colour
@ -829,10 +825,10 @@ class PlaylistTab(QTableWidget):
self._set_row_not_bold(row)
else:
# Set start/end times as we haven't played it yet
if next_start_time and row >= start_times_row:
if next_start_time:
self._set_row_start_time(row, next_start_time)
next_start_time = self._calculate_track_end_time(
track, next_start_time)
next_start_time = self._calculate_row_end_time(
row, next_start_time)
# Set end time
self._set_row_end_time(row, next_start_time)
else:
@ -868,18 +864,14 @@ class PlaylistTab(QTableWidget):
track: Tracks = self._get_row_track_object(row, session)
open_in_audacity(track.path)
@staticmethod
def _calculate_track_end_time(
track: Tracks, start: Optional[datetime]) -> Optional[datetime]:
"""Return this track's end time given its start time"""
def _calculate_row_end_time(self, row, start: Optional[datetime]) \
-> Optional[datetime]:
"""Return this row's end time given its start time"""
if start is None:
return None
if track is None:
DEBUG("_calculate_next_start_time() called with track=None")
return None
duration = track.duration
duration = self._get_row_duration(row)
return start + timedelta(milliseconds=duration)
def _context_menu(self, pos): # review
@ -1141,6 +1133,14 @@ class PlaylistTab(QTableWidget):
return self._meta_search(RowMeta.NOTE, one=False)
def _get_row_duration(self, row: int) -> int:
"""Return duration associated with this row"""
try:
return self.item(row, self.COL_USERDATA).data(self.ROW_DURATION)
except:
return 0
def _get_row_end_time(self, row) -> Optional[datetime]:
"""
Return row end time as string
@ -1551,6 +1551,13 @@ class PlaylistTab(QTableWidget):
self.item(row, self.COL_USERDATA).setData(
self.CONTENT_OBJECT, object_id)
def _set_row_duration(self, row: int, ms: int) -> None:
"""Set duration of this row in milliseconds"""
assert self.item(row, self.COL_USERDATA)
self.item(row, self.COL_USERDATA).setData(self.ROW_DURATION, ms)
def _set_row_end_time(self, row: int, time: Optional[datetime]) -> None:
"""Set passed row end time to passed time"""