From ae02e93b22c4fc4a8fd0637032e164c3024484f6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 15 Jul 2019 18:14:55 +0530 Subject: [PATCH] Edit book: Allow the search expression history to remember very short terms and also preserve leading and trailing whitespace Fixes #1836559 [leading and trailing spaces are trimmed from old search and replace values in e-book editor](https://bugs.launchpad.net/calibre/+bug/1836559) --- src/calibre/gui2/complete2.py | 17 ++++++++++------- src/calibre/gui2/tweak_book/search.py | 3 ++- src/calibre/gui2/widgets2.py | 7 ++++--- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/calibre/gui2/complete2.py b/src/calibre/gui2/complete2.py index 49b8184abe..d2fe3540fe 100644 --- a/src/calibre/gui2/complete2.py +++ b/src/calibre/gui2/complete2.py @@ -30,14 +30,15 @@ def containsq(x, prefix): class CompleteModel(QAbstractListModel): # {{{ - def __init__(self, parent=None, sort_func=sort_key): + def __init__(self, parent=None, sort_func=sort_key, strip_completion_entries=True): QAbstractListModel.__init__(self, parent) + self.strip_completion_entries = strip_completion_entries self.sort_func = sort_func self.all_items = self.current_items = () self.current_prefix = '' def set_items(self, items): - items = [unicode_type(x.strip()) for x in items] + items = [unicode_type(x).strip() if self.strip_completion_entries else unicode_type(x) for x in items] items = [x for x in items if x] items = tuple(sorted(items, key=self.sort_func)) self.beginResetModel() @@ -84,7 +85,7 @@ class Completer(QListView): # {{{ item_selected = pyqtSignal(object) relayout_needed = pyqtSignal() - def __init__(self, completer_widget, max_visible_items=7, sort_func=sort_key): + def __init__(self, completer_widget, max_visible_items=7, sort_func=sort_key, strip_completion_entries=True): QListView.__init__(self) self.disable_popup = False self.completer_widget = weakref.ref(completer_widget) @@ -95,7 +96,7 @@ class Completer(QListView): # {{{ self.setSelectionBehavior(self.SelectRows) self.setSelectionMode(self.SingleSelection) self.setAlternatingRowColors(True) - self.setModel(CompleteModel(self, sort_func=sort_func)) + self.setModel(CompleteModel(self, sort_func=sort_func, strip_completion_entries=strip_completion_entries)) self.setMouseTracking(True) self.entered.connect(self.item_entered) self.activated.connect(self.item_chosen) @@ -301,7 +302,7 @@ class LineEdit(QLineEdit, LineEditECM): ''' item_selected = pyqtSignal(object) - def __init__(self, parent=None, completer_widget=None, sort_func=sort_key): + def __init__(self, parent=None, completer_widget=None, sort_func=sort_key, strip_completion_entries=True): QLineEdit.__init__(self, parent) self.sep = ',' @@ -311,7 +312,7 @@ class LineEdit(QLineEdit, LineEditECM): completer_widget = (self if completer_widget is None else completer_widget) - self.mcompleter = Completer(completer_widget, sort_func=sort_func) + self.mcompleter = Completer(completer_widget, sort_func=sort_func, strip_completion_entries=strip_completion_entries) self.mcompleter.item_selected.connect(self.completion_selected, type=Qt.QueuedConnection) self.mcompleter.relayout_needed.connect(self.relayout) @@ -436,7 +437,9 @@ class EditWithComplete(EnComboBox): def __init__(self, *args, **kwargs): EnComboBox.__init__(self, *args) - self.setLineEdit(LineEdit(self, completer_widget=self, sort_func=kwargs.get('sort_func', sort_key))) + self.setLineEdit(LineEdit( + self, completer_widget=self, sort_func=kwargs.get('sort_func', sort_key), + strip_completion_entries=kwargs.get('strip_completion_entries', False))) self.lineEdit().item_selected.connect(self.item_selected) self.setCompleter(None) self.eat_focus_out = True diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py index 99e9caa239..657a57bb26 100644 --- a/src/calibre/gui2/tweak_book/search.py +++ b/src/calibre/gui2/tweak_book/search.py @@ -89,9 +89,10 @@ class HistoryBox(HistoryComboBox): max_history_items = 100 save_search = pyqtSignal() show_saved_searches = pyqtSignal() + min_history_entry_length = 1 def __init__(self, parent, clear_msg): - HistoryComboBox.__init__(self, parent) + HistoryComboBox.__init__(self, parent, strip_completion_entries=False) self.disable_popup = tprefs['disable_completion_popup_for_search'] self.clear_msg = clear_msg self.ignore_snip_expansion = False diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py index 553c735fb6..dd9e600b35 100644 --- a/src/calibre/gui2/widgets2.py +++ b/src/calibre/gui2/widgets2.py @@ -24,6 +24,7 @@ from polyglot.builtins import unicode_type class HistoryMixin(object): max_history_items = None + min_history_entry_length = 3 def __init__(self, *args, **kwargs): pass @@ -45,7 +46,7 @@ class HistoryMixin(object): def save_history(self): ct = unicode_type(self.text()) - if len(ct) > 2: + if len(ct) >= self.min_history_entry_length: try: self.history.remove(ct) except ValueError: @@ -70,8 +71,8 @@ class HistoryLineEdit2(LineEdit, HistoryMixin): class HistoryComboBox(EditWithComplete, HistoryMixin): - def __init__(self, parent=None): - EditWithComplete.__init__(self, parent, sort_func=lambda x:b'') + def __init__(self, parent=None, strip_completion_entries=True): + EditWithComplete.__init__(self, parent, sort_func=lambda x:b'', strip_completion_entries=strip_completion_entries) class ColorButton(QPushButton):