From a4907b50129b62a92ce4b3caa1b50c99618f9953 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 23 Dec 2020 14:22:44 +0530 Subject: [PATCH] Fix #1908192 [Enhancement: "Add as new book" button when dragging onto details pane](https://bugs.launchpad.net/calibre/+bug/1908192) --- src/calibre/gui2/actions/add.py | 11 +++++++++-- src/calibre/gui2/dialogs/confirm_delete.py | 18 ++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 877c89cb96..5ada7f0a74 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -450,11 +450,16 @@ class AddAction(InterfaceAction): accept = True if accept and event is not None: event.accept() + add_as_book = False if do_confirm and formats: - if not confirm( + ok, add_as_book = confirm( _('You have dropped some files onto the book %s. This will' ' add or replace the files for this book. Do you want to proceed?') % db.title(cid, index_is_id=True), - 'confirm_drop_on_book', parent=self.gui): + 'confirm_drop_on_book', parent=self.gui, + extra_button=ngettext('Add as new book', 'Add as new books', len(formats))) + if ok and add_as_book: + add_as_book = [path for ext, path in formats] + if not ok or add_as_book: formats = [] for ext, path in formats: db.add_format_with_hooks(cid, ext, path, index_is_id=True) @@ -462,6 +467,8 @@ class AddAction(InterfaceAction): self.gui.library_view.model().current_changed(current_idx, current_idx) if cover_changed: self.gui.refresh_cover_browser() + if add_as_book: + self.files_dropped(add_as_book) def __add_filesystem_book(self, paths, allow_device=True): if isinstance(paths, string_or_bytes): diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py index 06f329eed0..8ebc2b0b7b 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.py +++ b/src/calibre/gui2/dialogs/confirm_delete.py @@ -17,7 +17,7 @@ from calibre.gui2.dialogs.message_box import Icon class Dialog(QDialog): def __init__(self, msg, name, parent, config_set=dynamic, icon='dialog_warning.png', - title=None, confirm_msg=None, show_cancel_button=True): + title=None, confirm_msg=None, show_cancel_button=True, extra_button=None): QDialog.__init__(self, parent) self.setWindowTitle(title or _("Are you sure?")) self.setWindowIcon(QIcon(I(icon))) @@ -50,6 +50,10 @@ class Dialog(QDialog): bb.setObjectName("buttonBox") bb.setFocus(Qt.FocusReason.OtherFocusReason) bb.accepted.connect(self.accept), bb.rejected.connect(self.reject) + self.extra_button_clicked = False + if extra_button: + b = bb.addButton(extra_button, QDialogButtonBox.ButtonRole.AcceptRole) + b.clicked.connect(self.on_extra_button_click) l.addWidget(bb) self.name = name @@ -58,15 +62,21 @@ class Dialog(QDialog): self.resize(self.sizeHint()) bb.button(standard_button).setFocus(Qt.FocusReason.OtherFocusReason) + def on_extra_button_click(self): + self.extra_button_clicked = True + def toggle(self, *args): self.config_set[confirm_config_name(self.name)] = self.again.isChecked() def confirm(msg, name, parent=None, pixmap='dialog_warning.png', title=None, - show_cancel_button=True, confirm_msg=None, config_set=None): + show_cancel_button=True, confirm_msg=None, config_set=None, extra_button=None): config_set = config_set or dynamic if not config_set.get(confirm_config_name(name), True): return True - d = Dialog(msg, name, parent, config_set=config_set, icon=pixmap, + d = Dialog(msg, name, parent, config_set=config_set, icon=pixmap, extra_button=extra_button, title=title, confirm_msg=confirm_msg, show_cancel_button=show_cancel_button) - return d.exec_() == QDialog.DialogCode.Accepted + ret = d.exec_() == QDialog.DialogCode.Accepted + if extra_button: + ret = ret, d.extra_button_clicked + return ret