From 9ed24d754b236ccc097dd0f27e488695ff5a8084 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 Dec 2021 18:28:06 +0530 Subject: [PATCH] Allow creating a shortcut in preferences->Shortcuts->Edit metadata to paste metadata ignoring the value of the exclude_fields tweak. Fixes #1953739 [[Enhancement] Paste metadata - Override 'exclude_fields_on_paste' setting](https://bugs.launchpad.net/calibre/+bug/1953739) --- resources/default_tweaks.py | 2 ++ src/calibre/gui2/actions/edit_metadata.py | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 4dad4f07b2..b84ce214c7 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -582,6 +582,8 @@ show_saved_search_box = False # Edit metadata->Copy metadata/Paste metadata actions. For example, # exclude_fields_on_paste = ['cover', 'timestamp', '#mycolumn'] # to prevent pasting of the cover, Date and custom column, mycolumn. +# You can also add a shortcut in Preferences->Shortcut->Edit metadata +# to paste metadata ignoring this tweak. exclude_fields_on_paste = [] #: Skip internet connected check diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index c3bdc8bc53..728c2d40a4 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -12,7 +12,8 @@ import shutil from functools import partial from io import BytesIO from qt.core import ( - QAction, QApplication, QDialog, QIcon, QMenu, QMimeData, QModelIndex, QTimer, QUrl + QAction, QApplication, QDialog, QIcon, QMenu, QMimeData, QModelIndex, QTimer, + QUrl ) from calibre.db.errors import NoSuchFormat @@ -96,7 +97,11 @@ class EditMetadataAction(InterfaceAction): self.merge_menu = mb md.addSeparator() self.action_copy = cm('copy', _('Copy metadata'), icon='edit-copy.png', triggered=self.copy_metadata) - self.action_paset = cm('paste', _('Paste metadata'), icon='edit-paste.png', triggered=self.paste_metadata) + self.action_paste = cm('paste', _('Paste metadata'), icon='edit-paste.png', triggered=self.paste_metadata) + self.action_paste_ignore_excluded = ac = cm( + 'paste_include_excluded_fields', _('Paste metadata including excluded fields'), icon='edit-paste.png', + triggered=self.paste_metadata_including_excluded_fields) + ac.setVisible(False) self.action_merge = cm('merge', _('Merge book records'), icon='merge_books.png', shortcut=_('M'), triggered=self.merge_books) self.action_merge.setMenu(mb) @@ -182,6 +187,12 @@ class EditMetadataAction(InterfaceAction): c.setMimeData(md) def paste_metadata(self): + self.do_paste() + + def paste_metadata_including_excluded_fields(self): + self.do_paste(ignore_excluded_fields=True) + + def do_paste(self, ignore_excluded_fields=False): rows = self.gui.library_view.selectionModel().selectedRows() if not rows or len(rows) == 0: return error_dialog(self.gui, _('Cannot paste metadata'), @@ -199,7 +210,10 @@ class EditMetadataAction(InterfaceAction): data = bytes(md.data('application/calibre-book-metadata')) mi = OPF(BytesIO(data), populate_spine=False, read_toc=False, try_to_guess_cover=False).to_book_metadata() mi.application_id = mi.uuid_id = None - exclude = set(tweaks['exclude_fields_on_paste']) + if ignore_excluded_fields: + exclude = set() + else: + exclude = set(tweaks['exclude_fields_on_paste']) paste_cover = 'cover' not in exclude cover = md.imageData() if paste_cover else None exclude.discard('cover')