From 46f2b662f327f223865b9fd55f0e1eb8d785fd2c Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Fri, 23 Dec 2022 20:52:18 +0000 Subject: [PATCH] Copy/paste, insert track/header works --- app/musicmuster.py | 2 +- app/playlists.py | 103 +++++++++++++++++++++------------------------ 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index 3ff4230..a46fca0 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -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""" diff --git a/app/playlists.py b/app/playlists.py index 24e1abf..58ae757 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -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: