Use symbolic names for columns

This commit is contained in:
Keith Edmunds 2022-09-19 13:17:26 +01:00
parent b42ffcec69
commit 84d746bd2f

View File

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