Implement #7709 ("Merge only formats - delete others" and Ctl-M keyboard shortcut)

This commit is contained in:
Kovid Goyal 2010-12-10 12:56:18 -07:00
parent 826221c0f5
commit 2f26cc8d2b
2 changed files with 29 additions and 7 deletions

View File

@ -54,6 +54,10 @@ class EditMetadataAction(InterfaceAction):
mb.addAction(_('Merge into first selected book - keep others'), mb.addAction(_('Merge into first selected book - keep others'),
partial(self.merge_books, safe_merge=True), partial(self.merge_books, safe_merge=True),
Qt.AltModifier+Qt.Key_M) 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.merge_menu = mb
self.action_merge.setMenu(mb) self.action_merge.setMenu(mb)
md.addSeparator() md.addSeparator()
@ -206,7 +210,7 @@ class EditMetadataAction(InterfaceAction):
self.gui.library_view.select_rows(ids) self.gui.library_view.select_rows(ids)
# Merge books {{{ # 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. Merge selected books in library.
''' '''
@ -220,6 +224,12 @@ class EditMetadataAction(InterfaceAction):
return error_dialog(self.gui, _('Cannot merge books'), return error_dialog(self.gui, _('Cannot merge books'),
_('At least two books must be selected for merging'), _('At least two books must be selected for merging'),
show=True) show=True)
if len(rows) > 5:
if not confirm('<p>'+_('You are about to merge more than 5 books. '
'Are you <b>sure</b> you want to proceed?')
+'</p>', 'merge_too_many_books', self.gui):
return
dest_id, src_books, src_ids = self.books_to_merge(rows) 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) title = self.gui.library_view.model().db.title(dest_id, index_is_id=True)
if safe_merge: if safe_merge:
@ -234,6 +244,22 @@ class EditMetadataAction(InterfaceAction):
return return
self.add_formats(dest_id, src_books) self.add_formats(dest_id, src_books)
self.merge_metadata(dest_id, src_ids) self.merge_metadata(dest_id, src_ids)
elif merge_only_formats:
if not confirm('<p>'+_(
'Book formats from the selected books will be merged '
'into the <b>first selected book</b> (%s). '
'Metadata in the first selected book will not be changed.'
'Author, Title, ISBN and all other metadata will <i>not</i> be merged.<br><br>'
'After merger the second and subsequently '
'selected books, with any metadata they have will be <b>deleted</b>. <br><br>'
'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 <b>deleted</b> from your calibre library.<br><br> '
'Are you <b>sure</b> you want to proceed?')%title
+'</p>', 'merge_only_formats', self.gui):
return
self.add_formats(dest_id, src_books)
self.delete_books_after_merge(src_ids)
else: else:
if not confirm('<p>'+_( if not confirm('<p>'+_(
'Book formats and metadata from the selected books will be merged ' 'Book formats and metadata from the selected books will be merged '
@ -243,15 +269,10 @@ class EditMetadataAction(InterfaceAction):
'subsequently selected books will be <b>deleted</b>. <br><br>' 'subsequently selected books will be <b>deleted</b>. <br><br>'
'All book formats of the first selected book will be kept ' 'All book formats of the first selected book will be kept '
'and any duplicate formats in the second and subsequently selected books ' 'and any duplicate formats in the second and subsequently selected books '
'will be permanently <b>deleted</b> from your computer.<br><br> ' 'will be permanently <b>deleted</b> from your calibre library.<br><br> '
'Are you <b>sure</b> you want to proceed?')%title 'Are you <b>sure</b> you want to proceed?')%title
+'</p>', 'merge_books', self.gui): +'</p>', 'merge_books', self.gui):
return return
if len(rows)>5:
if not confirm('<p>'+_('You are about to merge more than 5 books. '
'Are you <b>sure</b> you want to proceed?')
+'</p>', 'merge_too_many_books', self.gui):
return
self.add_formats(dest_id, src_books) self.add_formats(dest_id, src_books)
self.merge_metadata(dest_id, src_ids) self.merge_metadata(dest_id, src_ids)
self.delete_books_after_merge(src_ids) self.delete_books_after_merge(src_ids)

View File

@ -31,4 +31,5 @@ def confirm(msg, name, parent=None, pixmap='dialog_warning.png'):
d = Dialog(msg, name, parent) d = Dialog(msg, name, parent)
d.label.setPixmap(QPixmap(I(pixmap))) d.label.setPixmap(QPixmap(I(pixmap)))
d.setWindowIcon(QIcon(I(pixmap))) d.setWindowIcon(QIcon(I(pixmap)))
d.resize(d.sizeHint())
return d.exec_() == d.Accepted return d.exec_() == d.Accepted