Bug 2063171: still another ampersand escape bug

Also fixed a similar problem in the virtual library additional restrictions menu.
This commit is contained in:
Charles Haley 2024-04-23 13:19:03 +01:00
parent d1bbe63eb1
commit 94d17acbde
2 changed files with 13 additions and 9 deletions

View File

@ -452,6 +452,7 @@ class SavedSearchBoxMixin: # {{{
use_hierarchy = 'search' in db.new_api.pref('categories_using_hierarchy', []) use_hierarchy = 'search' in db.new_api.pref('categories_using_hierarchy', [])
submenus = {} submenus = {}
for name in sorted(db.saved_search_names(), key=lambda x: primary_sort_key(x.strip())): for name in sorted(db.saved_search_names(), key=lambda x: primary_sort_key(x.strip())):
display_name = name.replace('&', '&&')
current_menu = menu current_menu = menu
if use_hierarchy: if use_hierarchy:
components = tuple(n.strip() for n in name.split('.')) components = tuple(n.strip() for n in name.split('.'))
@ -461,14 +462,16 @@ class SavedSearchBoxMixin: # {{{
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])
if hierarchical_prefix not in submenus: if hierarchical_prefix not in submenus:
current_menu = current_menu.addMenu(c) current_menu = current_menu.addMenu(c.replace('&', '&&'))
current_menu.setIcon(folder_icon) current_menu.setIcon(folder_icon)
submenus[hierarchical_prefix] = current_menu submenus[hierarchical_prefix] = current_menu
else: else:
current_menu = submenus[hierarchical_prefix] current_menu = submenus[hierarchical_prefix]
ac = add_action(current_menu, name, last, partial(self.search.set_search_string, 'search:"='+name+'"')) ac = add_action(current_menu, display_name, last.replace('&', '&&'),
partial(self.search.set_search_string, 'search:"='+name+'"'))
else: else:
ac = add_action(current_menu, name, name, partial(self.search.set_search_string, 'search:"='+name+'"')) ac = add_action(current_menu, display_name, display_name,
partial(self.search.set_search_string, 'search:"='+name+'"'))
if ac.icon().isNull(): if ac.icon().isNull():
ac.setIcon(search_icon) ac.setIcon(search_icon)

View File

@ -590,14 +590,16 @@ class SearchRestrictionMixin:
dex = 0 dex = 0
def add_action(current_menu, name, last): def add_action(current_menu, name, last):
nonlocal dex nonlocal dex
def compare_fix_amps(name1, name2):
return (self._trim_restriction_name(name1).replace('&&', '&') ==
self._trim_restriction_name(name2).replace('&&', '&'))
self.search_restriction.addItem(name) self.search_restriction.addItem(name)
txt = self._trim_restriction_name(last) txt = self._trim_restriction_name(last)
if self._trim_restriction_name(name) == self._trim_restriction_name(current_restriction): if compare_fix_amps(name, current_restriction):
a = current_menu.addAction(self.checked, txt if txt else self.no_restriction) a = current_menu.addAction(self.checked, txt if txt else self.no_restriction)
else: else:
a = current_menu.addAction(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=dex))
action=a, index=dex))
dex += 1 dex += 1
return a return a
@ -649,10 +651,9 @@ class SearchRestrictionMixin:
if i == 1: if i == 1:
self.apply_text_search_restriction(str(self.search.currentText())) self.apply_text_search_restriction(str(self.search.currentText()))
elif i == 2 and str(self.search_restriction.currentText()).startswith('*'): elif i == 2 and str(self.search_restriction.currentText()).startswith('*'):
self.apply_text_search_restriction( self.apply_text_search_restriction(str(self.search_restriction.currentText())[1:])
str(self.search_restriction.currentText())[1:])
else: else:
r = str(self.search_restriction.currentText()) r = str(self.search_restriction.currentText()).replace('&&', '&')
if r is not None and r != '': if r is not None and r != '':
restriction = 'search:"%s"'%(r) restriction = 'search:"%s"'%(r)
else: else: