From 48b180e2800d3e3d1d587f80310366ab88913cec Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Wed, 22 Nov 2023 19:57:14 +0000 Subject: [PATCH] WIP V3: move selected tracks works --- app/musicmuster.py | 94 ++++++++++++-------------------------------- app/playlistmodel.py | 14 +++++-- 2 files changed, 36 insertions(+), 72 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index eb33ca7..13eea0f 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -924,93 +924,49 @@ class Window(QMainWindow, Ui_MainWindow): self.signals.search_wikipedia_signal.emit(track_info.title) - def move_playlist_rows( - self, session: scoped_session, playlistrows: Sequence[PlaylistRows] - ) -> None: + def move_playlist_rows(self, row_numbers: List[int]) -> None: """ Move passed playlist rows to another playlist - - Actions required: - - exclude current/next tracks from being moved - - identify destination playlist - - update playlist for the rows in the database - - remove them from the display - - update destination playlist display if loaded """ - # Remove current/next rows from list - plrs_to_move = [ - plr - for plr in playlistrows - if plr.id not in [track_sequence.now.plr_id, track_sequence.next.plr_id] - ] - - rows_to_delete = [ - plr.plr_rownum for plr in plrs_to_move if plr.plr_rownum is not None - ] - if not rows_to_delete: - return - # Identify destination playlist playlists = [] visible_tab = self.active_tab() source_playlist_id = visible_tab.playlist_id - for playlist in Playlists.get_all(session): - if playlist.id == source_playlist_id: - continue + with Session() as session: + for playlist in Playlists.get_all(session): + if playlist.id == source_playlist_id: + continue + else: + playlists.append(playlist) + + dlg = SelectPlaylistDialog(self, playlists=playlists, session=session) + dlg.exec() + if not dlg.playlist: + return + to_playlist_id = dlg.playlist.id + + # Get row number in destination playlist + last_row = PlaylistRows.get_last_used_row(session, to_playlist_id) + if last_row is not None: + to_row = last_row + 1 else: - playlists.append(playlist) + to_row = 0 - dlg = SelectPlaylistDialog(self, playlists=playlists, session=session) - dlg.exec() - if not dlg.playlist: - return - destination_playlist_id = dlg.playlist.id - - # Update destination playlist in the database - last_row = PlaylistRows.get_last_used_row(session, destination_playlist_id) - if last_row is not None: - next_row = last_row + 1 - else: - next_row = 0 - - for plr in plrs_to_move: - plr.plr_rownum = next_row - next_row += 1 - plr.playlist_id = destination_playlist_id - # Reset played as it's not been played on this playlist - plr.played = False - session.commit() - - # Remove moved rows from display and save visible playlist - visible_tab.remove_rows(rows_to_delete) - visible_tab.save_playlist(session) - - # Disable sort undo - self.sort_undo: List[int] = [] - - # Update destination playlist_tab if visible (if not visible, it - # will be re-populated when it is opened) - destination_playlist_tab = None - for tab in range(self.tabPlaylist.count()): - if self.tabPlaylist.widget(tab).playlist_id == dlg.playlist.id: - destination_playlist_tab = self.tabPlaylist.widget(tab) - break - if destination_playlist_tab: - destination_playlist_tab.populate_display(session, dlg.playlist.id) + # Move rows + self.active_model().move_rows_between_playlists(row_numbers, to_row, to_playlist_id) def move_selected(self) -> None: """ Move selected rows to another playlist """ - with Session() as session: - selected_plrs = self.active_tab().get_selected_playlistrows(session) - if not selected_plrs: - return + selected_rows = self.active_tab().get_selected_rows() + if not selected_rows: + return - self.move_playlist_rows(session, selected_plrs) + self.move_playlist_rows(selected_rows) def move_unplayed(self) -> None: """ diff --git a/app/playlistmodel.py b/app/playlistmodel.py index dfed555..c0588eb 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -422,6 +422,8 @@ class PlaylistModel(QAbstractTableModel): if playlist_id != self.playlist_id: return + with Session() as session: + self.refresh_data(session) super().endResetModel() def get_duplicate_rows(self) -> List[int]: @@ -809,6 +811,10 @@ class PlaylistModel(QAbstractTableModel): # the highest rows first so the lower row numbers are unchanged row_groups = self._reversed_contiguous_row_groups(from_rows) next_to_row = to_row_number + + # Prepare destination playlist for a reset + self.signals.begin_reset_model_signal.emit(to_playlist_id) + with Session() as session: # Make room in destination playlist max_destination_row_number = PlaylistRows.get_last_used_row( @@ -822,8 +828,6 @@ class PlaylistModel(QAbstractTableModel): session, to_playlist_id, to_row_number, len(from_rows) ) - # Prepare destination playlist for a reset - self.signals.begin_reset_model_signal.emit(to_playlist_id) for row_group in row_groups: super().beginRemoveRows(QModelIndex(), min(row_group), max(row_group)) for plr in PlaylistRows.plrids_to_plrs( @@ -831,17 +835,21 @@ class PlaylistModel(QAbstractTableModel): self.playlist_id, [self.playlist_rows[a].plrid for a in row_group], ): + if plr.id == track_sequence.now.plr_id: + # Don't move current track + continue plr.playlist_id = to_playlist_id plr.plr_rownum = next_to_row next_to_row += 1 self.refresh_data(session) super().endRemoveRows() - self.signals.end_reset_model_signal.emit(to_playlist_id) # We need to remove gaps in row numbers after tracks have # moved. PlaylistRows.fixup_rownumbers(session, self.playlist_id) self.refresh_data(session) + # Reset of model must come after session has been closed + self.signals.end_reset_model_signal.emit(to_playlist_id) self.update_track_times() def open_in_audacity(self, row_number: int) -> None: