mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
parent
f5b35bb97e
commit
13191a08c7
@ -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):
|
||||||
|
@ -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,7 +693,8 @@ 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)
|
||||||
self.model().sort(col, order)
|
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
|
||||||
|
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,7 +730,8 @@ 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:
|
||||||
self._model.sort_by_named_field(field, order, reset)
|
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
|
||||||
|
self._model.sort_by_named_field(field, order, reset)
|
||||||
self.set_sort_indicator(-1, True)
|
self.set_sort_indicator(-1, True)
|
||||||
|
|
||||||
def multisort(self, fields, reset=True, only_if_different=False):
|
def multisort(self, fields, reset=True, only_if_different=False):
|
||||||
@ -767,7 +753,8 @@ 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]
|
||||||
self._model.resort(reset=reset)
|
with self.preserve_state(preserve_vpos=False, require_selected_ids=False):
|
||||||
|
self._model.resort(reset=reset)
|
||||||
col = fields[0][0]
|
col = fields[0][0]
|
||||||
ascending = fields[0][1]
|
ascending = fields[0][1]
|
||||||
try:
|
try:
|
||||||
@ -781,13 +768,12 @@ 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
|
except TypeError:
|
||||||
except TypeError:
|
sort_col, order = 'date', True
|
||||||
sort_col, order = 'date', True
|
self.sort_by_named_field(sort_col, not order)
|
||||||
self.sort_by_named_field(sort_col, not order)
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Ondevice column {{{
|
# Ondevice column {{{
|
||||||
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user