From d77c793f64dfe4821c7c5a1eaa9fcc687243d568 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Mon, 29 Apr 2024 15:39:31 +0100 Subject: [PATCH] Add menu action "Reverse current search" to the search bar context menu. Reason: it is sometimes easier to reason about searches as "I want whatever this doesn't match". In addition, most calibre search tools are "positive", returning matches. This context menu action lets you easily reverse a search, returning everything that doesn't match. NB: "Reverse" could be "Invert". I don't know which is the better word. --- src/calibre/gui2/search_box.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 3b7c801df0..090d58df62 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -57,6 +57,12 @@ class SearchLineEdit(QLineEdit): # {{{ else: menu.addAction(ac) menu.addSeparator() + ac = menu.addAction(_('Reverse current search')) + ac.setEnabled(bool(self.text())) + ac.setIcon(QIcon.ic('search.png')) + ac.triggered.connect(self.reverse_search) + menu.addAction(ac) + menu.addSeparator() if self.as_url is not None: url = self.as_url(self.text()) if url: @@ -64,6 +70,11 @@ class SearchLineEdit(QLineEdit): # {{{ menu.addAction(_('&Clear search history')).triggered.connect(self.clear_history) menu.exec(ev.globalPos()) + def reverse_search(self): + self.setText(f'NOT ( {self.text()} )') + ev = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Enter, Qt.KeyboardModifier.NoModifier) + self.keyPressEvent(ev) + def paste_and_search(self): self.paste() ev = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Enter, Qt.KeyboardModifier.NoModifier)