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: if ok:
with Session() as session: with Session() as session:
playlist_tab.insert_header(session, dlg.textValue()) playlist_tab.insert_header(session, dlg.textValue())
self.save_playlist(session) playlist_tab.save_playlist(session)
def insert_track(self) -> None: def insert_track(self) -> None:
"""Show dialog box to select and add track from database""" """Show dialog box to select and add track from database"""

View File

@ -595,45 +595,31 @@ class PlaylistTab(QTableWidget):
to do the heavy lifing. to do the heavy lifing.
""" """
# PlaylistRows object requires a row number, but that number row_number = self.get_new_row_number()
# can be reset by calling PlaylistRows.fixup_rownumbers() later,
# so just fudge a row number for now.
row_number = 0
plr = PlaylistRows(session, self.playlist_id, None, row_number, note) plr = PlaylistRows(session, self.playlist_id, None, row_number, note)
self.insert_row(session, plr) self.insert_row(session, plr, repaint)
PlaylistRows.fixup_rownumbers(session, self.playlist_id) self.save_playlist(session)
if repaint:
self.update_display(session, clear_selection=False)
def insert_row(self, session: Session, row_data: PlaylistRows, def insert_row(self, session: Session, plr: PlaylistRows,
repaint: bool = True) -> None: repaint: bool = True) -> None:
""" """
Insert a row into playlist tab. Insert passed playlist row (plr) 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.
""" """
if self.selectionModel().hasSelection(): row = plr.row_number
row = self.currentRow()
else:
row = self.rowCount()
self.insertRow(row) self.insertRow(row)
# Add row metadata to userdata column # Add row metadata to userdata column
userdata_item = QTableWidgetItem() userdata_item = QTableWidgetItem()
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, plr.id)
userdata_item.setData(self.ROW_TRACK_ID, row_data.track_id) userdata_item.setData(self.ROW_TRACK_ID, plr.track_id)
self.setItem(row, USERDATA, userdata_item) self.setItem(row, USERDATA, userdata_item)
if row_data.track_id: if plr.track_id:
# Add track details to items # Add track details to items
try: try:
start_gap = row_data.track.start_gap start_gap = plr.track.start_gap
except AttributeError: except AttributeError:
return return
start_gap_item = QTableWidgetItem(str(start_gap)) start_gap_item = QTableWidgetItem(str(start_gap))
@ -641,17 +627,17 @@ class PlaylistTab(QTableWidget):
start_gap_item.setBackground(QColor(Config.COLOUR_LONG_START)) start_gap_item.setBackground(QColor(Config.COLOUR_LONG_START))
self.setItem(row, START_GAP, start_gap_item) 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()=}") log.debug(f"KAE: insert_row:619, {title_item.text()=}")
self.setItem(row, TITLE, title_item) 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) self.setItem(row, ARTIST, artist_item)
duration_item = QTableWidgetItem( duration_item = QTableWidgetItem(
ms_to_mmss(row_data.track.duration)) ms_to_mmss(plr.track.duration))
self.setItem(row, DURATION, duration_item) 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() start_item = QTableWidgetItem()
self.setItem(row, START_TIME, start_item) self.setItem(row, START_TIME, start_item)
@ -659,8 +645,8 @@ class PlaylistTab(QTableWidget):
end_item = QTableWidgetItem() end_item = QTableWidgetItem()
self.setItem(row, END_TIME, end_item) self.setItem(row, END_TIME, end_item)
if row_data.track.bitrate: if plr.track.bitrate:
bitrate = str(row_data.track.bitrate) bitrate = str(plr.track.bitrate)
else: else:
bitrate = "" bitrate = ""
bitrate_item = QTableWidgetItem(bitrate) bitrate_item = QTableWidgetItem(bitrate)
@ -668,23 +654,23 @@ class PlaylistTab(QTableWidget):
# 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(plr.note)
self.setItem(row, ROW_NOTES, 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, plr.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, LASTPLAYED, 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(plr.track.path):
self._set_unreadable_row(row) self._set_unreadable_row(row)
else: else:
# This is a section header so it must have note text # This is a section header so it must have note text
if row_data.note is None: if plr.note is None:
log.debug( 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 return
@ -698,17 +684,16 @@ class PlaylistTab(QTableWidget):
continue continue
self.setItem(row, i, QTableWidgetItem()) self.setItem(row, i, QTableWidgetItem())
self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1) 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) self.setItem(row, HEADER_NOTES_COLUMN, notes_item)
# Save (no) track_id # Save (no) track_id
userdata_item.setData(self.ROW_TRACK_ID, 0) userdata_item.setData(self.ROW_TRACK_ID, 0)
if repaint: if repaint:
self.save_playlist(session)
self.update_display(session, clear_selection=False) 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: note: str = None, repaint: bool = True) -> None:
""" """
Insert track into playlist tab. Insert track into playlist tab.
@ -720,20 +705,30 @@ class PlaylistTab(QTableWidget):
to do the heavy lifing. to do the heavy lifing.
""" """
# PlaylistRows object requires a row number, but that number if not track and track.id:
# can be reset by calling PlaylistRows.fixup_rownumbers() later, log.debug(
# so just fudge a row number for now. f"insert_track({session=}, {track=}, {note=}, {repaint=}"
row_number = 0 " called with either no track or no track.id"
if track: )
track_id = track.id return
else:
track_id = None row_number = self.get_new_row_number()
plr = PlaylistRows(session, self.playlist_id,
track_id, row_number, note) # Check to see whether track is already in playlist
self.insert_row(session, plr) existing_plr = PlaylistRows.get_track_plr(session, track.id,
PlaylistRows.fixup_rownumbers(session, self.playlist_id) self.playlist_id)
if repaint: if existing_plr and ask_yes_no("Duplicate row",
self.update_display(session, clear_selection=False) "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: def play_started(self, session: Session) -> None:
""" """
@ -796,8 +791,8 @@ class PlaylistTab(QTableWidget):
# Add the rows # Add the rows
playlist = session.get(Playlists, playlist_id) playlist = session.get(Playlists, playlist_id)
for row in playlist.rows: for plr in playlist.rows:
self.insert_row(session, row, repaint=False) self.insert_row(session, plr, repaint=False)
# Scroll to top # Scroll to top
if scroll_to_top: if scroll_to_top: