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()