From dd747283ca5075c040dbb45242b44ab946f42834 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Apr 2024 13:26:16 +0530 Subject: [PATCH] Dont endlessly chain NOT when repeatedly inverting the same search --- src/calibre/gui2/search_box.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index e307a33430..7e03a0a88d 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -58,9 +58,9 @@ class SearchLineEdit(QLineEdit): # {{{ menu.addAction(ac) menu.addSeparator() ac = menu.addAction(_('Invert current search')) - ac.setEnabled(bool(self.text())) + ac.setEnabled(bool(self.text().strip())) ac.setIcon(QIcon.ic('search.png')) - ac.triggered.connect(self.reverse_search) + ac.triggered.connect(self.invert_search) menu.addAction(ac) menu.addSeparator() if self.as_url is not None: @@ -70,10 +70,16 @@ 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 invert_search(self): + q = self.text().strip() + if q: + if q.startswith('NOT ( ') and q.endswith(' )'): + q = q[6:-2] + else: + q = f'NOT ( {q} )' + self.setText(q) + ev = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Enter, Qt.KeyboardModifier.NoModifier) + self.keyPressEvent(ev) def paste_and_search(self): self.paste()