From a8d120c1bb7807bb7bea67532ab8fdefd69f55ee Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 6 Jun 2010 14:29:38 +0100 Subject: [PATCH 1/2] Enhancement #5717: true and false for dates --- src/calibre/library/caches.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 83c56c5395..e2ecdd9f55 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -241,6 +241,24 @@ class ResultCache(SearchQueryParser): matches = set([]) if len(query) < 2: return matches + + if location == 'date': + location = 'timestamp' + loc = self.field_metadata[location]['rec_index'] + + if query == 'false': + for item in self._data: + if item is None: continue + if item[loc] is None or item[loc] == UNDEFINED_DATE: + matches.add(item[0]) + return matches + if query == 'true': + for item in self._data: + if item is None: continue + if item[loc] is not None and item[loc] != UNDEFINED_DATE: + matches.add(item[0]) + return matches + relop = None for k in self.date_search_relops.keys(): if query.startswith(k): @@ -249,10 +267,6 @@ class ResultCache(SearchQueryParser): if relop is None: (p, relop) = self.date_search_relops['='] - if location == 'date': - location = 'timestamp' - loc = self.field_metadata[location]['rec_index'] - if query == _('today'): qd = now() field_count = 3 @@ -301,7 +315,7 @@ class ResultCache(SearchQueryParser): if query == 'false': query = '0' elif query == 'true': - query = '>0' + query = '!=0' relop = None for k in self.numeric_search_relops.keys(): if query.startswith(k): From e7dae81f9b70fa1d4af07ede51cbbafbdd17e362 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 6 Jun 2010 18:28:25 +0100 Subject: [PATCH 2/2] Fix regressions (?) in tag searching --- src/calibre/gui2/search_box.py | 3 +++ src/calibre/gui2/tag_view.py | 33 +++++++++++++++------------------ src/calibre/gui2/ui.py | 1 - 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 74f60c76f8..4e9ccc2900 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -189,6 +189,9 @@ class SearchBox2(QComboBox): self.set_search_string(joiner.join(tags)) def set_search_string(self, txt): + if not txt: + self.clear_to_help() + return self.normalize_state() self.setEditText(txt) if self.timer is not None: # Turn off any timers that got started in setEditText diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 3a760a94c9..b1aecd9ba3 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -39,10 +39,12 @@ class TagsView(QTreeView): # {{{ def set_database(self, db, tag_match, popularity): self.hidden_categories = config['tag_browser_hidden_categories'] self._model = TagsModel(db, parent=self, - hidden_categories=self.hidden_categories) + hidden_categories=self.hidden_categories, + search_restriction=None) self.popularity = popularity self.tag_match = tag_match self.db = db + self.search_restriction = None self.setModel(self._model) self.setContextMenuPolicy(Qt.CustomContextMenu) self.clicked.connect(self.toggle) @@ -65,9 +67,11 @@ class TagsView(QTreeView): # {{{ # self.search_restriction_set() def set_search_restriction(self, s): - self.clear() - self.model().set_search_restriction(s) - self.recount() + if s: + self.search_restriction = s + else: + self.search_restriction = None + self.set_new_model() def mouseReleaseEvent(self, event): # Swallow everything except leftButton so context menus work correctly @@ -200,7 +204,8 @@ class TagsView(QTreeView): # {{{ # model. Reason: it is much easier than reconstructing the browser tree. def set_new_model(self): self._model = TagsModel(self.db, parent=self, - hidden_categories=self.hidden_categories) + hidden_categories=self.hidden_categories, + search_restriction=self.search_restriction) self.setModel(self._model) # }}} @@ -288,7 +293,7 @@ class TagTreeItem(object): # {{{ class TagsModel(QAbstractItemModel): # {{{ - def __init__(self, db, parent, hidden_categories=None): + def __init__(self, db, parent, hidden_categories=None, search_restriction=None): QAbstractItemModel.__init__(self, parent) # must do this here because 'QPixmap: Must construct a QApplication @@ -310,8 +315,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.db = db self.tags_view = parent self.hidden_categories = hidden_categories - self.search_restriction = '' - self.ignore_next_search = 0 + self.search_restriction = search_restriction # Reconstruct the user categories, putting them into metadata tb_cats = self.db.field_metadata @@ -347,8 +351,9 @@ class TagsModel(QAbstractItemModel): # {{{ self.row_map = [] self.categories = [] - if len(self.search_restriction): - data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map, + if self.search_restriction: + data = self.db.get_categories(sort_on_count=sort, + icon_map=self.category_icon_map, ids=self.db.search('', return_matches=True)) else: data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map) @@ -362,7 +367,6 @@ class TagsModel(QAbstractItemModel): # {{{ self.category_items[category] = set([tag.name for tag in data[category]]) self.row_map.append(category) self.categories.append(tb_categories[category]['name']) - return data def refresh(self): @@ -521,12 +525,6 @@ class TagsModel(QAbstractItemModel): # {{{ def clear_state(self): self.reset_all_states() - def reinit(self, *args, **kwargs): - if self.ignore_next_search == 0: - self.reset_all_states() - else: - self.ignore_next_search -= 1 - def toggle(self, index, exclusive): if not index.isValid(): return False item = index.internalPointer() @@ -534,7 +532,6 @@ class TagsModel(QAbstractItemModel): # {{{ item.toggle() if exclusive: self.reset_all_states(except_=item.tag) - self.ignore_next_search = 2 self.dataChanged.emit(index, index) return True return False diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 79ef4cfb2d..45ff005973 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -552,7 +552,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.tags_view.saved_search_edit.connect(self.do_saved_search_edit) self.tags_view.tag_item_renamed.connect(self.do_tag_item_renamed) self.tags_view.search_item_renamed.connect(self.saved_search.clear_to_help) - self.search.search.connect(self.tags_view.model().reinit) for x in (self.location_view.count_changed, self.tags_view.recount, self.restriction_count_changed): self.library_view.model().count_changed_signal.connect(x)