diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 51941369fa..32e87cb899 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -151,6 +151,7 @@ def create_defs(): defs['row_numbers_in_book_list'] = True defs['hidpi'] = 'auto' defs['tag_browser_item_padding'] = 0.5 + defs['paste_isbn_prefixes'] = ['isbn', 'url', 'amazon', 'google'] create_defs() diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index acbd3ce493..629e6b84b6 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -25,7 +25,7 @@ from calibre.ebooks.metadata import ( title_sort, string_to_authors, check_isbn, authors_to_sort_string) from calibre.ebooks.metadata.meta import get_metadata from calibre.gui2 import (file_icon_provider, UNDEFINED_QDATETIME, - choose_files, error_dialog, choose_images) + choose_files, error_dialog, choose_images, gprefs) from calibre.gui2.complete2 import EditWithComplete from calibre.utils.date import ( local_tz, qt_to_dt, as_local_time, UNDEFINED_DATE, is_date_undefined, @@ -1536,6 +1536,23 @@ class IdentifiersEdit(QLineEdit, ToMetadataMixin): self.setToolTip(tt+extra) self.setStyleSheet(INDICATOR_SHEET % col) + def paste_identifier(self): + try: + prefix = gprefs['paste_isbn_prefixes'][0] + except IndexError: + prefix = 'isbn' + self.paste_prefix(prefix) + + def paste_prefix(self, prefix): + if prefix == 'isbn': + self.paste_isbn() + else: + text = unicode(QApplication.clipboard().text()).strip() + if text: + vals = self.current_val + vals[prefix] = text + self.current_val = vals + def paste_isbn(self): text = unicode(QApplication.clipboard().text()).strip() if not text or not check_isbn(text): diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 65f2782333..68625d59b0 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -9,10 +9,11 @@ __docformat__ = 'restructuredtext en' import os, errno from datetime import datetime +from functools import partial from PyQt5.Qt import (Qt, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QGridLayout, pyqtSignal, QDialogButtonBox, QScrollArea, QFont, QCoreApplication, - QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, + QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, QInputDialog, QSizePolicy, QFrame, QSize, QKeySequence, QMenu, QShortcut, QDialog) from calibre.constants import isosx @@ -242,12 +243,16 @@ class MetadataSingleDialogBase(QDialog): self.clear_identifiers_button.setIcon(QIcon(I('trash.png'))) self.clear_identifiers_button.setToolTip(_('Clear Ids')) self.clear_identifiers_button.clicked.connect(self.identifiers.clear) - self.paste_isbn_button = QToolButton(self) - self.paste_isbn_button.setToolTip('

' + + self.paste_isbn_button = b = RightClickButton(self) + b.setToolTip('

' + _('Paste the contents of the clipboard into the ' - 'identifiers box prefixed with isbn:') + '

') - self.paste_isbn_button.setIcon(QIcon(I('edit-paste.png'))) - self.paste_isbn_button.clicked.connect(self.identifiers.paste_isbn) + 'identifiers prefixed with isbn:. Or right click, ' + 'to choose a different prefix.') + '

') + b.setIcon(QIcon(I('edit-paste.png'))) + b.clicked.connect(self.identifiers.paste_identifier) + b.setPopupMode(b.DelayedPopup) + b.setMenu(QMenu()) + self.update_paste_identifiers_menu() self.publisher = PublisherEdit(self) self.basic_metadata_widgets.append(self.publisher) @@ -290,6 +295,22 @@ class MetadataSingleDialogBase(QDialog): # }}} + def update_paste_identifiers_menu(self): + m = self.paste_isbn_button.menu() + m.clear() + m.addAction(_('Edit list of prefixes'), self.edit_prefix_list) + m.addSeparator() + for prefix in gprefs['paste_isbn_prefixes'][1:]: + m.addAction(prefix, partial(self.identifiers.paste_prefix, prefix)) + + def edit_prefix_list(self): + prefixes, ok = QInputDialog.getMultiLineText( + self, _('Edit prefixes'), _('Enter prefixes, one on a line. The first prefix becomes the default.'), + '\n'.join(list(map(type(u''), gprefs['paste_isbn_prefixes'])))) + if ok: + gprefs['paste_isbn_prefixes'] = list(filter(None, (x.strip() for x in prefixes.splitlines()))) or gprefs.defaults['paste_isbn_prefixes'] + self.update_paste_identifiers_menu() + def create_custom_metadata_widgets(self): # {{{ self.custom_metadata_widgets_parent = w = QWidget(self) layout = QGridLayout()