From ccc52ba308af981fb8aeff439af73d7190d20bad Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 26 Aug 2015 18:03:42 +0530 Subject: [PATCH] When adding empty books to the library also allow creating duplicates of the current book, with all metadata copied. To use right click the Add Books button and select 'Add Empty Books'. Fixes #1488398 [Enhancement: Create duplicate book record of existing one](https://bugs.launchpad.net/calibre/+bug/1488398) --- src/calibre/gui2/actions/add.py | 18 ++++++++++++------ src/calibre/gui2/dialogs/add_empty_book.py | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 88ecc0f89b..7dcbff8d9a 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -238,7 +238,7 @@ class AddAction(InterfaceAction): Add an empty book item to the library. This does not import any formats from a book file. ''' - author = series = None + author = series = title = None index = self.gui.library_view.currentIndex() if index.isValid(): raw = index.model().db.authors(index.row()) @@ -247,8 +247,9 @@ class AddAction(InterfaceAction): if authors: author = authors[0] series = index.model().db.series(index.row()) + title = index.model().db.title(index.row()) dlg = AddEmptyBookDialog(self.gui, self.gui.library_view.model().db, - author, series) + author, series, dup_title=title) if dlg.exec_() == dlg.Accepted: temp_files = [] num = dlg.qty_to_add @@ -256,11 +257,16 @@ class AddAction(InterfaceAction): title = dlg.selected_title or _('Unknown') db = self.gui.library_view.model().db ids = [] + if dlg.duplicate_current_book: + origmi = db.get_metadata(index.row(), get_cover=True, cover_as_data=True) for x in xrange(num): - mi = MetaInformation(title, dlg.selected_authors) - if series: - mi.series = series - mi.series_index = db.get_next_series_num_for(series) + if dlg.duplicate_current_book: + mi = origmi + else: + mi = MetaInformation(title, dlg.selected_authors) + if series: + mi.series = series + mi.series_index = db.get_next_series_num_for(series) fmts = [] empty_format = gprefs.get('create_empty_format_file', '') if empty_format: diff --git a/src/calibre/gui2/dialogs/add_empty_book.py b/src/calibre/gui2/dialogs/add_empty_book.py index 225dcabb60..0352d029bf 100644 --- a/src/calibre/gui2/dialogs/add_empty_book.py +++ b/src/calibre/gui2/dialogs/add_empty_book.py @@ -15,7 +15,7 @@ from calibre.gui2 import gprefs class AddEmptyBookDialog(QDialog): - def __init__(self, parent, db, author, series=None, title=None): + def __init__(self, parent, db, author, series=None, title=None, dup_title=None): QDialog.__init__(self, parent) self.db = db @@ -99,7 +99,20 @@ class AddEmptyBookDialog(QDialog): button_box.accepted.connect(self.accept) button_box.rejected.connect(self.reject) self._layout.addWidget(button_box, 10, 0, 1, -1) + if dup_title: + self.dup_button = b = button_box.addButton(_('&Duplicate current book'), button_box.ActionRole) + b.clicked.connect(self.do_duplicate_book) + b.setIcon(QIcon(I('edit-copy.png'))) + b.setToolTip(_( + 'Make the new empty book records exact duplicates\n' + 'of the current book "%s", with all metadata identical' + ) % dup_title) self.resize(self.sizeHint()) + self.duplicate_current_book = False + + def do_duplicate_book(self): + self.duplicate_current_book = True + self.accept() def accept(self): gprefs['create_empty_format_file'] = self.format_value.currentText().lower()