Copy/paste, insert track/header works

This commit is contained in:
Keith Edmunds 2022-12-23 20:52:18 +00:00
parent 647e7d478a
commit 46f2b662f3
2 changed files with 50 additions and 55 deletions

View File

@ -759,7 +759,7 @@ class Window(QMainWindow, Ui_MainWindow):
if ok:
with Session() as session:
playlist_tab.insert_header(session, dlg.textValue())
self.save_playlist(session)
playlist_tab.save_playlist(session)
def insert_track(self) -> None:
"""Show dialog box to select and add track from database"""

View File

@ -595,45 +595,31 @@ class PlaylistTab(QTableWidget):
to do the heavy lifing.
"""
# PlaylistRows object requires a row number, but that number
# can be reset by calling PlaylistRows.fixup_rownumbers() later,
# so just fudge a row number for now.
row_number = 0
row_number = self.get_new_row_number()
plr = PlaylistRows(session, self.playlist_id, None, row_number, note)
self.insert_row(session, plr)
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
if repaint:
self.update_display(session, clear_selection=False)
self.insert_row(session, plr, repaint)
self.save_playlist(session)
def insert_row(self, session: Session, row_data: PlaylistRows,
def insert_row(self, session: Session, plr: PlaylistRows,
repaint: bool = True) -> None:
"""
Insert a row into playlist tab.
If playlist has a row selected, add new row above. Otherwise,
add to end of playlist.
Note: we ignore the row number in the PlaylistRows record. That is
used only to order the query that generates the records.
Insert passed playlist row (plr) into playlist tab.
"""
if self.selectionModel().hasSelection():
row = self.currentRow()
else:
row = self.rowCount()
row = plr.row_number
self.insertRow(row)
# Add row metadata to userdata column
userdata_item = QTableWidgetItem()
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)
userdata_item.setData(self.PLAYLISTROW_ID, plr.id)
userdata_item.setData(self.ROW_TRACK_ID, plr.track_id)
self.setItem(row, USERDATA, userdata_item)
if row_data.track_id:
if plr.track_id:
# Add track details to items
try:
start_gap = row_data.track.start_gap
start_gap = plr.track.start_gap
except AttributeError:
return
start_gap_item = QTableWidgetItem(str(start_gap))
@ -641,17 +627,17 @@ class PlaylistTab(QTableWidget):
start_gap_item.setBackground(QColor(Config.COLOUR_LONG_START))
self.setItem(row, START_GAP, start_gap_item)
title_item = QTableWidgetItem(row_data.track.title)
title_item = QTableWidgetItem(plr.track.title)
log.debug(f"KAE: insert_row:619, {title_item.text()=}")
self.setItem(row, TITLE, title_item)
artist_item = QTableWidgetItem(row_data.track.artist)
artist_item = QTableWidgetItem(plr.track.artist)
self.setItem(row, ARTIST, artist_item)
duration_item = QTableWidgetItem(
ms_to_mmss(row_data.track.duration))
ms_to_mmss(plr.track.duration))
self.setItem(row, DURATION, duration_item)
self._set_row_duration(row, row_data.track.duration)
self._set_row_duration(row, plr.track.duration)
start_item = QTableWidgetItem()
self.setItem(row, START_TIME, start_item)
@ -659,8 +645,8 @@ class PlaylistTab(QTableWidget):
end_item = QTableWidgetItem()
self.setItem(row, END_TIME, end_item)
if row_data.track.bitrate:
bitrate = str(row_data.track.bitrate)
if plr.track.bitrate:
bitrate = str(plr.track.bitrate)
else:
bitrate = ""
bitrate_item = QTableWidgetItem(bitrate)
@ -668,23 +654,23 @@ class PlaylistTab(QTableWidget):
# As we have track info, any notes should be contained in
# the notes column
notes_item = QTableWidgetItem(row_data.note)
notes_item = QTableWidgetItem(plr.note)
self.setItem(row, ROW_NOTES, notes_item)
last_playtime = Playdates.last_played(session, row_data.track.id)
last_playtime = Playdates.last_played(session, plr.track.id)
last_played_str = get_relative_date(last_playtime)
last_played_item = QTableWidgetItem(last_played_str)
self.setItem(row, LASTPLAYED, last_played_item)
# Mark track if file is unreadable
if not file_is_readable(row_data.track.path):
if not file_is_readable(plr.track.path):
self._set_unreadable_row(row)
else:
# This is a section header so it must have note text
if row_data.note is None:
if plr.note is None:
log.debug(
f"insert_row({row_data=}) with no track_id and no note"
f"insert_row({plr=}) with no track_id and no note"
)
return
@ -698,17 +684,16 @@ class PlaylistTab(QTableWidget):
continue
self.setItem(row, i, QTableWidgetItem())
self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1)
notes_item = QTableWidgetItem(row_data.note)
notes_item = QTableWidgetItem(plr.note)
self.setItem(row, HEADER_NOTES_COLUMN, notes_item)
# Save (no) track_id
userdata_item.setData(self.ROW_TRACK_ID, 0)
if repaint:
self.save_playlist(session)
self.update_display(session, clear_selection=False)
def insert_track(self, session: Session, track: Optional[Tracks],
def insert_track(self, session: Session, track: Tracks,
note: str = None, repaint: bool = True) -> None:
"""
Insert track into playlist tab.
@ -720,20 +705,30 @@ class PlaylistTab(QTableWidget):
to do the heavy lifing.
"""
# PlaylistRows object requires a row number, but that number
# can be reset by calling PlaylistRows.fixup_rownumbers() later,
# so just fudge a row number for now.
row_number = 0
if track:
track_id = track.id
else:
track_id = None
plr = PlaylistRows(session, self.playlist_id,
track_id, row_number, note)
self.insert_row(session, plr)
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
if repaint:
self.update_display(session, clear_selection=False)
if not track and track.id:
log.debug(
f"insert_track({session=}, {track=}, {note=}, {repaint=}"
" called with either no track or no track.id"
)
return
row_number = self.get_new_row_number()
# Check to see whether track is already in playlist
existing_plr = PlaylistRows.get_track_plr(session, track.id,
self.playlist_id)
if existing_plr and ask_yes_no("Duplicate row",
"Track already in playlist. "
"Move to new location?"):
# Yes it is and we shoudl reuse it
return self._move_row(session, existing_plr, row_number)
# Build playlist_row object
plr = PlaylistRows(session, self.playlist_id, track.id,
row_number, note)
self.insert_row(session, plr, repaint)
# Let display update, then save playlist
QTimer.singleShot(0, lambda: self.save_playlist(session))
def play_started(self, session: Session) -> None:
"""
@ -796,8 +791,8 @@ class PlaylistTab(QTableWidget):
# Add the rows
playlist = session.get(Playlists, playlist_id)
for row in playlist.rows:
self.insert_row(session, row, repaint=False)
for plr in playlist.rows:
self.insert_row(session, plr, repaint=False)
# Scroll to top
if scroll_to_top: