From ddcc2c4bbd6e94e1456e738ed0d5262bd6c93d67 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 4 Jun 2025 09:58:59 +0530 Subject: [PATCH] Manage data files dialog: Add a button to cancel remaining books when managing multiple books. Fixes #2112424 ['Manage Data Files' on multiple books](https://bugs.launchpad.net/calibre/+bug/2112424) --- src/calibre/gui2/actions/edit_metadata.py | 5 ++++- src/calibre/gui2/dialogs/data_files_manager.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index eee459d3ec..4b1da92a46 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -110,9 +110,12 @@ class EditMetadataAction(InterfaceActionWithLibraryDrop): from calibre.gui2.dialogs.data_files_manager import DataFilesManager db = self.gui.current_db ids = self.gui.library_view.get_selected_ids() + num = len(ids) for book_id in ids: - d = DataFilesManager(db, book_id, self.gui) + d = DataFilesManager(db, book_id, self.gui, num - 1) d.exec() + if d.num_left < 1: + break cr = self.gui.library_view.currentIndex().row() self.gui.library_view.model().refresh_ids(ids, cr) diff --git a/src/calibre/gui2/dialogs/data_files_manager.py b/src/calibre/gui2/dialogs/data_files_manager.py index 532439b1ca..677d0af7d2 100644 --- a/src/calibre/gui2/dialogs/data_files_manager.py +++ b/src/calibre/gui2/dialogs/data_files_manager.py @@ -222,8 +222,9 @@ class ListView(QListView): class DataFilesManager(Dialog): - def __init__(self, db, book_id, parent=None): + def __init__(self, db, book_id, parent=None, num_left=0): self.db = db.new_api + self.num_left = num_left self.book_title = title = self.db.field_for('title', book_id) or _('Unknown') self.book_id = book_id super().__init__(_('Manage data files for {}').format(title), 'manage-data-files-xx', @@ -291,11 +292,19 @@ class DataFilesManager(Dialog): trash = _('Recycle bin') b.setToolTip(_('Move all selected files to the system {trash}.\nThey can be restored from there if needed').format(trash=trash)) self.bb.addButton(b, QDialogButtonBox.ButtonRole.ActionRole) + if self.num_left > 0: + b = QPushButton(_('Cancel remaining books'), self) + self.bb.addButton(b, QDialogButtonBox.ButtonRole.RejectRole) + b.clicked.connect(self.cancel_remaining) self.current_changed() self.resize(self.sizeHint()) self.fview.setFocus(Qt.FocusReason.OtherFocusReason) + def cancel_remaining(self): + self.num_left = 0 + self.reject() + def context_menu(self, pos): m = QMenu(self) idx = self.fview.indexAt(pos)