Sort button: Allow selecting which columns are in the popup sort menu. Fixes #1923724 [Enhancement Request: Tweak to hide specific columns from "sort by" dropdown](https://bugs.launchpad.net/calibre/+bug/1923724)

This commit is contained in:
Kovid Goyal 2021-04-27 10:54:04 +05:30
parent 28788b77a7
commit afa4433c2b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -5,12 +5,29 @@
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
from qt.core import QToolButton, QAction, pyqtSignal, QIcon from contextlib import suppress
from functools import partial
from qt.core import QAction, QIcon, QToolButton, pyqtSignal
from calibre.gui2.actions import InterfaceAction from calibre.gui2.actions import InterfaceAction
from calibre.utils.icu import sort_key from calibre.utils.icu import sort_key
from polyglot.builtins import iteritems from polyglot.builtins import iteritems
SORT_HIDDEN_PREF = 'sort-action-hidden-fields'
def change_hidden(key, visible):
from calibre.gui2.ui import get_gui
gui = get_gui()
if gui is not None:
db = gui.current_db.new_api
val = set(db.pref(SORT_HIDDEN_PREF) or ())
if visible:
val.discard(key)
else:
val.add(key)
db.set_pref(SORT_HIDDEN_PREF, tuple(val))
class SortAction(QAction): class SortAction(QAction):
@ -64,7 +81,11 @@ class SortByAction(InterfaceAction):
def update_menu(self, menu=None): def update_menu(self, menu=None):
menu = self.qaction.menu() if menu is None else menu menu = self.qaction.menu() if menu is None else menu
for action in menu.actions(): for action in menu.actions():
if hasattr(action, 'sort_requested'):
action.sort_requested.disconnect() action.sort_requested.disconnect()
with suppress(TypeError):
action.toggled.disconnect()
menu.clear() menu.clear()
lv = self.gui.library_view lv = self.gui.library_view
m = lv.model() m = lv.model()
@ -75,10 +96,24 @@ class SortByAction(InterfaceAction):
sort_col, order = 'date', True sort_col, order = 'date', True
fm = db.field_metadata fm = db.field_metadata
name_map = {v:k for k, v in iteritems(fm.ui_sortable_field_keys())} name_map = {v:k for k, v in iteritems(fm.ui_sortable_field_keys())}
for name in sorted(name_map, key=sort_key): hidden = frozenset(db.new_api.pref(SORT_HIDDEN_PREF, default=()) or ())
hidden_items_menu = menu.addMenu(_('Select sortable columns'))
menu.addSeparator()
all_names = sorted(name_map, key=sort_key)
for name in all_names:
key = name_map[name]
ac = hidden_items_menu.addAction(name)
ac.setCheckable(True)
ac.setChecked(key not in hidden)
ac.setObjectName(key)
ac.toggled.connect(partial(change_hidden, key))
for name in all_names:
key = name_map[name] key = name_map[name]
if key == 'ondevice' and self.gui.device_connected is None: if key == 'ondevice' and self.gui.device_connected is None:
continue continue
if key in hidden:
continue
ascending = None ascending = None
if key == sort_col: if key == sort_col:
name = _('%s [reverse current sort]') % name name = _('%s [reverse current sort]') % name