From 7614dde2f4bd9293b0c3e9c55df1f8500e26c061 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 3 Jun 2011 17:18:54 +0100 Subject: [PATCH] Add a tweak to control whencompletion switches to ascii-like order --- resources/default_tweaks.py | 15 +++++++++------ src/calibre/gui2/complete.py | 11 +++++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index a7f14d66d4..8e69c62b25 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -37,7 +37,6 @@ series_index_auto_increment = 'next' # Can be either True or False authors_completer_append_separator = False - #: Author sort name algorithm # The algorithm used to copy author to author_sort # Possible values are: @@ -71,6 +70,15 @@ author_name_suffixes = ('Jr', 'Sr', 'Inc', 'Ph.D', 'Phd', # categories_use_field_for_author_name = 'author_sort' categories_use_field_for_author_name = 'author' +#: Completion sort order: choose when to change from lexicographic to ASCII-like +# Calibre normally uses locale-dependent lexicographic ordering when showing +# completion values. This means that the sort order is correct for the user's +# language. However, this can be slow. Performance is improved by switching to +# ascii ordering. This tweak controls when that switch happens. Set it to zero +# to always use ascii ordering. Set it to something larger than zero to switch +# to ascii ordering for performance reasons. +completion_change_to_ascii_sorting = 1000 + #: Control partitioning of Tag Browser # When partitioning the tags browser, the format of the subcategory label is # controlled by a template: categories_collapsed_name_template if sorting by @@ -93,7 +101,6 @@ categories_collapsed_name_template = r'{first.sort:shorten(4,,0)} - {last.sort:s categories_collapsed_rating_template = r'{first.avg_rating:4.2f:ifempty(0)} - {last.avg_rating:4.2f:ifempty(0)}' categories_collapsed_popularity_template = r'{first.count:d} - {last.count:d}' - #: Specify columns to sort the booklist by on startup # Provide a set of columns to be sorted on when calibre starts # The argument is None if saved sort history is to be used @@ -244,17 +251,14 @@ sony_collection_name_template='{value}{category:| (|)}' # Default: empty (no rules), so no collection attributes are named. sony_collection_sorting_rules = [] - #: Control how tags are applied when copying books to another library # Set this to True to ensure that tags in 'Tags to add when adding # a book' are added when copying books to another library add_new_book_tags_when_importing_books = False - #: Set the maximum number of tags to show per book in the content server max_content_server_tags_shown=5 - #: Set custom metadata fields that the content server will or will not display. # content_server_will_display is a list of custom fields to be displayed. # content_server_wont_display is a list of custom fields not to be displayed. @@ -296,7 +300,6 @@ generate_cover_foot_font = None # Example: doubleclick_on_library_view = 'do_nothing' doubleclick_on_library_view = 'open_viewer' - #: Language to use when sorting. # Setting this tweak will force sorting to use the # collating order for the specified language. This might be useful if you run diff --git a/src/calibre/gui2/complete.py b/src/calibre/gui2/complete.py index c99cd47373..1696ba11ed 100644 --- a/src/calibre/gui2/complete.py +++ b/src/calibre/gui2/complete.py @@ -12,6 +12,7 @@ from PyQt4.Qt import QLineEdit, QAbstractListModel, Qt, \ from calibre.utils.icu import sort_key, lower from calibre.gui2 import NONE from calibre.gui2.widgets import EnComboBox, LineEditECM +from calibre.utils.config import tweaks class CompleteModel(QAbstractListModel): @@ -21,7 +22,10 @@ class CompleteModel(QAbstractListModel): def set_items(self, items): items = [unicode(x.strip()) for x in items] - self.items = list(sorted(items, key=lambda x: sort_key(x))) + if len(items) < tweaks['completion_change_to_ascii_sorting']: + self.items = list(sorted(items, key=lambda x: sort_key(x))) + else: + self.items = list(sorted(items, key=lambda x: x)) self.lowered_items = [lower(x) for x in self.items] self.reset() @@ -62,7 +66,6 @@ class MultiCompleteLineEdit(QLineEdit, LineEditECM): c.setWidget(self) c.setCompletionMode(QCompleter.PopupCompletion) c.setCaseSensitivity(Qt.CaseInsensitive) - c.setModelSorting(QCompleter.UnsortedModel) c.setCompletionRole(Qt.DisplayRole) p = c.popup() p.setMouseTracking(True) @@ -75,6 +78,10 @@ class MultiCompleteLineEdit(QLineEdit, LineEditECM): # Interface {{{ def update_items_cache(self, complete_items): + if len(complete_items) < tweaks['completion_change_to_ascii_sorting']: + self._completer.setModelSorting(QCompleter.UnsortedModel) + else: + self._completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) self.all_items = complete_items def set_separator(self, sep):