diff --git a/aqt/browser.py b/aqt/browser.py
index 6a13ff32b..c39cdf2e8 100644
--- a/aqt/browser.py
+++ b/aqt/browser.py
@@ -116,6 +116,7 @@ class DeckModel(QAbstractTableModel):
def beginReset(self):
self.browser.editor.saveNow()
+ self.browser.editor.setFact(None, hide=False)
self.browser.mw.progress.start()
self.saveSelection()
self.beginResetModel()
@@ -740,6 +741,7 @@ where id in %s""" % ids2str(sf))
ChangeModel(self, fids)
def cram(self):
+ return showInfo("not yet implemented")
self.close()
self.mw.onCram(self.selectedCards())
@@ -822,6 +824,7 @@ where id in %s""" % ids2str(sf))
######################################################################
def reschedule(self):
+ return showInfo("not yet implemented")
n = _("Reschedule")
d = QDialog(self)
frm = aqt.forms.reschedule.Ui_Dialog()
@@ -911,52 +914,46 @@ where id in %s""" % ids2str(sf))
sf = self.selectedFacts()
if not sf:
return
- mods = self.deck.db.column0("""
-select distinct modelId from facts
-where id in %s""" % ids2str(sf))
- if not len(mods) == 1:
- ui.utils.showInfo(
- _("Can only operate on one model at a time."),
- parent=self)
- return
+ import anki.find
+ fields = sorted(anki.find.fieldNames(self.deck, downcase=False))
d = QDialog(self)
frm = aqt.forms.findreplace.Ui_Dialog()
frm.setupUi(d)
- fields = sorted(self.card.fact.model.fieldModels, key=attrgetter("name"))
- frm.field.addItems(QStringList(
- [_("All Fields")] + [f.name for f in fields]))
+ frm.field.addItems(QStringList([_("All Fields")] + fields))
self.connect(frm.buttonBox, SIGNAL("helpRequested()"),
self.onFindReplaceHelp)
if not d.exec_():
return
- n = _("Find and Replace")
- self.deck.startProgress(2)
- self.deck.updateProgress(_("Replacing..."))
- self.deck.setUndoStart(n)
- self.deck.updateProgress()
- changed = None
+ if frm.field.currentIndex() == 0:
+ field = None
+ else:
+ field = fields[frm.field.currentIndex()-1]
+ self.mw.checkpoint(_("Find and Replace"))
+ self.mw.progress.start()
+ self.model.beginReset()
try:
- if frm.field.currentIndex() == 0:
- field = None
- else:
- field = fields[frm.field.currentIndex()-1].id
changed = self.deck.findReplace(sf,
unicode(frm.find.text()),
unicode(frm.replace.text()),
frm.re.isChecked(),
- field)
+ field,
+ frm.ignoreCase.isChecked())
except sre_constants.error:
ui.utils.showInfo(_("Invalid regular expression."),
parent=self)
- self.deck.setUndoEnd(n)
- self.deck.finishProgress()
- self.mw.reset()
- self.onSearch()
- if changed is not None:
- ui.utils.showInfo(ngettext("%(a)d of %(b)d fact updated", "%(a)d of %(b)d facts updated", len(sf)) % {
+ return
+ else:
+ self.onSearch()
+ self.resetDeck()
+ finally:
+ self.model.endReset()
+ self.mw.progress.finish()
+ showInfo(ngettext(
+ "%(a)d of %(b)d fact updated",
+ "%(a)d of %(b)d facts updated", len(sf)) % {
'a': changed,
'b': len(sf),
- }, parent=self)
+ })
def onFindReplaceHelp(self):
aqt.openHelp("Browser#FindReplace")
diff --git a/aqt/editor.py b/aqt/editor.py
index 459232326..edf8a4180 100644
--- a/aqt/editor.py
+++ b/aqt/editor.py
@@ -350,7 +350,7 @@ class Editor(object):
if self.fact:
self.loadFact()
- def setFact(self, fact):
+ def setFact(self, fact, hide=True):
"Make FACT the current fact."
self.fact = fact
# change timer
@@ -359,7 +359,7 @@ class Editor(object):
loadCB=self._loadFinished)
self.updateTagsAndGroup()
self.updateKeyboard()
- else:
+ elif hide:
self.widget.hide()
def loadFact(self, field=0):
diff --git a/designer/browser.ui b/designer/browser.ui
index 5213ed4dc..962cc4ba7 100644
--- a/designer/browser.ui
+++ b/designer/browser.ui
@@ -457,6 +457,9 @@
Find and Re&place...
+
+ Ctrl+Alt+F
+
diff --git a/designer/findreplace.ui b/designer/findreplace.ui
index d27b9d7cf..4b94cf51f 100644
--- a/designer/findreplace.ui
+++ b/designer/findreplace.ui
@@ -1,65 +1,76 @@
-
+
+
Dialog
-
-
+
+
0
0
- 322
- 159
+ 367
+ 209
-
+
Find and Replace
-
+
-
-
-
-
-
-
- <b>Find</b>:
+
+
-
+
+
+ <b>Find</b>:
- -
-
+
-
+
- -
-
-
- <b>Replace With</b>:
+
-
+
+
+ <b>Replace With</b>:
- -
-
+
-
+
- -
-
-
+
-
+
+
+ <b>In</b>:
+
+
+
+ -
+
+
+ -
+
+
Treat input as regular expression
- -
-
-
- <b>In</b>:
+
-
+
+
+ Ignore case
+
+
+ true
- -
-
-
-
-
-
+
+
Qt::Vertical
-
+
20
40
@@ -68,11 +79,11 @@
-
-
-
+
+
Qt::Horizontal
-
+
QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok
@@ -81,8 +92,9 @@
find
- field
replace
+ field
+ ignoreCase
re
buttonBox
@@ -94,11 +106,11 @@
Dialog
accept()
-
+
256
154
-
+
157
274
@@ -110,11 +122,11 @@
Dialog
reject()
-
+
290
154
-
+
286
274