diff --git a/manual/url_scheme.rst b/manual/url_scheme.rst index ae680ab783..e32c558437 100644 --- a/manual/url_scheme.rst +++ b/manual/url_scheme.rst @@ -90,6 +90,8 @@ Virtual library, use:: If you want to switch to a particular Virtual library, use:: calibre://search/Library_Name?virtual_library=Library%20Name + or + calibre://search/Library_Name?encoded_virtual_library=hex_encoded_virtual_library_name replacing spaces in the Virtual library name by ``%20``. diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index ef8cb17542..abfdbb89d6 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -172,6 +172,21 @@ class LocationManager(QObject): # {{{ # }}} +def search_as_url(text): + if text: + from calibre.gui2.ui import get_gui + db = get_gui().current_db + lid = db.new_api.server_library_id + lid = lid.encode('utf-8').hex() + eq = text.encode('utf-8').hex() + vl = db.data.get_base_restriction_name() + ans = f'calibre://search/_hex_-{lid}?eq={eq}' + if vl: + vl = vl.encode('utf-8').hex() + ans += '&encoded_virtual_library=' + vl + return ans + + class SearchBar(QFrame): # {{{ def __init__(self, parent): @@ -221,7 +236,7 @@ class SearchBar(QFrame): # {{{ l.addWidget(sb) l.addWidget(parent.sort_sep) - x = parent.search = SearchBox2(self) + x = parent.search = SearchBox2(self, as_url=search_as_url) x.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) x.setObjectName("search") x.setToolTip(_("
Search the list of books by title, author, publisher, " diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 2fb21c8409..edad2304c9 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -35,6 +35,7 @@ class SearchLineEdit(QLineEdit): # {{{ key_pressed = pyqtSignal(object) clear_history = pyqtSignal() select_on_mouse_press = None + as_url = None def keyPressEvent(self, event): self.key_pressed.emit(event) @@ -59,6 +60,10 @@ class SearchLineEdit(QLineEdit): # {{{ else: menu.addAction(ac) menu.addSeparator() + if self.as_url is not None: + url = self.as_url(self.text()) + if url: + menu.addAction(_('Copy search as URL'), lambda : QApplication.clipboard().setText(url)) menu.addAction(_('&Clear search history')).triggered.connect(self.clear_history) menu.exec_(ev.globalPos()) @@ -109,9 +114,10 @@ class SearchBox2(QComboBox): # {{{ changed = pyqtSignal() focus_to_library = pyqtSignal() - def __init__(self, parent=None, add_clear_action=True): + def __init__(self, parent=None, add_clear_action=True, as_url=None): QComboBox.__init__(self, parent) self.line_edit = SearchLineEdit(self) + self.line_edit.as_url = as_url self.setLineEdit(self.line_edit) self.line_edit.clear_history.connect(self.clear_history) if add_clear_action: diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 3d4acd7c18..c92283c0f6 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -718,7 +718,11 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ if sq: sq = sq[0] sq = sq or '' - vl = (query.get('virtual_library') or ['-'])[0] + vl = None + if query.get('encoded_virtual_library'): + vl = bytes.fromhex(query.get('encoded_virtual_library')[0]).decode('utf-8') + elif query.get('virtual_library'): + vl = query.get('virtual_library')[0] if vl == '-': vl = None