From 2f26cc8d2b2acd37981627cbe74ff8ae4cc23b3f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 10 Dec 2010 12:56:18 -0700 Subject: [PATCH] Implement #7709 ("Merge only formats - delete others" and Ctl-M keyboard shortcut) --- src/calibre/gui2/actions/edit_metadata.py | 35 +++++++++++++++++----- src/calibre/gui2/dialogs/confirm_delete.py | 1 + 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 4a527d94d8..60a943ccb9 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -54,6 +54,10 @@ class EditMetadataAction(InterfaceAction): mb.addAction(_('Merge into first selected book - keep others'), partial(self.merge_books, safe_merge=True), Qt.AltModifier+Qt.Key_M) + mb.addSeparator() + mb.addAction(_('Merge only formats into first selected book - delete others'), + partial(self.merge_books, merge_only_formats=True), + Qt.AltModifier+Qt.ShiftModifier+Qt.Key_M) self.merge_menu = mb self.action_merge.setMenu(mb) md.addSeparator() @@ -206,7 +210,7 @@ class EditMetadataAction(InterfaceAction): self.gui.library_view.select_rows(ids) # Merge books {{{ - def merge_books(self, safe_merge=False): + def merge_books(self, safe_merge=False, merge_only_formats=False): ''' Merge selected books in library. ''' @@ -220,6 +224,12 @@ class EditMetadataAction(InterfaceAction): return error_dialog(self.gui, _('Cannot merge books'), _('At least two books must be selected for merging'), show=True) + if len(rows) > 5: + if not confirm('

'+_('You are about to merge more than 5 books. ' + 'Are you sure you want to proceed?') + +'

', 'merge_too_many_books', self.gui): + return + dest_id, src_books, src_ids = self.books_to_merge(rows) title = self.gui.library_view.model().db.title(dest_id, index_is_id=True) if safe_merge: @@ -234,6 +244,22 @@ class EditMetadataAction(InterfaceAction): return self.add_formats(dest_id, src_books) self.merge_metadata(dest_id, src_ids) + elif merge_only_formats: + if not confirm('

'+_( + 'Book formats from the selected books will be merged ' + 'into the first selected book (%s). ' + 'Metadata in the first selected book will not be changed.' + 'Author, Title, ISBN and all other metadata will not be merged.

' + 'After merger the second and subsequently ' + 'selected books, with any metadata they have will be deleted.

' + 'All book formats of the first selected book will be kept ' + 'and any duplicate formats in the second and subsequently selected books ' + 'will be permanently deleted from your calibre library.

' + 'Are you sure you want to proceed?')%title + +'

', 'merge_only_formats', self.gui): + return + self.add_formats(dest_id, src_books) + self.delete_books_after_merge(src_ids) else: if not confirm('

'+_( 'Book formats and metadata from the selected books will be merged ' @@ -243,15 +269,10 @@ class EditMetadataAction(InterfaceAction): 'subsequently selected books will be deleted.

' 'All book formats of the first selected book will be kept ' 'and any duplicate formats in the second and subsequently selected books ' - 'will be permanently deleted from your computer.

' + 'will be permanently deleted from your calibre library.

' 'Are you sure you want to proceed?')%title +'

', 'merge_books', self.gui): return - if len(rows)>5: - if not confirm('

'+_('You are about to merge more than 5 books. ' - 'Are you sure you want to proceed?') - +'

', 'merge_too_many_books', self.gui): - return self.add_formats(dest_id, src_books) self.merge_metadata(dest_id, src_ids) self.delete_books_after_merge(src_ids) diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py index 4e0a259824..ff7f0a285a 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.py +++ b/src/calibre/gui2/dialogs/confirm_delete.py @@ -31,4 +31,5 @@ def confirm(msg, name, parent=None, pixmap='dialog_warning.png'): d = Dialog(msg, name, parent) d.label.setPixmap(QPixmap(I(pixmap))) d.setWindowIcon(QIcon(I(pixmap))) + d.resize(d.sizeHint()) return d.exec_() == d.Accepted