Add true false for date searches and fix regressions in saved searches

This commit is contained in:
Kovid Goyal 2010-06-06 11:47:53 -06:00
commit ff2a0614c7
5 changed files with 40 additions and 24 deletions

View File

@ -12,6 +12,9 @@
- title: "Make the book details pane occupy the full lower part of the window" - title: "Make the book details pane occupy the full lower part of the window"
- title: "Add true and false searches for date based columns"
tickets: [5717]
bug fixes: bug fixes:
- title: "iPad driver: Various bug fixes." - title: "iPad driver: Various bug fixes."

View File

@ -189,6 +189,9 @@ class SearchBox2(QComboBox):
self.set_search_string(joiner.join(tags)) self.set_search_string(joiner.join(tags))
def set_search_string(self, txt): def set_search_string(self, txt):
if not txt:
self.clear_to_help()
return
self.normalize_state() self.normalize_state()
self.setEditText(txt) self.setEditText(txt)
if self.timer is not None: # Turn off any timers that got started in setEditText if self.timer is not None: # Turn off any timers that got started in setEditText

View File

@ -39,10 +39,12 @@ class TagsView(QTreeView): # {{{
def set_database(self, db, tag_match, popularity): def set_database(self, db, tag_match, popularity):
self.hidden_categories = config['tag_browser_hidden_categories'] self.hidden_categories = config['tag_browser_hidden_categories']
self._model = TagsModel(db, parent=self, self._model = TagsModel(db, parent=self,
hidden_categories=self.hidden_categories) hidden_categories=self.hidden_categories,
search_restriction=None)
self.popularity = popularity self.popularity = popularity
self.tag_match = tag_match self.tag_match = tag_match
self.db = db self.db = db
self.search_restriction = None
self.setModel(self._model) self.setModel(self._model)
self.setContextMenuPolicy(Qt.CustomContextMenu) self.setContextMenuPolicy(Qt.CustomContextMenu)
self.clicked.connect(self.toggle) self.clicked.connect(self.toggle)
@ -65,9 +67,11 @@ class TagsView(QTreeView): # {{{
# self.search_restriction_set() # self.search_restriction_set()
def set_search_restriction(self, s): def set_search_restriction(self, s):
self.clear() if s:
self.model().set_search_restriction(s) self.search_restriction = s
self.recount() else:
self.search_restriction = None
self.set_new_model()
def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
# Swallow everything except leftButton so context menus work correctly # 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. # model. Reason: it is much easier than reconstructing the browser tree.
def set_new_model(self): def set_new_model(self):
self._model = TagsModel(self.db, parent=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) self.setModel(self._model)
# }}} # }}}
@ -288,7 +293,7 @@ class TagTreeItem(object): # {{{
class TagsModel(QAbstractItemModel): # {{{ 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) QAbstractItemModel.__init__(self, parent)
# must do this here because 'QPixmap: Must construct a QApplication # must do this here because 'QPixmap: Must construct a QApplication
@ -310,8 +315,7 @@ class TagsModel(QAbstractItemModel): # {{{
self.db = db self.db = db
self.tags_view = parent self.tags_view = parent
self.hidden_categories = hidden_categories self.hidden_categories = hidden_categories
self.search_restriction = '' self.search_restriction = search_restriction
self.ignore_next_search = 0
# Reconstruct the user categories, putting them into metadata # Reconstruct the user categories, putting them into metadata
tb_cats = self.db.field_metadata tb_cats = self.db.field_metadata
@ -347,8 +351,9 @@ class TagsModel(QAbstractItemModel): # {{{
self.row_map = [] self.row_map = []
self.categories = [] self.categories = []
if len(self.search_restriction): if self.search_restriction:
data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map, data = self.db.get_categories(sort_on_count=sort,
icon_map=self.category_icon_map,
ids=self.db.search('', return_matches=True)) ids=self.db.search('', return_matches=True))
else: else:
data = self.db.get_categories(sort_on_count=sort, icon_map=self.category_icon_map) 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.category_items[category] = set([tag.name for tag in data[category]])
self.row_map.append(category) self.row_map.append(category)
self.categories.append(tb_categories[category]['name']) self.categories.append(tb_categories[category]['name'])
return data return data
def refresh(self): def refresh(self):
@ -521,12 +525,6 @@ class TagsModel(QAbstractItemModel): # {{{
def clear_state(self): def clear_state(self):
self.reset_all_states() 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): def toggle(self, index, exclusive):
if not index.isValid(): return False if not index.isValid(): return False
item = index.internalPointer() item = index.internalPointer()
@ -534,7 +532,6 @@ class TagsModel(QAbstractItemModel): # {{{
item.toggle() item.toggle()
if exclusive: if exclusive:
self.reset_all_states(except_=item.tag) self.reset_all_states(except_=item.tag)
self.ignore_next_search = 2
self.dataChanged.emit(index, index) self.dataChanged.emit(index, index)
return True return True
return False return False

View File

@ -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.saved_search_edit.connect(self.do_saved_search_edit)
self.tags_view.tag_item_renamed.connect(self.do_tag_item_renamed) 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.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, for x in (self.location_view.count_changed, self.tags_view.recount,
self.restriction_count_changed): self.restriction_count_changed):
self.library_view.model().count_changed_signal.connect(x) self.library_view.model().count_changed_signal.connect(x)

View File

@ -241,6 +241,24 @@ class ResultCache(SearchQueryParser):
matches = set([]) matches = set([])
if len(query) < 2: if len(query) < 2:
return matches 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 relop = None
for k in self.date_search_relops.keys(): for k in self.date_search_relops.keys():
if query.startswith(k): if query.startswith(k):
@ -249,10 +267,6 @@ class ResultCache(SearchQueryParser):
if relop is None: if relop is None:
(p, relop) = self.date_search_relops['='] (p, relop) = self.date_search_relops['=']
if location == 'date':
location = 'timestamp'
loc = self.field_metadata[location]['rec_index']
if query == _('today'): if query == _('today'):
qd = now() qd = now()
field_count = 3 field_count = 3
@ -301,7 +315,7 @@ class ResultCache(SearchQueryParser):
if query == 'false': if query == 'false':
query = '0' query = '0'
elif query == 'true': elif query == 'true':
query = '>0' query = '!=0'
relop = None relop = None
for k in self.numeric_search_relops.keys(): for k in self.numeric_search_relops.keys():
if query.startswith(k): if query.startswith(k):