From faf4eddf8a1ee30b27bd46c1ee5d7bf94ebeda8c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 13 Apr 2011 16:47:16 +0100 Subject: [PATCH] Enhancement: arbitrary searches as search restrictions Bug fix: invalid search restrictions no longer break the tag browser --- src/calibre/gui2/search_box.py | 1 + src/calibre/gui2/search_restriction_mixin.py | 29 ++++++++++++++++---- src/calibre/gui2/tag_view.py | 13 ++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index ea7cab95d0..70324ffadc 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -443,6 +443,7 @@ class SavedSearchBoxMixin(object): # {{{ # rebuild the restrictions combobox using current saved searches self.search_restriction.clear() self.search_restriction.addItem('') + self.search_restriction.addItem(_('*Current search')) if recount: self.tags_view.recount() for s in p: diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index 74e448da6e..8ef02b34b0 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -29,13 +29,32 @@ class SearchRestrictionMixin(object): self.search_restriction.setCurrentIndex(r) self.apply_search_restriction(r) - def apply_search_restriction(self, i): - r = unicode(self.search_restriction.currentText()) - if r is not None and r != '': - restriction = 'search:"%s"'%(r) + def apply_text_search_restriction(self, search): + if not search: + self.search_restriction.setItemText(1, _('*Current search')) + self.search_restriction.setCurrentIndex(0) else: - restriction = '' + self.search_restriction.setCurrentIndex(1) + self.search_restriction.setItemText(1, search) + self._apply_search_restriction(search) + def apply_search_restriction(self, i): + self.search_restriction.setItemText(1, _('*Current search')) + if i == 1: + restriction = unicode(self.search.currentText()) + if not restriction: + self.search_restriction.setCurrentIndex(0) + else: + self.search_restriction.setItemText(1, restriction) + else: + r = unicode(self.search_restriction.currentText()) + if r is not None and r != '': + restriction = 'search:"%s"'%(r) + else: + restriction = '' + self._apply_search_restriction(restriction) + + def _apply_search_restriction(self, restriction): self.saved_search.clear() # The order below is important. Set the restriction, force a '' search # to apply it, reset the tag browser to take it into account, then set diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 83695b86c1..6ad6f053cb 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -86,6 +86,7 @@ class TagsView(QTreeView): # {{{ tag_item_renamed = pyqtSignal() search_item_renamed = pyqtSignal() drag_drop_finished = pyqtSignal(object) + restriction_error = pyqtSignal() def __init__(self, parent=None): QTreeView.__init__(self, parent=None) @@ -1117,9 +1118,13 @@ class TagsModel(QAbstractItemModel): # {{{ # Get the categories if self.search_restriction: - data = self.db.get_categories(sort=sort, + try: + data = self.db.get_categories(sort=sort, icon_map=self.category_icon_map, ids=self.db.search('', return_matches=True)) + except: + data = self.db.get_categories(sort=sort, icon_map=self.category_icon_map) + self.tags_view.restriction_error.emit() else: data = self.db.get_categories(sort=sort, icon_map=self.category_icon_map) @@ -1822,9 +1827,15 @@ class TagBrowserMixin(object): # {{{ self.tags_view.tag_item_renamed.connect(self.do_tag_item_renamed) self.tags_view.search_item_renamed.connect(self.saved_searches_changed) self.tags_view.drag_drop_finished.connect(self.drag_drop_finished) + self.tags_view.restriction_error.connect(self.do_restriction_error, + type=Qt.QueuedConnection) self.edit_categories.clicked.connect(lambda x: self.do_edit_user_categories()) + def do_restriction_error(self): + error_dialog(self.tags_view, _('Invalid search restriction'), + _('The current search restriction is invalid'), show=True) + def do_add_subcategory(self, on_category_key, new_category_name=None): ''' Add a subcategory to the category 'on_category'. If new_category_name is