Auto search and check input before model search

- Search for current deck automatically on browser setup.
- Hide current deck and current card searches.
- Check user search input before passing it on to the model, so invalid
  searches don't change TableView.
This commit is contained in:
RumovZ 2021-01-30 10:51:31 +01:00
parent 80a4a85510
commit 9c4cc88b47

View file

@ -190,8 +190,7 @@ class DataModel(QAbstractTableModel):
ctx = SearchContext(search=txt, browser=self.browser) ctx = SearchContext(search=txt, browser=self.browser)
gui_hooks.browser_will_search(ctx) gui_hooks.browser_will_search(ctx)
if ctx.card_ids is None: if ctx.card_ids is None:
ctx.search = self.browser.normalize_search(ctx.search) ctx.card_ids = list(self.col.find_cards(ctx.search, order=ctx.order))
ctx.card_ids = self.col.find_cards(ctx.search, order=ctx.order)
gui_hooks.browser_did_search(ctx) gui_hooks.browser_did_search(ctx)
self.cards = ctx.card_ids self.cards = ctx.card_ids
except Exception as err: except Exception as err:
@ -610,12 +609,8 @@ class Browser(QMainWindow):
self.form.searchEdit.lineEdit().setPlaceholderText( self.form.searchEdit.lineEdit().setPlaceholderText(
tr(TR.BROWSING_SEARCH_BAR_HINT) tr(TR.BROWSING_SEARCH_BAR_HINT)
) )
self.form.searchEdit.addItems( self.form.searchEdit.addItems(self.mw.pm.profile["searchHistory"])
[self.col.build_search_string(SearchTerm(current_deck=True))] self.search_for(self.col.build_search_string(SearchTerm(current_deck=True)), "")
+ self.mw.pm.profile["searchHistory"]
)
self._onRowChanged(None, None)
self.form.searchEdit.lineEdit().selectAll()
self.form.searchEdit.setFocus() self.form.searchEdit.setFocus()
# search triggered by user # search triggered by user
@ -624,32 +619,32 @@ class Browser(QMainWindow):
def _onSearchActivated(self): def _onSearchActivated(self):
text = self.form.searchEdit.lineEdit().text() text = self.form.searchEdit.lineEdit().text()
if self.search_for(text): try:
# Only save successful searches. normed = self.col.build_search_string(text)
except InvalidInput as err:
show_invalid_search_error(err)
else:
self.search_for(normed)
self.update_history() self.update_history()
def search_for(self, search: str) -> bool: def search_for(self, search: str, prompt: Optional[str] = None) -> bool:
# keep track of search string so that we reuse identical search when # keep track of search string so that we reuse identical search when
# refreshing, rather than whatever is currently in the search field # refreshing, rather than whatever is currently in the search field
self._lastSearchTxt = search self._lastSearchTxt = search
self.form.searchEdit.lineEdit().setText(search) prompt = search if prompt == None else prompt
return self.search() self.form.searchEdit.lineEdit().setText(prompt)
self.search()
def search(self) -> bool: def search(self):
"""Search triggered programmatically. Caller must have saved note first. """Search triggered programmatically. Caller must have saved note first."""
Return bool indicating success.
"""
try: try:
self.model.search(self._lastSearchTxt) self.model.search(self._lastSearchTxt)
except InvalidInput as err: except Exception as err:
show_invalid_search_error(err) show_invalid_search_error(err)
return False
else:
if not self.model.cards: if not self.model.cards:
# no row change will fire # no row change will fire
self._onRowChanged(None, None) self._onRowChanged(None, None)
return True
def update_history(self) -> None: def update_history(self) -> None:
sh = self.mw.pm.profile["searchHistory"] sh = self.mw.pm.profile["searchHistory"]
@ -661,12 +656,6 @@ class Browser(QMainWindow):
self.form.searchEdit.addItems(sh) self.form.searchEdit.addItems(sh)
self.mw.pm.profile["searchHistory"] = sh self.mw.pm.profile["searchHistory"] = sh
def normalize_search(self, search: str) -> str:
normed = self.col.build_search_string(search)
self._lastSearchTxt = normed
self.form.searchEdit.lineEdit().setText(normed)
return normed
def updateTitle(self): def updateTitle(self):
selected = len(self.form.tableView.selectionModel().selectedRows()) selected = len(self.form.tableView.selectionModel().selectedRows())
cur = len(self.model.cards) cur = len(self.model.cards)
@ -680,14 +669,16 @@ class Browser(QMainWindow):
def show_single_card(self, card: Optional[Card]) -> None: def show_single_card(self, card: Optional[Card]) -> None:
nid = card and card.nid nid = card and card.nid
if nid: if nid:
def on_show_single_card():
self.card = card self.card = card
search = self.col.build_search_string(SearchTerm(nid=nid)) search = self.col.build_search_string(SearchTerm(nid=nid))
search = gui_hooks.default_search(search, card) search = gui_hooks.default_search(search, card)
self.form.searchEdit.lineEdit().setText(search) self.search_for(search, "")
self.onSearchActivated()
self.form.tableView.clearSelection()
self.focusCid(card.id) self.focusCid(card.id)
self.editor.saveNow(on_show_single_card)
def onReset(self): def onReset(self):
self.sidebar.refresh() self.sidebar.refresh()
self.editor.setNote(None) self.editor.setNote(None)
@ -1836,6 +1827,7 @@ where id in %s"""
row = self.model.cards.index(cid) row = self.model.cards.index(cid)
except: except:
return return
self.form.tableView.clearSelection()
self.form.tableView.selectRow(row) self.form.tableView.selectRow(row)