From afa4433c2b5e614142c48fded50e413b6087dc6c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 27 Apr 2021 10:54:04 +0530 Subject: [PATCH] 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) --- src/calibre/gui2/actions/sort.py | 41 +++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/actions/sort.py b/src/calibre/gui2/actions/sort.py index f64263ae61..882ccbdc8b 100644 --- a/src/calibre/gui2/actions/sort.py +++ b/src/calibre/gui2/actions/sort.py @@ -5,12 +5,29 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -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.utils.icu import sort_key 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): @@ -64,7 +81,11 @@ class SortByAction(InterfaceAction): def update_menu(self, menu=None): menu = self.qaction.menu() if menu is None else menu for action in menu.actions(): - action.sort_requested.disconnect() + if hasattr(action, 'sort_requested'): + action.sort_requested.disconnect() + with suppress(TypeError): + action.toggled.disconnect() + menu.clear() lv = self.gui.library_view m = lv.model() @@ -75,10 +96,24 @@ class SortByAction(InterfaceAction): sort_col, order = 'date', True fm = db.field_metadata 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] if key == 'ondevice' and self.gui.device_connected is None: continue + if key in hidden: + continue ascending = None if key == sort_col: name = _('%s [reverse current sort]') % name