Ensure that all sorting of the books list via calibre APIs preserves selected indices and current index and horizontal position

I dont think there any sorts done without going through the view
functions. But we will see.
This commit is contained in:
Kovid Goyal 2023-04-26 09:27:22 +05:30
parent f5b35bb97e
commit 13191a08c7
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 21 additions and 28 deletions

View File

@ -1721,6 +1721,13 @@ class DeviceBooksModel(BooksModel): # {{{
def paths(self, rows): def paths(self, rows):
return [self.db[self.map[r.row()]].path for r in rows] return [self.db[self.map[r.row()]].path for r in rows]
def id(self, row):
row = getattr(row, 'row', lambda:row)()
try:
return self.db[self.map[row]].path
except Exception:
return None
def paths_for_db_ids(self, db_ids, as_map=False): def paths_for_db_ids(self, db_ids, as_map=False):
res = defaultdict(list) if as_map else [] res = defaultdict(list) if as_map else []
for r,b in enumerate(self.db): for r,b in enumerate(self.db):

View File

@ -150,8 +150,7 @@ class PreserveViewState: # {{{
and dont affect the scroll position. and dont affect the scroll position.
''' '''
def __init__(self, view, preserve_hpos=True, preserve_vpos=True, def __init__(self, view, preserve_hpos=True, preserve_vpos=True, require_selected_ids=True):
require_selected_ids=True):
self.view = view self.view = view
self.require_selected_ids = require_selected_ids self.require_selected_ids = require_selected_ids
self.preserve_hpos = preserve_hpos self.preserve_hpos = preserve_hpos
@ -439,10 +438,6 @@ class BooksView(QTableView): # {{{
hv = self.verticalHeader() hv = self.verticalHeader()
hv.setSectionsClickable(True) hv.setSectionsClickable(True)
hv.setCursor(Qt.CursorShape.PointingHandCursor) hv.setCursor(Qt.CursorShape.PointingHandCursor)
self.selected_ids = []
self._model.about_to_be_sorted.connect(self.about_to_be_sorted)
self._model.sorting_done.connect(self.sorting_done,
type=Qt.ConnectionType.QueuedConnection)
self.set_row_header_visibility() self.set_row_header_visibility()
self.allow_mirroring = True self.allow_mirroring = True
if self.is_library_view: if self.is_library_view:
@ -698,6 +693,7 @@ class BooksView(QTableView): # {{{
self.column_header.blockSignals(True) self.column_header.blockSignals(True)
self.column_header.setSortIndicator(col, order) self.column_header.setSortIndicator(col, order)
self.column_header.blockSignals(False) self.column_header.blockSignals(False)
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
self.model().sort(col, order) self.model().sort(col, order)
if self.is_library_view: if self.is_library_view:
self.set_sort_indicator(col, ascending) self.set_sort_indicator(col, ascending)
@ -727,17 +723,6 @@ class BooksView(QTableView): # {{{
gprefs[pname] = previous gprefs[pname] = previous
self.sort_by_named_field(field, previous[field]) self.sort_by_named_field(field, previous[field])
def about_to_be_sorted(self, idc):
selected_rows = [r.row() for r in self.selectionModel().selectedRows()]
self.selected_ids = [idc(r) for r in selected_rows]
def sorting_done(self, indexc):
pos = self.horizontalScrollBar().value()
self.select_rows(self.selected_ids, using_ids=True, change_current=True,
scroll=True)
self.selected_ids = []
self.horizontalScrollBar().setValue(pos)
def sort_by_named_field(self, field, order, reset=True): def sort_by_named_field(self, field, order, reset=True):
if isinstance(order, Qt.SortOrder): if isinstance(order, Qt.SortOrder):
order = order == Qt.SortOrder.AscendingOrder order = order == Qt.SortOrder.AscendingOrder
@ -745,6 +730,7 @@ class BooksView(QTableView): # {{{
idx = self.column_map.index(field) idx = self.column_map.index(field)
self.sort_by_column_and_order(idx, order) self.sort_by_column_and_order(idx, order)
else: else:
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
self._model.sort_by_named_field(field, order, reset) self._model.sort_by_named_field(field, order, reset)
self.set_sort_indicator(-1, True) self.set_sort_indicator(-1, True)
@ -767,6 +753,7 @@ class BooksView(QTableView): # {{{
sh.insert(0, (n, d)) sh.insert(0, (n, d))
sh = self.cleanup_sort_history(sh, ignore_column_map=True) sh = self.cleanup_sort_history(sh, ignore_column_map=True)
self._model.sort_history = [tuple(x) for x in sh] self._model.sort_history = [tuple(x) for x in sh]
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
self._model.resort(reset=reset) self._model.resort(reset=reset)
col = fields[0][0] col = fields[0][0]
ascending = fields[0][1] ascending = fields[0][1]
@ -781,7 +768,6 @@ class BooksView(QTableView): # {{{
self._model.resort(reset=True) self._model.resort(reset=True)
def reverse_sort(self): def reverse_sort(self):
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
m = self.model() m = self.model()
try: try:
sort_col, order = m.sorted_on sort_col, order = m.sorted_on
@ -1483,7 +1469,7 @@ class BooksView(QTableView): # {{{
for idx in self.selectedIndexes(): for idx in self.selectedIndexes():
r = idx.row() r = idx.row()
i = m.id(r) i = m.id(r)
if i not in seen: if i not in seen and i is not None:
ans.append(i) ans.append(i)
seen.add(i) seen.add(i)
return seen if as_set else ans return seen if as_set else ans