From 3136eac5ff6d35df58bc7ed51fa105709a8b8dfd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 3 Jun 2021 08:43:48 +0530 Subject: [PATCH] Book details: Ctrl-clicking on tags now adds them to the existing search instead of replacing it. Fixes #1930136 [[Enhancement] Holding Ctrl and clicking on a tag in the Book details should add to the current search](https://bugs.launchpad.net/calibre/+bug/1930136) --- src/calibre/gui2/book_details.py | 17 ++++++++++++----- src/calibre/gui2/init.py | 10 +++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 698e2d6477..2e02adeb1d 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -151,19 +151,19 @@ def init_find_in_grouped_search(menu, field, value, book_info): m.addAction(QIcon(get_icon_path(field, '')), _('in category %s')%escape_for_menu(field_name), lambda g=field: book_info.search_requested( - '{}:"={}"'.format(g, value.replace('"', r'\"')))) + '{}:"={}"'.format(g, value.replace('"', r'\"')), '')) for gst in gsts_to_show: icon_path = get_icon_path(gst, '@') m.addAction(QIcon(icon_path), _('in grouped search %s')%gst, lambda g=gst: book_info.search_requested( - '{}:"={}"'.format(g, value.replace('"', r'\"')))) + '{}:"={}"'.format(g, value.replace('"', r'\"')), '')) else: menu.addAction(QIcon(I('search.png')), _('Search calibre for {val} in category {name}').format( val=escape_for_menu(value), name=escape_for_menu(field_name)), lambda g=field: book_info.search_requested( - '{}:"={}"'.format(g, value.replace('"', r'\"')))) + '{}:"={}"'.format(g, value.replace('"', r'\"')), '')) def render_html(mi, vertical, widget, all_fields=False, render_data_func=None, pref_name='book_display_fields'): # {{{ @@ -918,7 +918,7 @@ class BookDetails(QWidget): # {{{ show_book_info = pyqtSignal() open_containing_folder = pyqtSignal(int) view_specific_format = pyqtSignal(int, object) - search_requested = pyqtSignal(object) + search_requested = pyqtSignal(object, object) remove_specific_format = pyqtSignal(int, object) remove_metadata_item = pyqtSignal(int, object, object) save_specific_format = pyqtSignal(int, object) @@ -1030,7 +1030,14 @@ class BookDetails(QWidget): # {{{ typ, val = link.partition(':')[::2] def search_term(field, val): - self.search_requested.emit('{}:"={}"'.format(field, val.replace('"', '\\"'))) + append = '' + if QApplication.instance().keyboardModifiers() & Qt.KeyboardModifier.ControlModifier: + append = 'OR' + + self.search_requested.emit( + '{}:"={}"'.format(field, val.replace('"', '\\"')), + append + ) def browse(url): try: diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 93a0d4931e..46bbfec6a1 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -664,7 +664,7 @@ class LayoutMixin(object): # {{{ type=Qt.ConnectionType.QueuedConnection) self.book_details.open_containing_folder.connect(self.iactions['View'].view_folder_for_id) self.book_details.view_specific_format.connect(self.iactions['View'].view_format_by_id) - self.book_details.search_requested.connect(self.search.set_search_string) + self.book_details.search_requested.connect(self.set_search_string_with_append) self.book_details.remove_specific_format.connect( self.iactions['Remove Books'].remove_format_by_id) self.book_details.remove_metadata_item.connect( @@ -691,6 +691,14 @@ class LayoutMixin(object): # {{{ self.library_view.currentIndex()) self.library_view.setFocus(Qt.FocusReason.OtherFocusReason) + def set_search_string_with_append(self, expression, append=''): + current = self.search.text().strip() + if append: + expr = f'{current} {append} {expression}' if current else expression + else: + expr = expression + self.search.set_search_string(expr) + def edit_identifiers_triggerred(self): book_id = self.library_view.current_book db = self.current_db.new_api