From 70d986f4acd1b09576bede23a0729e29d282f068 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 22 Aug 2021 16:42:33 +0100 Subject: [PATCH] Delete multiple rows Fixes #22 --- app/playlists.py | 55 +++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/app/playlists.py b/app/playlists.py index a19e73a..c7c13c2 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -183,7 +183,7 @@ class PlaylistTab(QTableWidget): act_rescan.triggered.connect(lambda: self._rescan(row)) self.menu.addSeparator() act_delete = self.menu.addAction('Delete') - act_delete.triggered.connect(lambda: self._delete_row(row)) + act_delete.triggered.connect(self._delete_rows) act_info = self.menu.addAction('Info') act_info.triggered.connect(lambda: self._info_row(row)) @@ -624,34 +624,45 @@ class PlaylistTab(QTableWidget): self.editing_cell = False self.master_process.enable_play_next_controls() - def _delete_row(self, row): - "Delete row" + def _delete_rows(self): + "Delete mutliple rows" - DEBUG(f"playlist._delete_row({row})") + DEBUG("playlist._delete_rows()") - if row == self._meta_get_current(): - show_warning("Silly", "Can't delete playing track") - return - elif row == self._meta_get_next(): - show_warning("Safety", "Can't delete next track") - return + rows = sorted(set(item.row() for item in self.selectedItems())) + rows_to_delete = [] + notes = self._meta_get_notes() with Session() as session: - title = self.item(row, self.COL_TITLE).text() + for row in rows: + if row == self._meta_get_current(): + show_warning("Silly", "Can't delete playing track") + return + elif row == self._meta_get_next(): + show_warning("Safety", "Can't delete next track") + return - msg = QMessageBox(self) - msg.setIcon(QMessageBox.Warning) - msg.setText(f"Delete '{title}'?") - msg.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel) - msg.setDefaultButton(QMessageBox.Cancel) - msg.setWindowTitle("Delete row") - if msg.exec() == QMessageBox.Yes: - id = self._get_row_id(row) - if row in self._meta_get_notes(): + title = self.item(row, self.COL_TITLE).text() + + msg = QMessageBox(self) + msg.setIcon(QMessageBox.Warning) + msg.setText(f"Delete '{title}'?") + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel) + msg.setDefaultButton(QMessageBox.Cancel) + msg.setWindowTitle("Delete row") + # Store list of notes + if msg.exec() == QMessageBox.Yes: + rows_to_delete.append(row) + + # delete in reverse row order so row numbers don't + # change + for del_row in sorted(rows_to_delete, reverse=True): + id = self._get_row_id(del_row) + if del_row in notes: Notes.delete_note(session, id) else: - PlaylistTracks.remove_track(session, self.id, row) - self.removeRow(row) + PlaylistTracks.remove_track(session, self.id, del_row) + self.removeRow(del_row) self._save_playlist(session) self._repaint()