From dbb5c414fc5c5b6428067069b68868141000f93b Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Tue, 8 Nov 2022 14:31:34 +0000 Subject: [PATCH] Make the saved searches menu honor whether searches is hierarchical or not. --- src/calibre/gui2/preferences/search.py | 10 +++++++ src/calibre/gui2/preferences/search.ui | 13 ++++++++++ src/calibre/gui2/search_box.py | 36 +++++++++++++++----------- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/calibre/gui2/preferences/search.py b/src/calibre/gui2/preferences/search.py index 295f586229..c270e54b78 100644 --- a/src/calibre/gui2/preferences/search.py +++ b/src/calibre/gui2/preferences/search.py @@ -33,6 +33,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r('limit_search_columns', prefs) r('use_primary_find_in_search', prefs) r('search_tool_bar_shows_text', gprefs) + ossm = self.opt_saved_search_menu_is_hierarchical + ossm.setChecked('search' in db.new_api.pref('categories_using_hierarchy', [])) + ossm.stateChanged.connect(self.changed_signal) r('case_sensitive', prefs) fl = db.field_metadata.get_search_terms() r('limit_search_columns_to', prefs, setting=CommaSeparatedList, choices=fl) @@ -234,6 +237,13 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): str(self.similar_series_search_key.currentText())) self.db.new_api.set_pref('similar_publisher_search_key', str(self.similar_publisher_search_key.currentText())) + + cats = set(self.db.new_api.pref('categories_using_hierarchy', [])) + if self.opt_saved_search_menu_is_hierarchical.isChecked(): + cats.add('search') + else: + cats.discard('search') + self.db.new_api.set_pref('categories_using_hierarchy', list(cats)) return ConfigWidgetBase.commit(self) def refresh_gui(self, gui): diff --git a/src/calibre/gui2/preferences/search.ui b/src/calibre/gui2/preferences/search.ui index ebc1957cc6..a646297174 100644 --- a/src/calibre/gui2/preferences/search.ui +++ b/src/calibre/gui2/preferences/search.ui @@ -147,6 +147,19 @@ + + + + Show saved searches as a hierarchy + + + <p>Hierarchical items are separated by periods. + Changing this box will also change the 'Saved Searches' box + in Preferences / Look & feel / Tag browser / + Hierarchy and searching</p> + + + diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 546b1f7eb2..7f26d8c0d0 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -443,23 +443,29 @@ class SavedSearchBoxMixin: # {{{ partial(self.do_saved_search_edit, None)) m.addSeparator() db = self.current_db + folder_icon = QIcon.ic('folder_saved_search.png') + search_icon = QIcon.ic('search.png') + use_hierarchy = 'search' in db.new_api.pref('categories_using_hierarchy', []) submenus = {} for name in sorted(db.saved_search_names(), key=lambda x: primary_sort_key(x.strip())): - components = tuple(n.strip() for n in name.split('.')) - hierarchy = components[:-1] - last = components[-1] - current_menu = m - # Walk the hierarchy, creating submenus as needed - for i,c in enumerate(hierarchy, start=1): - hierarchical_prefix = '.'.join(hierarchy[:i]) - if hierarchical_prefix not in submenus: - current_menu = current_menu.addMenu(c) - current_menu.setIcon(QIcon.ic('folder_saved_search.png')) - submenus[hierarchical_prefix] = current_menu - else: - current_menu = submenus[hierarchical_prefix] - ac = current_menu.addAction(last, partial(self.search.set_search_string, 'search:"='+name+'"')) - ac.setIcon(QIcon.ic('search.png')) + if use_hierarchy: + components = tuple(n.strip() for n in name.split('.')) + hierarchy = components[:-1] + last = components[-1] + current_menu = m + # Walk the hierarchy, creating submenus as needed + for i,c in enumerate(hierarchy, start=1): + hierarchical_prefix = '.'.join(hierarchy[:i]) + if hierarchical_prefix not in submenus: + current_menu = current_menu.addMenu(c) + current_menu.setIcon(folder_icon) + submenus[hierarchical_prefix] = current_menu + else: + current_menu = submenus[hierarchical_prefix] + ac = current_menu.addAction(last, partial(self.search.set_search_string, 'search:"='+name+'"')) + else: + ac = m.addAction(name, partial(self.search.set_search_string, 'search:"='+name+'"')) + ac.setIcon(search_icon) def saved_searches_changed(self, set_restriction=None, recount=True): self.build_search_restriction_list()