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)
This commit is contained in:
Kovid Goyal 2019-07-15 18:14:55 +05:30
parent e06d268dad
commit ae02e93b22
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 16 additions and 11 deletions

View File

@ -30,14 +30,15 @@ def containsq(x, prefix):
class CompleteModel(QAbstractListModel): # {{{ 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) QAbstractListModel.__init__(self, parent)
self.strip_completion_entries = strip_completion_entries
self.sort_func = sort_func self.sort_func = sort_func
self.all_items = self.current_items = () self.all_items = self.current_items = ()
self.current_prefix = '' self.current_prefix = ''
def set_items(self, items): 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 = [x for x in items if x]
items = tuple(sorted(items, key=self.sort_func)) items = tuple(sorted(items, key=self.sort_func))
self.beginResetModel() self.beginResetModel()
@ -84,7 +85,7 @@ class Completer(QListView): # {{{
item_selected = pyqtSignal(object) item_selected = pyqtSignal(object)
relayout_needed = pyqtSignal() 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) QListView.__init__(self)
self.disable_popup = False self.disable_popup = False
self.completer_widget = weakref.ref(completer_widget) self.completer_widget = weakref.ref(completer_widget)
@ -95,7 +96,7 @@ class Completer(QListView): # {{{
self.setSelectionBehavior(self.SelectRows) self.setSelectionBehavior(self.SelectRows)
self.setSelectionMode(self.SingleSelection) self.setSelectionMode(self.SingleSelection)
self.setAlternatingRowColors(True) 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.setMouseTracking(True)
self.entered.connect(self.item_entered) self.entered.connect(self.item_entered)
self.activated.connect(self.item_chosen) self.activated.connect(self.item_chosen)
@ -301,7 +302,7 @@ class LineEdit(QLineEdit, LineEditECM):
''' '''
item_selected = pyqtSignal(object) 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) QLineEdit.__init__(self, parent)
self.sep = ',' self.sep = ','
@ -311,7 +312,7 @@ class LineEdit(QLineEdit, LineEditECM):
completer_widget = (self if completer_widget is None else completer_widget = (self if completer_widget is None else
completer_widget) 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, self.mcompleter.item_selected.connect(self.completion_selected,
type=Qt.QueuedConnection) type=Qt.QueuedConnection)
self.mcompleter.relayout_needed.connect(self.relayout) self.mcompleter.relayout_needed.connect(self.relayout)
@ -436,7 +437,9 @@ class EditWithComplete(EnComboBox):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
EnComboBox.__init__(self, *args) 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.lineEdit().item_selected.connect(self.item_selected)
self.setCompleter(None) self.setCompleter(None)
self.eat_focus_out = True self.eat_focus_out = True

View File

@ -89,9 +89,10 @@ class HistoryBox(HistoryComboBox):
max_history_items = 100 max_history_items = 100
save_search = pyqtSignal() save_search = pyqtSignal()
show_saved_searches = pyqtSignal() show_saved_searches = pyqtSignal()
min_history_entry_length = 1
def __init__(self, parent, clear_msg): 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.disable_popup = tprefs['disable_completion_popup_for_search']
self.clear_msg = clear_msg self.clear_msg = clear_msg
self.ignore_snip_expansion = False self.ignore_snip_expansion = False

View File

@ -24,6 +24,7 @@ from polyglot.builtins import unicode_type
class HistoryMixin(object): class HistoryMixin(object):
max_history_items = None max_history_items = None
min_history_entry_length = 3
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
pass pass
@ -45,7 +46,7 @@ class HistoryMixin(object):
def save_history(self): def save_history(self):
ct = unicode_type(self.text()) ct = unicode_type(self.text())
if len(ct) > 2: if len(ct) >= self.min_history_entry_length:
try: try:
self.history.remove(ct) self.history.remove(ct)
except ValueError: except ValueError:
@ -70,8 +71,8 @@ class HistoryLineEdit2(LineEdit, HistoryMixin):
class HistoryComboBox(EditWithComplete, HistoryMixin): class HistoryComboBox(EditWithComplete, HistoryMixin):
def __init__(self, parent=None): def __init__(self, parent=None, strip_completion_entries=True):
EditWithComplete.__init__(self, parent, sort_func=lambda x:b'') EditWithComplete.__init__(self, parent, sort_func=lambda x:b'', strip_completion_entries=strip_completion_entries)
class ColorButton(QPushButton): class ColorButton(QPushButton):