diff --git a/app/playlists.py b/app/playlists.py index 961719f..8aa38fc 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -34,7 +34,7 @@ class Playlist(QTableWidget): COL_TITLE = 2 COL_ARTIST = 3 COL_DURATION = 4 - COL_ENDTIME = 5 + COL_START_TIME = 5 COL_PATH = 6 NOTE_COL_SPAN = 3 @@ -213,7 +213,7 @@ class Playlist(QTableWidget): item = QTableWidgetItem(start_time.strftime("%H:%M:%S")) else: item = QTableWidgetItem() - self.setItem(row, self.COL_ENDTIME, item) + self.setItem(row, self.COL_START_TIME, item) item = QTableWidgetItem() self.setItem(row, self.COL_PATH, item) @@ -348,7 +348,7 @@ class Playlist(QTableWidget): except AttributeError: return "" - def calculate_row_endtime(self, row, start): + def calculate_next_start_time(self, row, start): "Return this row's end time given its start time" duration = Tracks.get_duration( @@ -497,8 +497,6 @@ class Playlist(QTableWidget): else: title = "" DEBUG(f"meta_set(row={row}, title={title}, metadata={metadata})") - if metadata is None and self.current_track and title == self.current_track.title: - import ipdb; ipdb.set_trace() if row is None: raise ValueError(f"meta_set() with row=None") @@ -541,6 +539,7 @@ class Playlist(QTableWidget): # Play (new) current. self.music.play(self.current_track.path) + self.current_track.start_time = datetime.now() # Update metadata self.meta_set_current(self.meta_get_next()) @@ -614,40 +613,69 @@ class Playlist(QTableWidget): def repaint(self, clear_selection=True): "Set row colours, fonts, etc, and save playlist" + DEBUG(f"repaint(clear_selection={clear_selection})") + self.save_playlist() if clear_selection: self.clearSelection() current = self.meta_get_current() - next = self.meta_get_next() + next = self.meta_get_next() or 0 notes = self.meta_get_notes() # Set colours and start times - running_end_time = None - for row in range(self.rowCount()): + next_start_time = None + # Set current row if there is one + row = current + if row is not None: + # Set start time + next_start_time = self.calculate_next_start_time( + row, self.current_track.start_time) + item = QTableWidgetItem( + self.current_track.start_time.strftime("%H:%M:%S") + ) + self.setItem(row, self.COL_START_TIME, item) + # Set colour + self.set_row_colour( + current, QColor(Config.COLOUR_CURRENT_PLAYLIST) + ) + # Make bold + self.set_row_bold(current) + + # Now from the top, but ignore timing until either next or current + for row in range(self.rowCount()): + # Current row is already set if row == current: - # Set end time - running_end_time = datetime.now() + timedelta( - milliseconds=self.current_track.silence_at) - item = QTableWidgetItem(running_end_time.strftime("%H:%M:%S")) - self.setItem(row, self.COL_ENDTIME, item) + continue + + set_time = row >= min(next or 0, current or 0) + + # Handle notes + if row in notes: + if set_time: + try: + next_start_time = datetime.strptime( + self.item(row, self.COL_START_TIME).text(), + "%H:%M:%S" + ) + except ValueError: + pass # Set colour self.set_row_colour( - current, QColor(Config.COLOUR_CURRENT_PLAYLIST) + row, QColor(Config.COLOUR_NOTES_PLAYLIST) ) - # Make bold - self.set_row_bold(current) + self.set_row_bold(row) + # Handle next elif row == next: - # Set end time - if running_end_time: - running_end_time = self.calculate_row_endtime( - row, running_end_time) + if set_time and next_start_time: item = QTableWidgetItem( - running_end_time.strftime("%H:%M:%S") + next_start_time.strftime("%H:%M:%S") ) - self.setItem(row, self.COL_ENDTIME, item) + self.setItem(row, self.COL_START_TIME, item) + next_start_time = self.calculate_next_start_time( + row, next_start_time) # Set colour self.set_row_colour( row, QColor(Config.COLOUR_NEXT_PLAYLIST) @@ -655,20 +683,7 @@ class Playlist(QTableWidget): # Make bold self.set_row_bold(row) - elif row in notes: - # Set/reset end time - try: - running_end_time = datetime.strptime( - self.item(row, self.COL_ENDTIME).text(), "%H:%M:%S" - ) - except ValueError: - pass - # Set colour - self.set_row_colour( - row, QColor(Config.COLOUR_NOTES_PLAYLIST) - ) - self.set_row_bold(row) - + # Handle other rows else: # Stripe rows if row % 2: @@ -677,22 +692,20 @@ class Playlist(QTableWidget): colour = QColor(Config.COLOUR_EVEN_PLAYLIST) self.set_row_colour(row, colour) - # Add running end time - if self.item(row, self.COL_INDEX): - if int(self.item(row, self.COL_INDEX).text()) > 0: - if running_end_time: - running_end_time = self.calculate_row_endtime( - row, running_end_time) - item = QTableWidgetItem( - running_end_time.strftime("%H:%M:%S")) - self.setItem(row, self.COL_ENDTIME, item) + # Set time + if set_time and next_start_time: + item = QTableWidgetItem( + next_start_time.strftime("%H:%M:%S")) + self.setItem(row, self.COL_START_TIME, item) + next_start_time = self.calculate_next_start_time( + row, next_start_time) - # Dim played tracks - track_id = int(self.item(row, self.COL_INDEX).text()) - if track_id in self.played_tracks: - self.set_row_not_bold(row) - else: - self.set_row_bold(row) + # Dim played tracks + track_id = int(self.item(row, self.COL_INDEX).text()) + if track_id in self.played_tracks: + self.set_row_not_bold(row) + else: + self.set_row_bold(row) # Headers might need updating self.parent().parent().update_headers() diff --git a/app/ui/main_window.ui b/app/ui/main_window.ui index d84e4b7..7e84781 100644 --- a/app/ui/main_window.ui +++ b/app/ui/main_window.ui @@ -491,7 +491,7 @@ border: 1px solid rgb(85, 87, 83); - End time + Start