mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Remember last used sort when sorting on an unsorted col
Book list: When sorting on a currently unsorted column, use the last used sort for that column, instead of always sorting in ascending order. Fixes #1216714 [[Feature request] I'd like Calibre to memorize the sorting order of a column](https://bugs.launchpad.net/calibre/+bug/1216714)
This commit is contained in:
parent
106f7d5b34
commit
ed35c29f69
@ -69,7 +69,7 @@ class SortByAction(InterfaceAction):
|
|||||||
name = _('Title')
|
name = _('Title')
|
||||||
if key == 'ondevice' and self.gui.device_connected is None:
|
if key == 'ondevice' and self.gui.device_connected is None:
|
||||||
continue
|
continue
|
||||||
ascending = True
|
ascending = None
|
||||||
if key == sort_col:
|
if key == sort_col:
|
||||||
name = _('%s [reverse current sort]') % name
|
name = _('%s [reverse current sort]') % name
|
||||||
ascending = not order
|
ascending = not order
|
||||||
@ -80,6 +80,9 @@ class SortByAction(InterfaceAction):
|
|||||||
menu.addAction(sac)
|
menu.addAction(sac)
|
||||||
|
|
||||||
def sort_requested(self, key, ascending):
|
def sort_requested(self, key, ascending):
|
||||||
|
if ascending is None:
|
||||||
|
self.gui.library_view.intelligent_sort(key, True)
|
||||||
|
else:
|
||||||
self.gui.library_view.sort_by_named_field(key, ascending)
|
self.gui.library_view.sort_by_named_field(key, ascending)
|
||||||
|
|
||||||
|
|
||||||
|
@ -220,6 +220,8 @@ class BooksView(QTableView): # {{{
|
|||||||
self.was_restored = False
|
self.was_restored = False
|
||||||
self.column_header = HeaderView(Qt.Horizontal, self)
|
self.column_header = HeaderView(Qt.Horizontal, self)
|
||||||
self.setHorizontalHeader(self.column_header)
|
self.setHorizontalHeader(self.column_header)
|
||||||
|
self.column_header.sortIndicatorChanged.disconnect()
|
||||||
|
self.column_header.sortIndicatorChanged.connect(self.user_sort_requested)
|
||||||
self.column_header.setMovable(True)
|
self.column_header.setMovable(True)
|
||||||
self.column_header.setClickable(True)
|
self.column_header.setClickable(True)
|
||||||
self.column_header.sectionMoved.connect(self.save_state)
|
self.column_header.sectionMoved.connect(self.save_state)
|
||||||
@ -257,9 +259,9 @@ class BooksView(QTableView): # {{{
|
|||||||
sz = h.sectionSizeHint(idx)
|
sz = h.sectionSizeHint(idx)
|
||||||
h.resizeSection(idx, sz)
|
h.resizeSection(idx, sz)
|
||||||
elif action == 'ascending':
|
elif action == 'ascending':
|
||||||
self.sortByColumn(idx, Qt.AscendingOrder)
|
self.sort_by_column_and_order(idx, True)
|
||||||
elif action == 'descending':
|
elif action == 'descending':
|
||||||
self.sortByColumn(idx, Qt.DescendingOrder)
|
self.sort_by_column_and_order(idx, False)
|
||||||
elif action == 'defaults':
|
elif action == 'defaults':
|
||||||
self.apply_state(self.get_default_state())
|
self.apply_state(self.get_default_state())
|
||||||
elif action == 'addcustcol':
|
elif action == 'addcustcol':
|
||||||
@ -368,6 +370,30 @@ class BooksView(QTableView): # {{{
|
|||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Sorting {{{
|
# Sorting {{{
|
||||||
|
def sort_by_column_and_order(self, col, ascending):
|
||||||
|
self.column_header.blockSignals(True)
|
||||||
|
self.sortByColumn(col, Qt.AscendingOrder if ascending else Qt.DescendingOrder)
|
||||||
|
self.column_header.blockSignals(False)
|
||||||
|
|
||||||
|
def user_sort_requested(self, col, order=Qt.AscendingOrder):
|
||||||
|
if col >= len(self.column_map) or col < 0:
|
||||||
|
return QTableView.sortByColumn(self, col)
|
||||||
|
field = self.column_map[col]
|
||||||
|
self.intelligent_sort(field, order == Qt.AscendingOrder)
|
||||||
|
|
||||||
|
def intelligent_sort(self, field, ascending):
|
||||||
|
m = self.model()
|
||||||
|
pname = 'previous_sort_order_' + self.__class__.__name__
|
||||||
|
previous = gprefs.get(pname, {})
|
||||||
|
if field == m.sorted_on[0] or field not in previous:
|
||||||
|
self.sort_by_named_field(field, ascending)
|
||||||
|
previous[field] = ascending
|
||||||
|
gprefs[pname] = previous
|
||||||
|
return
|
||||||
|
previous[m.sorted_on[0]] = m.sorted_on[1]
|
||||||
|
gprefs[pname] = previous
|
||||||
|
self.sort_by_named_field(field, previous[field])
|
||||||
|
|
||||||
def about_to_be_sorted(self, idc):
|
def about_to_be_sorted(self, idc):
|
||||||
selected_rows = [r.row() for r in self.selectionModel().selectedRows()]
|
selected_rows = [r.row() for r in self.selectionModel().selectedRows()]
|
||||||
self.selected_ids = [idc(r) for r in selected_rows]
|
self.selected_ids = [idc(r) for r in selected_rows]
|
||||||
@ -382,12 +408,12 @@ class BooksView(QTableView): # {{{
|
|||||||
def sort_by_named_field(self, field, order, reset=True):
|
def sort_by_named_field(self, field, order, reset=True):
|
||||||
if field in self.column_map:
|
if field in self.column_map:
|
||||||
idx = self.column_map.index(field)
|
idx = self.column_map.index(field)
|
||||||
if order:
|
self.sort_by_column_and_order(idx, order)
|
||||||
self.sortByColumn(idx, Qt.AscendingOrder)
|
|
||||||
else:
|
|
||||||
self.sortByColumn(idx, Qt.DescendingOrder)
|
|
||||||
else:
|
else:
|
||||||
self._model.sort_by_named_field(field, order, reset)
|
self._model.sort_by_named_field(field, order, reset)
|
||||||
|
self.column_header.blockSignals(True)
|
||||||
|
self.column_header.setSortIndicator(-1, Qt.AscendingOrder)
|
||||||
|
self.column_header.blockSignals(False)
|
||||||
|
|
||||||
def multisort(self, fields, reset=True, only_if_different=False):
|
def multisort(self, fields, reset=True, only_if_different=False):
|
||||||
if len(fields) == 0:
|
if len(fields) == 0:
|
||||||
@ -413,11 +439,11 @@ class BooksView(QTableView): # {{{
|
|||||||
dir = Qt.AscendingOrder if fields[0][1] else Qt.DescendingOrder
|
dir = Qt.AscendingOrder if fields[0][1] else Qt.DescendingOrder
|
||||||
if col in self.column_map:
|
if col in self.column_map:
|
||||||
col = self.column_map.index(col)
|
col = self.column_map.index(col)
|
||||||
hdrs = self.horizontalHeader()
|
self.column_header.blockSignals(True)
|
||||||
try:
|
try:
|
||||||
hdrs.setSortIndicator(col, dir)
|
self.column_header.setSortIndicator(col, dir)
|
||||||
except:
|
finally:
|
||||||
pass
|
self.column_header.blockSignals(False)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Ondevice column {{{
|
# Ondevice column {{{
|
||||||
@ -481,8 +507,7 @@ class BooksView(QTableView): # {{{
|
|||||||
return
|
return
|
||||||
for col, order in reversed(self.cleanup_sort_history(
|
for col, order in reversed(self.cleanup_sort_history(
|
||||||
saved_history)[:max_sort_levels]):
|
saved_history)[:max_sort_levels]):
|
||||||
self.sortByColumn(self.column_map.index(col),
|
self.sort_by_column_and_order(self.column_map.index(col), order)
|
||||||
Qt.AscendingOrder if order else Qt.DescendingOrder)
|
|
||||||
|
|
||||||
def apply_state(self, state, max_sort_levels=3):
|
def apply_state(self, state, max_sort_levels=3):
|
||||||
h = self.column_header
|
h = self.column_header
|
||||||
|
Loading…
x
Reference in New Issue
Block a user