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'])
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)