This commit is contained in:
Kovid Goyal 2022-10-16 19:27:16 +05:30
commit 41e3770142
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 22 additions and 11 deletions

View File

@ -149,6 +149,8 @@ class View:
fmt = partial(format_is_multiple, sep=sep) fmt = partial(format_is_multiple, sep=sep)
self._field_getters[idx] = partial(func, label, fmt=fmt) if func == self._get else func self._field_getters[idx] = partial(func, label, fmt=fmt) if func == self._get else func
self._real_map_filtered = tuple()
self._real_map_filtered_dict = dict()
self._map = tuple(sorted(self.cache.all_book_ids())) self._map = tuple(sorted(self.cache.all_book_ids()))
self._map_filtered = tuple(self._map) self._map_filtered = tuple(self._map)
self.full_map_is_sorted = True self.full_map_is_sorted = True
@ -171,6 +173,15 @@ class View:
def sanitize_sort_field_name(self, field): def sanitize_sort_field_name(self, field):
return sanitize_sort_field_name(self.field_metadata, field) return sanitize_sort_field_name(self.field_metadata, field)
@property
def _map_filtered(self):
return self._real_map_filtered
@_map_filtered.setter
def _map_filtered(self, v):
self._real_map_filtered = v
self._real_map_filtered_dict = {id_:row for row, id_ in enumerate(self._map_filtered)}
@property @property
def field_metadata(self): def field_metadata(self):
return self.cache.field_metadata return self.cache.field_metadata
@ -215,12 +226,16 @@ class View:
return self._map_filtered[idx] return self._map_filtered[idx]
def id_to_index(self, book_id): def id_to_index(self, book_id):
return self._map_filtered.index(book_id) try:
return self._real_map_filtered_dict[book_id]
except KeyError:
raise ValueError(f'No such book_id {book_id}')
row = index_to_id row = index_to_id
def index(self, book_id, cache=False): def index(self, book_id, cache=False):
x = self._map if cache else self._map_filtered if cache:
return x.index(book_id) return self._map.index(book_id)
return self.id_to_index(book_id)
def _get(self, field, idx, index_is_id=True, default_value=None, fmt=lambda x:x): def _get(self, field, idx, index_is_id=True, default_value=None, fmt=lambda x:x):
id_ = idx if index_is_id else self.index_to_id(idx) id_ = idx if index_is_id else self.index_to_id(idx)
@ -452,12 +467,7 @@ class View:
# The ids list can contain invalid ids (deleted etc). We want to filter # The ids list can contain invalid ids (deleted etc). We want to filter
# those out while keeping the valid ones. # those out while keeping the valid ones.
def f(id_): res = [self._real_map_filtered_dict[id_] for id_ in ids if id_ in self._real_map_filtered_dict]
try:
return self.id_to_index(id_)
except ValueError:
return None
res = [i for i in map(f, ids) if i is not None]
return res if res else None return res if res else None
def remove(self, book_id): def remove(self, book_id):

View File

@ -110,8 +110,9 @@ def event_has_mods(self, event=None):
def mousePressEvent(self, event): def mousePressEvent(self, event):
ep = event.pos() ep = event.pos()
if self.indexAt(ep) in self.selectionModel().selectedIndexes() and \ # for performance, check the selection only once we know we need it
event.button() == Qt.MouseButton.LeftButton and not self.event_has_mods(): if event.button() == Qt.MouseButton.LeftButton and not self.event_has_mods() \
and self.indexAt(ep) in self.selectionModel().selectedIndexes():
self.drag_start_pos = ep self.drag_start_pos = ep
if hasattr(self, 'handle_mouse_press_event'): if hasattr(self, 'handle_mouse_press_event'):
return self.handle_mouse_press_event(event) return self.handle_mouse_press_event(event)