diff --git a/app/playlists.py b/app/playlists.py index 524350b..096679f 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -74,8 +74,8 @@ class RowMeta: Column = namedtuple("Column", ['idx', 'heading']) columns = {} columns["userdata"] = Column(idx=0, heading=Config.COLUMN_NAME_AUTOPLAY) -columns["start_gap"] = Column( - idx=1, heading=Config.COLUMN_NAME_LEADING_SILENCE) +columns["start_gap"] = Column(idx=1, + heading=Config.COLUMN_NAME_LEADING_SILENCE) columns["title"] = Column(idx=2, heading=Config.COLUMN_NAME_TITLE) columns["artist"] = Column(idx=3, heading=Config.COLUMN_NAME_ARTIST) columns["duration"] = Column(idx=4, heading=Config.COLUMN_NAME_LENGTH) @@ -85,6 +85,17 @@ columns["lastplayed"] = Column(idx=7, heading=Config.COLUMN_NAME_LAST_PLAYED) columns["bitrate"] = Column(idx=8, heading=Config.COLUMN_NAME_BITRATE) columns["row_notes"] = Column(idx=9, heading=Config.COLUMN_NAME_NOTES) +USERDATA = columns["userdata"].idx +START_GAP = columns["start_gap"].idx +TITLE = columns["title"].idx +ARTIST = columns["artist"].idx +DURATION = columns["duration"].idx +START_TIME = columns["start_time"].idx +END_TIME = columns["end_time"].idx +LASTPLAYED = columns["lastplayed"].idx +BITRATE = columns["bitrate"].idx +ROW_NOTES = columns["row_notes"].idx + class NoSelectDelegate(QStyledItemDelegate): """ @@ -465,11 +476,11 @@ class PlaylistTab(QTableWidget): # If a track row, we only allow editing of title, artist and # note. Check that this column is one of those. self.edit_cell_type = None - if column == columns['title'].idx: + if column == TITLE: self.edit_cell_type = "title" - elif column == columns['artist'].idx: + elif column == ARTIST: self.edit_cell_type = "artist" - elif column == columns['row_notes'].idx: + elif column == ROW_NOTES: self.edit_cell_type = "row_notes" else: # Can't edit other columns @@ -477,7 +488,7 @@ class PlaylistTab(QTableWidget): # Check whether we're editing a notes row for later if self.edit_cell_type == "row_notes": - note_column = columns['row_notes'].idx + note_column = ROW_NOTES else: # This is a section header. if column != HEADER_NOTES_COLUMN: @@ -580,7 +591,7 @@ class PlaylistTab(QTableWidget): userdata_item.setData(self.ROW_FLAGS, 0) userdata_item.setData(self.PLAYLISTROW_ID, row_data.id) userdata_item.setData(self.ROW_TRACK_ID, row_data.track_id) - self.setItem(row, columns['userdata'].idx, userdata_item) + self.setItem(row, USERDATA, userdata_item) if row_data.track_id: # Add track details to items @@ -591,41 +602,41 @@ class PlaylistTab(QTableWidget): start_gap_item = QTableWidgetItem(str(start_gap)) if start_gap and start_gap >= 500: start_gap_item.setBackground(QColor(Config.COLOUR_LONG_START)) - self.setItem(row, columns['start_gap'].idx, start_gap_item) + self.setItem(row, START_GAP, start_gap_item) title_item = QTableWidgetItem(row_data.track.title) - self.setItem(row, columns['title'].idx, title_item) + self.setItem(row, TITLE, title_item) artist_item = QTableWidgetItem(row_data.track.artist) - self.setItem(row, columns['artist'].idx, artist_item) + self.setItem(row, ARTIST, artist_item) duration_item = QTableWidgetItem( ms_to_mmss(row_data.track.duration)) - self.setItem(row, columns['duration'].idx, duration_item) + self.setItem(row, DURATION, duration_item) self._set_row_duration(row, row_data.track.duration) start_item = QTableWidgetItem() - self.setItem(row, columns['start_time'].idx, start_item) + self.setItem(row, START_TIME, start_item) end_item = QTableWidgetItem() - self.setItem(row, columns['end_time'].idx, end_item) + self.setItem(row, END_TIME, end_item) if row_data.track.bitrate: bitrate = str(row_data.track.bitrate) else: bitrate = "" bitrate_item = QTableWidgetItem(bitrate) - self.setItem(row, columns['bitrate'].idx, bitrate_item) + self.setItem(row, BITRATE, bitrate_item) # As we have track info, any notes should be contained in # the notes column notes_item = QTableWidgetItem(row_data.note) - self.setItem(row, columns['row_notes'].idx, notes_item) + self.setItem(row, ROW_NOTES, notes_item) last_playtime = Playdates.last_played(session, row_data.track.id) last_played_str = get_relative_date(last_playtime) last_played_item = QTableWidgetItem(last_played_str) - self.setItem(row, columns['lastplayed'].idx, last_played_item) + self.setItem(row, LASTPLAYED, last_played_item) # Mark track if file is unreadable if not file_is_readable(row_data.track.path): @@ -1053,7 +1064,7 @@ class PlaylistTab(QTableWidget): # Colour any note if note_colour: - (self.item(row, columns['row_notes'].idx) + (self.item(row, ROW_NOTES) .setBackground(QColor(note_colour))) # Highlight low bitrates @@ -1065,7 +1076,7 @@ class PlaylistTab(QTableWidget): else: cell_colour = Config.COLOUR_BITRATE_OK brush = QBrush(QColor(cell_colour)) - self.item(row, columns['bitrate'].idx).setBackground(brush) + self.item(row, BITRATE).setBackground(brush) # Render playing track if row == current_row: @@ -1073,7 +1084,7 @@ class PlaylistTab(QTableWidget): self._set_row_start_time( row, self.current_track_start_time) # Set last played time to "Today" - self.item(row, columns['lastplayed'].idx).setText("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) @@ -1114,7 +1125,7 @@ class PlaylistTab(QTableWidget): if row in played: # Played today, so update last played column - self.item(row, columns['lastplayed'].idx).setText( + self.item(row, LASTPLAYED).setText( Config.LAST_PLAYED_TODAY_STRING) if self.musicmuster.hide_played_tracks: self.hideRow(row) @@ -1199,7 +1210,7 @@ class PlaylistTab(QTableWidget): ms_to_mmss(track.duration)) last_playtime = Playdates.last_played(session, track.id) last_played_str = get_relative_date(last_playtime) - self.item(row, columns['lastplayed'].idx).setText(last_played_str) + self.item(row, LASTPLAYED).setText(last_played_str) # Reset row span self.setSpan(row, 1, 1, 1) @@ -1391,8 +1402,7 @@ class PlaylistTab(QTableWidget): def _get_playlistrow_id(self, row: int) -> int: """Return the playlistrow_id associated with this row""" - playlistrow_id = (self.item(row, columns['userdata'].idx) - .data(self.PLAYLISTROW_ID)) + playlistrow_id = (self.item(row, USERDATA).data(self.PLAYLISTROW_ID)) return playlistrow_id @@ -1403,14 +1413,13 @@ class PlaylistTab(QTableWidget): if not track_id: return None - item_artist = self.item(row, columns['artist'].idx) + item_artist = self.item(row, ARTIST) return item_artist.text() def _get_row_duration(self, row: int) -> int: """Return duration associated with this row""" - duration = (self.item(row, columns['userdata'].idx) - .data(self.ROW_DURATION)) + duration = (self.item(row, USERDATA).data(self.ROW_DURATION)) if duration: return duration else: @@ -1421,16 +1430,16 @@ class PlaylistTab(QTableWidget): track_id = self._get_row_track_id(row) if track_id: - item_note = self.item(row, columns['row_notes'].idx) + item_note = self.item(row, ROW_NOTES) else: item_note = self.item(row, HEADER_NOTES_COLUMN) return item_note.text() def _get_row_start_time(self, row: int) -> Optional[datetime]: try: - if self.item(row, columns['start_time'].idx): + if self.item(row, START_TIME): return datetime.strptime(self.item( - row, columns['start_time'].idx).text(), + row, START_TIME).text(), Config.NOTE_TIME_FORMAT ) else: @@ -1445,14 +1454,14 @@ class PlaylistTab(QTableWidget): if not track_id: return None - item_title = self.item(row, columns['title'].idx) + item_title = self.item(row, TITLE) return item_title.text() def _get_row_track_id(self, row: int) -> int: """Return the track_id associated with this row or None""" try: - track_id = (self.item(row, columns['userdata'].idx) + track_id = (self.item(row, USERDATA) .data(self.ROW_TRACK_ID)) except AttributeError: return None @@ -1535,8 +1544,7 @@ class PlaylistTab(QTableWidget): raise ValueError(f"_meta_clear_attribute({row=}, {attribute=})") new_metadata: int = self._meta_get(row) & ~(1 << attribute) - self.item(row, columns['userdata'].idx).setData( - self.ROW_FLAGS, new_metadata) + self.item(row, USERDATA).setData(self.ROW_FLAGS, new_metadata) def _meta_clear_next(self) -> None: """ @@ -1550,8 +1558,7 @@ class PlaylistTab(QTableWidget): def _meta_get(self, row: int) -> int: """Return row metadata""" - return (self.item(row, columns['userdata'].idx) - .data(self.ROW_FLAGS)) + return (self.item(row, USERDATA).data(self.ROW_FLAGS)) def _meta_search(self, metadata: int, one: bool = True) -> List[int]: """ @@ -1592,8 +1599,7 @@ class PlaylistTab(QTableWidget): new_metadata: int = (1 << attribute) else: new_metadata = self._meta_get(row) | (1 << attribute) - self.item(row, columns['userdata'].idx).setData( - self.ROW_FLAGS, new_metadata) + self.item(row, USERDATA).setData(self.ROW_FLAGS, new_metadata) def _mplayer_play(self, track_id: int) -> None: """Play track with mplayer""" @@ -1651,8 +1657,7 @@ class PlaylistTab(QTableWidget): # Remove row duration self._set_row_duration(row, 0) # Remote track_id from row - self.item(row, columns['userdata'].idx).setData( - self.ROW_TRACK_ID, 0) + self.item(row, USERDATA).setData(self.ROW_TRACK_ID, 0) # Span the rows self.setSpan(row, 1, 1, len(columns)) # And refresh display @@ -1800,7 +1805,7 @@ class PlaylistTab(QTableWidget): boldfont = QFont() boldfont.setBold(bold) for column in range(self.columnCount()): - if column == columns['row_notes'].idx: + if column == ROW_NOTES: continue if self.item(row, column): self.item(row, column).setFont(boldfont) @@ -1820,7 +1825,7 @@ class PlaylistTab(QTableWidget): for column in range(1, self.columnCount()): # Don't change colour on start gap columns - if column == columns['start_gap'].idx: + if column == START_GAP: continue if self.item(row, column): self.item(row, column).setBackground(brush) @@ -1828,7 +1833,7 @@ class PlaylistTab(QTableWidget): def _set_row_duration(self, row: int, ms: int) -> None: """Set duration of this row in row metadata""" - self.item(row, columns['userdata'].idx).setData(self.ROW_DURATION, ms) + self.item(row, 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""" @@ -1838,7 +1843,7 @@ class PlaylistTab(QTableWidget): except AttributeError: time_str = "" item = QTableWidgetItem(time_str) - self.setItem(row, columns['end_time'].idx, item) + self.setItem(row, END_TIME, item) def _set_row_not_bold(self, row: int) -> None: """Set row to not be bold""" @@ -1853,7 +1858,7 @@ class PlaylistTab(QTableWidget): except AttributeError: time_str = "" item = QTableWidgetItem(time_str) - self.setItem(row, columns['start_time'].idx, item) + self.setItem(row, START_TIME, item) def _set_unreadable_row(self, row: int) -> None: """Mark this row as unreadable""" @@ -1884,7 +1889,7 @@ class PlaylistTab(QTableWidget): # Column to update is either HEADER_NOTES_COLUMN for a section # header or the appropriate row_notes column for a track row if playlist_row.track_id: - column = columns['row_notes'].idx + column = ROW_NOTES else: column = HEADER_NOTES_COLUMN @@ -1897,24 +1902,23 @@ class PlaylistTab(QTableWidget): Update the passed row with info from the passed track. """ - columns['start_time'].idx - item_startgap = self.item(row, columns['start_gap'].idx) + item_startgap = self.item(row, START_GAP) item_startgap.setText(str(track.start_gap)) if track.start_gap >= 500: item_startgap.setBackground(QColor(Config.COLOUR_LONG_START)) else: item_startgap.setBackground(QColor("white")) - item_title = self.item(row, columns['title'].idx) + item_title = self.item(row, TITLE) item_title.setText(track.title) - item_artist = self.item(row, columns['artist'].idx) + item_artist = self.item(row, ARTIST) item_artist.setText(track.artist) - item_duration = self.item(row, columns['duration'].idx) + item_duration = self.item(row, DURATION) item_duration.setText(ms_to_mmss(track.duration)) - item_bitrate = self.item(row, columns['bitrate'].idx) + item_bitrate = self.item(row, BITRATE) item_bitrate.setText(str(track.bitrate)) self.update_display(session)