Fix some problems with the new marking code.

1) The listeners weren't called if only labels changed in the is_marked set.
2) refresh_ids returned no rows if any one of the ids was invalid.
3) I used the wrong method in views.py. I have ids but called the method that expected rows.
This commit is contained in:
Charles Haley 2022-05-22 18:24:13 +01:00
parent 69c406a1e4
commit f3372b2dcc
2 changed files with 20 additions and 14 deletions

View File

@ -386,11 +386,12 @@ class View:
changed_ids = old_marked_ids | cmids changed_ids = old_marked_ids | cmids
self.cache.clear_search_caches(changed_ids) self.cache.clear_search_caches(changed_ids)
self.cache.clear_caches(book_ids=changed_ids) self.cache.clear_caches(book_ids=changed_ids)
if old_marked_ids != cmids: # Always call the listener because the labels might have changed even
for funcref in itervalues(self.marked_listeners): # if the ids haven't.
func = funcref() for funcref in itervalues(self.marked_listeners):
if func is not None: func = funcref()
func(old_marked_ids, cmids) if func is not None:
func(old_marked_ids, cmids)
def toggle_marked_ids(self, book_ids): def toggle_marked_ids(self, book_ids):
book_ids = set(book_ids) book_ids = set(book_ids)
@ -412,11 +413,16 @@ class View:
def refresh_ids(self, ids): def refresh_ids(self, ids):
self.cache.clear_caches(book_ids=ids) self.cache.clear_caches(book_ids=ids)
try:
return list(map(self.id_to_index, ids)) # The ids list can contain invalid ids (deleted etc). We want to filter
except ValueError: # those out while keeping the valid ones.
pass def f(id_):
return None 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
def remove(self, book_id): def remove(self, book_id):
try: try:

View File

@ -964,16 +964,16 @@ class BooksView(QTableView): # {{{
# This is needed otherwise Qt does not always update the # This is needed otherwise Qt does not always update the
# viewport correctly. See https://bugs.launchpad.net/bugs/1404697 # viewport correctly. See https://bugs.launchpad.net/bugs/1404697
self.row_header.viewport().update() self.row_header.viewport().update()
# refresh the rows because there might be a composite that uses marked_books() # refresh the rows because there might be a composite that uses marked_books()
self.model().refresh_rows(changed) self.model().refresh_rows(sections)
else: else:
# Marked items have either appeared or all been removed # Marked items have either appeared or all been removed
self.model().set_row_decoration(current_marked) self.model().set_row_decoration(current_marked)
self.row_header.headerDataChanged(Qt.Orientation.Vertical, 0, self.row_header.count()-1) self.row_header.headerDataChanged(Qt.Orientation.Vertical, 0, self.row_header.count()-1)
self.row_header.geometriesChanged.emit() self.row_header.geometriesChanged.emit()
self.set_row_header_visibility() self.set_row_header_visibility()
# refresh the rows because there might be a composite that uses marked_books() # refresh rows for the ids because there might be a composite that uses marked_books()
self.model().refresh_rows(current_marked) self.model().refresh_ids(current_marked)
def set_row_header_visibility(self): def set_row_header_visibility(self):
visible = self.model().row_decoration is not None or gprefs['row_numbers_in_book_list'] visible = self.model().row_decoration is not None or gprefs['row_numbers_in_book_list']