mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Enhancement #2006979: Hierarchical search menu in Additional Restrictions
This commit is contained in:
parent
c2acef80f6
commit
8d5840afc6
@ -439,17 +439,12 @@ class SavedSearchBoxMixin: # {{{
|
|||||||
def init_saved_seach_box_mixin(self):
|
def init_saved_seach_box_mixin(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def populate_add_saved_search_menu(self, to_menu):
|
def add_saved_searches_to_menu(self, menu, db, add_action_func=None):
|
||||||
m = to_menu
|
def add_action(current_menu, whole_name, last_component, func=None):
|
||||||
m.clear()
|
if add_action_func is None:
|
||||||
m.clear()
|
return current_menu.addAction(last_component, func)
|
||||||
m.addAction(QIcon.ic('search_add_saved.png'), _('Add Saved search'), self.add_saved_search)
|
return add_action_func(current_menu, whole_name, last_component)
|
||||||
m.addAction(QIcon.ic('search_copy_saved.png'), _('Get Saved search expression'),
|
|
||||||
self.get_saved_search_text)
|
|
||||||
m.addAction(QIcon.ic('folder_saved_search.png'), _('Manage Saved searches'),
|
|
||||||
partial(self.do_saved_search_edit, None))
|
|
||||||
m.addSeparator()
|
|
||||||
db = self.current_db
|
|
||||||
folder_icon = QIcon.ic('folder_saved_search.png')
|
folder_icon = QIcon.ic('folder_saved_search.png')
|
||||||
search_icon = QIcon.ic('search.png')
|
search_icon = QIcon.ic('search.png')
|
||||||
use_hierarchy = 'search' in db.new_api.pref('categories_using_hierarchy', [])
|
use_hierarchy = 'search' in db.new_api.pref('categories_using_hierarchy', [])
|
||||||
@ -459,7 +454,7 @@ class SavedSearchBoxMixin: # {{{
|
|||||||
components = tuple(n.strip() for n in name.split('.'))
|
components = tuple(n.strip() for n in name.split('.'))
|
||||||
hierarchy = components[:-1]
|
hierarchy = components[:-1]
|
||||||
last = components[-1]
|
last = components[-1]
|
||||||
current_menu = m
|
current_menu = menu
|
||||||
# Walk the hierarchy, creating submenus as needed
|
# Walk the hierarchy, creating submenus as needed
|
||||||
for i,c in enumerate(hierarchy, start=1):
|
for i,c in enumerate(hierarchy, start=1):
|
||||||
hierarchical_prefix = '.'.join(hierarchy[:i])
|
hierarchical_prefix = '.'.join(hierarchy[:i])
|
||||||
@ -469,10 +464,22 @@ class SavedSearchBoxMixin: # {{{
|
|||||||
submenus[hierarchical_prefix] = current_menu
|
submenus[hierarchical_prefix] = current_menu
|
||||||
else:
|
else:
|
||||||
current_menu = submenus[hierarchical_prefix]
|
current_menu = submenus[hierarchical_prefix]
|
||||||
ac = current_menu.addAction(last, partial(self.search.set_search_string, 'search:"='+name+'"'))
|
ac = add_action(current_menu, name, last, partial(self.search.set_search_string, 'search:"='+name+'"'))
|
||||||
else:
|
else:
|
||||||
ac = m.addAction(name, partial(self.search.set_search_string, 'search:"='+name+'"'))
|
ac = add_action(current_menu, name, name, partial(self.search.set_search_string, 'search:"='+name+'"'))
|
||||||
ac.setIcon(search_icon)
|
if ac.icon().isNull():
|
||||||
|
ac.setIcon(search_icon)
|
||||||
|
|
||||||
|
def populate_add_saved_search_menu(self, to_menu):
|
||||||
|
m = to_menu
|
||||||
|
m.clear()
|
||||||
|
m.addAction(QIcon.ic('search_add_saved.png'), _('Add Saved search'), self.add_saved_search)
|
||||||
|
m.addAction(QIcon.ic('search_copy_saved.png'), _('Get Saved search expression'),
|
||||||
|
self.get_saved_search_text)
|
||||||
|
m.addAction(QIcon.ic('folder_saved_search.png'), _('Manage Saved searches'),
|
||||||
|
partial(self.do_saved_search_edit, None))
|
||||||
|
m.addSeparator()
|
||||||
|
self.add_saved_searches_to_menu(m, self.current_db)
|
||||||
|
|
||||||
def saved_searches_changed(self, set_restriction=None, recount=True):
|
def saved_searches_changed(self, set_restriction=None, recount=True):
|
||||||
self.build_search_restriction_list()
|
self.build_search_restriction_list()
|
||||||
|
@ -547,7 +547,6 @@ class SearchRestrictionMixin:
|
|||||||
|
|
||||||
def build_search_restriction_list(self):
|
def build_search_restriction_list(self):
|
||||||
self.search_restriction_list_built = True
|
self.search_restriction_list_built = True
|
||||||
from calibre.gui2.ui import get_gui
|
|
||||||
m = self.ar_menu
|
m = self.ar_menu
|
||||||
m.clear()
|
m.clear()
|
||||||
|
|
||||||
@ -562,26 +561,25 @@ class SearchRestrictionMixin:
|
|||||||
current_restriction = self.library_view.model().db.data.get_search_restriction_name()
|
current_restriction = self.library_view.model().db.data.get_search_restriction_name()
|
||||||
m.setIcon(self.checked if current_restriction else self.empty)
|
m.setIcon(self.checked if current_restriction else self.empty)
|
||||||
|
|
||||||
def add_action(txt, index):
|
dex = 0
|
||||||
self.search_restriction.addItem(txt)
|
def add_action(current_menu, name, last):
|
||||||
txt = self._trim_restriction_name(txt)
|
nonlocal dex
|
||||||
if txt == current_restriction:
|
self.search_restriction.addItem(name)
|
||||||
a = m.addAction(self.checked, txt if txt else self.no_restriction)
|
txt = self._trim_restriction_name(last)
|
||||||
|
if name == current_restriction:
|
||||||
|
a = current_menu.addAction(self.checked, txt if txt else self.no_restriction)
|
||||||
else:
|
else:
|
||||||
a = m.addAction(self.empty, txt if txt else self.no_restriction)
|
a = current_menu.addAction(txt if txt else self.no_restriction)
|
||||||
a.triggered.connect(partial(self.search_restriction_triggered,
|
a.triggered.connect(partial(self.search_restriction_triggered,
|
||||||
action=a, index=index))
|
action=a, index=dex))
|
||||||
|
dex += 1
|
||||||
|
return a
|
||||||
|
|
||||||
add_action('', 0)
|
add_action(m, '', '')
|
||||||
add_action(_('*current search'), 1)
|
add_action(m, _('*current search'), _('*current search'))
|
||||||
dex = 2
|
|
||||||
if current_restriction_text:
|
if current_restriction_text:
|
||||||
add_action(current_restriction_text, 2)
|
add_action(m, current_restriction_text)
|
||||||
dex += 1
|
self.add_saved_searches_to_menu(m, self.library_view.model().db, add_action)
|
||||||
|
|
||||||
for n in sorted(get_gui().current_db.saved_search_names(), key=sort_key):
|
|
||||||
add_action(n, dex)
|
|
||||||
dex += 1
|
|
||||||
|
|
||||||
def search_restriction_triggered(self, action=None, index=None):
|
def search_restriction_triggered(self, action=None, index=None):
|
||||||
self.search_restriction.setCurrentIndex(index)
|
self.search_restriction.setCurrentIndex(index)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user