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)

This commit is contained in:
Kovid Goyal 2015-08-26 18:03:42 +05:30
parent 20a4140c56
commit ccc52ba308
2 changed files with 26 additions and 7 deletions

View File

@ -238,7 +238,7 @@ class AddAction(InterfaceAction):
Add an empty book item to the library. This does not import any formats Add an empty book item to the library. This does not import any formats
from a book file. from a book file.
''' '''
author = series = None author = series = title = None
index = self.gui.library_view.currentIndex() index = self.gui.library_view.currentIndex()
if index.isValid(): if index.isValid():
raw = index.model().db.authors(index.row()) raw = index.model().db.authors(index.row())
@ -247,8 +247,9 @@ class AddAction(InterfaceAction):
if authors: if authors:
author = authors[0] author = authors[0]
series = index.model().db.series(index.row()) series = index.model().db.series(index.row())
title = index.model().db.title(index.row())
dlg = AddEmptyBookDialog(self.gui, self.gui.library_view.model().db, dlg = AddEmptyBookDialog(self.gui, self.gui.library_view.model().db,
author, series) author, series, dup_title=title)
if dlg.exec_() == dlg.Accepted: if dlg.exec_() == dlg.Accepted:
temp_files = [] temp_files = []
num = dlg.qty_to_add num = dlg.qty_to_add
@ -256,11 +257,16 @@ class AddAction(InterfaceAction):
title = dlg.selected_title or _('Unknown') title = dlg.selected_title or _('Unknown')
db = self.gui.library_view.model().db db = self.gui.library_view.model().db
ids = [] ids = []
if dlg.duplicate_current_book:
origmi = db.get_metadata(index.row(), get_cover=True, cover_as_data=True)
for x in xrange(num): for x in xrange(num):
mi = MetaInformation(title, dlg.selected_authors) if dlg.duplicate_current_book:
if series: mi = origmi
mi.series = series else:
mi.series_index = db.get_next_series_num_for(series) mi = MetaInformation(title, dlg.selected_authors)
if series:
mi.series = series
mi.series_index = db.get_next_series_num_for(series)
fmts = [] fmts = []
empty_format = gprefs.get('create_empty_format_file', '') empty_format = gprefs.get('create_empty_format_file', '')
if empty_format: if empty_format:

View File

@ -15,7 +15,7 @@ from calibre.gui2 import gprefs
class AddEmptyBookDialog(QDialog): 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) QDialog.__init__(self, parent)
self.db = db self.db = db
@ -99,7 +99,20 @@ class AddEmptyBookDialog(QDialog):
button_box.accepted.connect(self.accept) button_box.accepted.connect(self.accept)
button_box.rejected.connect(self.reject) button_box.rejected.connect(self.reject)
self._layout.addWidget(button_box, 10, 0, 1, -1) 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.resize(self.sizeHint())
self.duplicate_current_book = False
def do_duplicate_book(self):
self.duplicate_current_book = True
self.accept()
def accept(self): def accept(self):
gprefs['create_empty_format_file'] = self.format_value.currentText().lower() gprefs['create_empty_format_file'] = self.format_value.currentText().lower()