From 2e7967bd6e70670a3a57063bbc4647bb54c253f0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 20 Jan 2011 19:45:59 -0700 Subject: [PATCH] Fix #7702 (Option to populate author from selected row when adding empty books) --- src/calibre/gui2/actions/add.py | 22 ++++-- src/calibre/gui2/dialogs/add_empty_book.py | 85 ++++++++++++++++++++++ 2 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 src/calibre/gui2/dialogs/add_empty_book.py diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 6fa53d6290..7c454d0a94 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -8,11 +8,12 @@ __docformat__ = 'restructuredtext en' import os from functools import partial -from PyQt4.Qt import QInputDialog, QPixmap, QMenu +from PyQt4.Qt import QPixmap, QMenu from calibre.gui2 import error_dialog, choose_files, \ choose_dir, warning_dialog, info_dialog +from calibre.gui2.dialogs.add_empty_book import AddEmptyBookDialog from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS from calibre.utils.filenames import ascii_filename @@ -42,7 +43,7 @@ class AddAction(InterfaceAction): 'ebook file is a different book)'), self.add_recursive_multiple) self.add_menu.addSeparator() self.add_menu.addAction(_('Add Empty book. (Book entry with no ' - 'formats)'), self.add_empty) + 'formats)'), self.add_empty, _('Shift+Ctrl+E')) self.add_menu.addAction(_('Add from ISBN'), self.add_from_isbn) self.qaction.setMenu(self.add_menu) self.qaction.triggered.connect(self.add_books) @@ -83,12 +84,21 @@ class AddAction(InterfaceAction): Add an empty book item to the library. This does not import any formats from a book file. ''' - num, ok = QInputDialog.getInt(self.gui, _('How many empty books?'), - _('How many empty books should be added?'), 1, 1, 100) - if ok: + author = None + index = self.gui.library_view.currentIndex() + if index.isValid(): + raw = index.model().db.authors(index.row()) + if raw: + authors = [a.strip().replace('|', ',') for a in raw.split(',')] + if authors: + author = authors[0] + dlg = AddEmptyBookDialog(self.gui, self.gui.library_view.model().db, author) + if dlg.exec_() == dlg.Accepted: + num = dlg.qty_to_add from calibre.ebooks.metadata import MetaInformation for x in xrange(num): - self.gui.library_view.model().db.import_book(MetaInformation(None), []) + mi = MetaInformation(_('Unknown'), dlg.selected_authors) + self.gui.library_view.model().db.import_book(mi, []) self.gui.library_view.model().books_added(num) def add_isbns(self, books, add_tags=[]): diff --git a/src/calibre/gui2/dialogs/add_empty_book.py b/src/calibre/gui2/dialogs/add_empty_book.py new file mode 100644 index 0000000000..b8339f95f5 --- /dev/null +++ b/src/calibre/gui2/dialogs/add_empty_book.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' +__license__ = 'GPL v3' + + +from PyQt4.Qt import QDialog, QGridLayout, QLabel, QDialogButtonBox, \ + QApplication, QSpinBox, QToolButton, QIcon +from calibre.ebooks.metadata import authors_to_string, string_to_authors +from calibre.gui2.widgets import CompleteComboBox +from calibre.utils.icu import sort_key + +class AddEmptyBookDialog(QDialog): + + def __init__(self, parent, db, author): + QDialog.__init__(self, parent) + self.db = db + + self.setWindowTitle(_('How many empty books?')) + + self._layout = QGridLayout(self) + self.setLayout(self._layout) + + self.qty_label = QLabel(_('How many empty books should be added?')) + self._layout.addWidget(self.qty_label, 0, 0, 1, 2) + + self.qty_spinbox = QSpinBox(self) + self.qty_spinbox.setRange(1, 10000) + self.qty_spinbox.setValue(1) + self._layout.addWidget(self.qty_spinbox, 1, 0, 1, 2) + + self.author_label = QLabel(_('Set the author of the new books to:')) + self._layout.addWidget(self.author_label, 2, 0, 1, 2) + + self.authors_combo = CompleteComboBox(self) + self.authors_combo.setSizeAdjustPolicy( + self.authors_combo.AdjustToMinimumContentsLengthWithIcon) + self.authors_combo.setEditable(True) + self._layout.addWidget(self.authors_combo, 3, 0, 1, 1) + self.initialize_authors(db, author) + + self.clear_button = QToolButton(self) + self.clear_button.setIcon(QIcon(I('trash.png'))) + self.clear_button.setToolTip(_('Reset author to Unknown')) + self.clear_button.clicked.connect(self.reset_author) + self._layout.addWidget(self.clear_button, 3, 1, 1, 1) + + button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + button_box.accepted.connect(self.accept) + button_box.rejected.connect(self.reject) + self._layout.addWidget(button_box) + self.resize(self.sizeHint()) + + def reset_author(self, *args): + self.authors_combo.setEditText(_('Unknown')) + + def initialize_authors(self, db, author): + all_authors = db.all_authors() + all_authors.sort(key=lambda x : sort_key(x[1])) + for i in all_authors: + id, name = i + name = [name.strip().replace('|', ',') for n in name.split(',')] + self.authors_combo.addItem(authors_to_string(name)) + + au = author + if not au: + au = _('Unknown') + self.authors_combo.setEditText(au.replace('|', ',')) + + self.authors_combo.set_separator('&') + self.authors_combo.set_space_before_sep(True) + self.authors_combo.update_items_cache(db.all_author_names()) + + @property + def qty_to_add(self): + return self.qty_spinbox.value() + + @property + def selected_authors(self): + return string_to_authors(unicode(self.authors_combo.text())) + +if __name__ == '__main__': + app = QApplication([]) + d = AddEmptyBookDialog() + d.exec_()