mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
find & replace
This commit is contained in:
parent
139048ad3f
commit
3855183213
4 changed files with 84 additions and 72 deletions
|
@ -116,6 +116,7 @@ class DeckModel(QAbstractTableModel):
|
||||||
|
|
||||||
def beginReset(self):
|
def beginReset(self):
|
||||||
self.browser.editor.saveNow()
|
self.browser.editor.saveNow()
|
||||||
|
self.browser.editor.setFact(None, hide=False)
|
||||||
self.browser.mw.progress.start()
|
self.browser.mw.progress.start()
|
||||||
self.saveSelection()
|
self.saveSelection()
|
||||||
self.beginResetModel()
|
self.beginResetModel()
|
||||||
|
@ -740,6 +741,7 @@ where id in %s""" % ids2str(sf))
|
||||||
ChangeModel(self, fids)
|
ChangeModel(self, fids)
|
||||||
|
|
||||||
def cram(self):
|
def cram(self):
|
||||||
|
return showInfo("not yet implemented")
|
||||||
self.close()
|
self.close()
|
||||||
self.mw.onCram(self.selectedCards())
|
self.mw.onCram(self.selectedCards())
|
||||||
|
|
||||||
|
@ -822,6 +824,7 @@ where id in %s""" % ids2str(sf))
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
def reschedule(self):
|
def reschedule(self):
|
||||||
|
return showInfo("not yet implemented")
|
||||||
n = _("Reschedule")
|
n = _("Reschedule")
|
||||||
d = QDialog(self)
|
d = QDialog(self)
|
||||||
frm = aqt.forms.reschedule.Ui_Dialog()
|
frm = aqt.forms.reschedule.Ui_Dialog()
|
||||||
|
@ -911,52 +914,46 @@ where id in %s""" % ids2str(sf))
|
||||||
sf = self.selectedFacts()
|
sf = self.selectedFacts()
|
||||||
if not sf:
|
if not sf:
|
||||||
return
|
return
|
||||||
mods = self.deck.db.column0("""
|
import anki.find
|
||||||
select distinct modelId from facts
|
fields = sorted(anki.find.fieldNames(self.deck, downcase=False))
|
||||||
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
|
|
||||||
d = QDialog(self)
|
d = QDialog(self)
|
||||||
frm = aqt.forms.findreplace.Ui_Dialog()
|
frm = aqt.forms.findreplace.Ui_Dialog()
|
||||||
frm.setupUi(d)
|
frm.setupUi(d)
|
||||||
fields = sorted(self.card.fact.model.fieldModels, key=attrgetter("name"))
|
frm.field.addItems(QStringList([_("All Fields")] + fields))
|
||||||
frm.field.addItems(QStringList(
|
|
||||||
[_("All Fields")] + [f.name for f in fields]))
|
|
||||||
self.connect(frm.buttonBox, SIGNAL("helpRequested()"),
|
self.connect(frm.buttonBox, SIGNAL("helpRequested()"),
|
||||||
self.onFindReplaceHelp)
|
self.onFindReplaceHelp)
|
||||||
if not d.exec_():
|
if not d.exec_():
|
||||||
return
|
return
|
||||||
n = _("Find and Replace")
|
|
||||||
self.deck.startProgress(2)
|
|
||||||
self.deck.updateProgress(_("Replacing..."))
|
|
||||||
self.deck.setUndoStart(n)
|
|
||||||
self.deck.updateProgress()
|
|
||||||
changed = None
|
|
||||||
try:
|
|
||||||
if frm.field.currentIndex() == 0:
|
if frm.field.currentIndex() == 0:
|
||||||
field = None
|
field = None
|
||||||
else:
|
else:
|
||||||
field = fields[frm.field.currentIndex()-1].id
|
field = fields[frm.field.currentIndex()-1]
|
||||||
|
self.mw.checkpoint(_("Find and Replace"))
|
||||||
|
self.mw.progress.start()
|
||||||
|
self.model.beginReset()
|
||||||
|
try:
|
||||||
changed = self.deck.findReplace(sf,
|
changed = self.deck.findReplace(sf,
|
||||||
unicode(frm.find.text()),
|
unicode(frm.find.text()),
|
||||||
unicode(frm.replace.text()),
|
unicode(frm.replace.text()),
|
||||||
frm.re.isChecked(),
|
frm.re.isChecked(),
|
||||||
field)
|
field,
|
||||||
|
frm.ignoreCase.isChecked())
|
||||||
except sre_constants.error:
|
except sre_constants.error:
|
||||||
ui.utils.showInfo(_("Invalid regular expression."),
|
ui.utils.showInfo(_("Invalid regular expression."),
|
||||||
parent=self)
|
parent=self)
|
||||||
self.deck.setUndoEnd(n)
|
return
|
||||||
self.deck.finishProgress()
|
else:
|
||||||
self.mw.reset()
|
|
||||||
self.onSearch()
|
self.onSearch()
|
||||||
if changed is not None:
|
self.resetDeck()
|
||||||
ui.utils.showInfo(ngettext("%(a)d of %(b)d fact updated", "%(a)d of %(b)d facts updated", len(sf)) % {
|
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,
|
'a': changed,
|
||||||
'b': len(sf),
|
'b': len(sf),
|
||||||
}, parent=self)
|
})
|
||||||
|
|
||||||
def onFindReplaceHelp(self):
|
def onFindReplaceHelp(self):
|
||||||
aqt.openHelp("Browser#FindReplace")
|
aqt.openHelp("Browser#FindReplace")
|
||||||
|
|
|
@ -350,7 +350,7 @@ class Editor(object):
|
||||||
if self.fact:
|
if self.fact:
|
||||||
self.loadFact()
|
self.loadFact()
|
||||||
|
|
||||||
def setFact(self, fact):
|
def setFact(self, fact, hide=True):
|
||||||
"Make FACT the current fact."
|
"Make FACT the current fact."
|
||||||
self.fact = fact
|
self.fact = fact
|
||||||
# change timer
|
# change timer
|
||||||
|
@ -359,7 +359,7 @@ class Editor(object):
|
||||||
loadCB=self._loadFinished)
|
loadCB=self._loadFinished)
|
||||||
self.updateTagsAndGroup()
|
self.updateTagsAndGroup()
|
||||||
self.updateKeyboard()
|
self.updateKeyboard()
|
||||||
else:
|
elif hide:
|
||||||
self.widget.hide()
|
self.widget.hide()
|
||||||
|
|
||||||
def loadFact(self, field=0):
|
def loadFact(self, field=0):
|
||||||
|
|
|
@ -457,6 +457,9 @@
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Find and Re&place...</string>
|
<string>Find and Re&place...</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Ctrl+Alt+F</string>
|
||||||
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionCram">
|
<action name="actionCram">
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>Dialog</class>
|
<class>Dialog</class>
|
||||||
<widget class="QDialog" name="Dialog">
|
<widget class="QDialog" name="Dialog">
|
||||||
|
@ -5,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>322</width>
|
<width>367</width>
|
||||||
<height>159</height>
|
<height>209</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -18,40 +19,50 @@
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><b>Find</b>:</string>
|
<string><b>Find</b>:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QLineEdit" name="find"/>
|
<widget class="QLineEdit" name="find"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" >
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><b>Replace With</b>:</string>
|
<string><b>Replace With</b>:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="replace"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string><b>In</b>:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLineEdit" name="replace" />
|
<widget class="QComboBox" name="field"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1" >
|
<item row="4" column="1">
|
||||||
<widget class="QCheckBox" name="re">
|
<widget class="QCheckBox" name="re">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Treat input as regular expression</string>
|
<string>Treat input as regular expression</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0" >
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_3" >
|
<widget class="QCheckBox" name="ignoreCase">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><b>In</b>:</string>
|
<string>Ignore case</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1" >
|
|
||||||
<widget class="QComboBox" name="field" />
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -81,8 +92,9 @@
|
||||||
</widget>
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>find</tabstop>
|
<tabstop>find</tabstop>
|
||||||
<tabstop>field</tabstop>
|
|
||||||
<tabstop>replace</tabstop>
|
<tabstop>replace</tabstop>
|
||||||
|
<tabstop>field</tabstop>
|
||||||
|
<tabstop>ignoreCase</tabstop>
|
||||||
<tabstop>re</tabstop>
|
<tabstop>re</tabstop>
|
||||||
<tabstop>buttonBox</tabstop>
|
<tabstop>buttonBox</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
|
|
Loading…
Reference in a new issue