catch template errors, and start on discarding changes to fields/cards

This is only a first step - all the current methods that implicitly
save need to be updated.
This commit is contained in:
Damien Elmes 2020-04-26 12:34:25 +10:00
parent 8bde0d4ac1
commit 23586ffe90
3 changed files with 44 additions and 15 deletions

View file

@ -11,6 +11,7 @@ import aqt
from anki.cards import Card from anki.cards import Card
from anki.consts import * from anki.consts import *
from anki.lang import _, ngettext from anki.lang import _, ngettext
from anki.rsbackend import TemplateError
from anki.utils import isMac, isWin, joinFields from anki.utils import isMac, isWin, joinFields
from aqt import gui_hooks from aqt import gui_hooks
from aqt.qt import * from aqt.qt import *
@ -273,10 +274,15 @@ class CardLayout(QDialog):
l.addWidget(flip) l.addWidget(flip)
qconnect(flip.clicked, self.onFlip) qconnect(flip.clicked, self.onFlip)
l.addStretch() l.addStretch()
close = QPushButton(_("Close")) save = QPushButton(_("Save"))
save.setAutoDefault(False)
l.addWidget(save)
qconnect(save.clicked, self.accept)
close = QPushButton(_("Cancel"))
close.setAutoDefault(False) close.setAutoDefault(False)
l.addWidget(close) l.addWidget(close)
qconnect(close.clicked, self.accept) qconnect(close.clicked, self.reject)
# Cards # Cards
########################################################################## ##########################################################################
@ -596,23 +602,37 @@ Enter deck to place new %s cards in, or leave blank:"""
# Closing & Help # Closing & Help
###################################################################### ######################################################################
def accept(self): def accept(self) -> None:
self.reject() try:
self.mm.save(self.model)
except TemplateError as e:
# fixme: i18n
showWarning("Unable to save changes: " + str(e))
return
def reject(self): self.mw.reset()
self.cleanup()
return QDialog.accept(self)
def reject(self) -> None:
# discard mutations - in the future we should load a fresh
# copy at the start instead
self.mm._remove_from_cache(self.model["id"])
self.cleanup()
return QDialog.reject(self)
def cleanup(self) -> None:
self.cancelPreviewTimer() self.cancelPreviewTimer()
av_player.stop_and_clear_queue() av_player.stop_and_clear_queue()
# fixme
if self.addMode: if self.addMode:
# remove the filler fields we added # remove the filler fields we added
for name in self.emptyFields: for name in self.emptyFields:
self.note[name] = "" self.note[name] = ""
self.mw.col.db.execute("delete from notes where id = ?", self.note.id) self.mw.col.db.execute("delete from notes where id = ?", self.note.id)
self.mm.save(self.model, templates=True)
self.mw.reset()
saveGeom(self, "CardLayout") saveGeom(self, "CardLayout")
self.pform.frontWeb = None self.pform.frontWeb = None
self.pform.backWeb = None self.pform.backWeb = None
return QDialog.reject(self)
def onHelp(self): def onHelp(self):
openHelp("templates") openHelp("templates")

View file

@ -4,6 +4,7 @@
import aqt import aqt
from anki.consts import * from anki.consts import *
from anki.lang import _, ngettext from anki.lang import _, ngettext
from anki.rsbackend import TemplateError
from aqt.qt import * from aqt.qt import *
from aqt.utils import askUser, getOnlyText, openHelp, showWarning from aqt.utils import askUser, getOnlyText, openHelp, showWarning
@ -22,7 +23,8 @@ class FieldDialog(QDialog):
self.form.setupUi(self) self.form.setupUi(self)
self.setWindowTitle(_("Fields for %s") % self.model["name"]) self.setWindowTitle(_("Fields for %s") % self.model["name"])
self.form.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False) self.form.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False)
self.form.buttonBox.button(QDialogButtonBox.Close).setAutoDefault(False) self.form.buttonBox.button(QDialogButtonBox.Cancel).setAutoDefault(False)
self.form.buttonBox.button(QDialogButtonBox.Save).setAutoDefault(False)
self.currentIdx = None self.currentIdx = None
self.oldSortField = self.model["sortf"] self.oldSortField = self.model["sortf"]
self.fillFields() self.fillFields()
@ -167,17 +169,24 @@ class FieldDialog(QDialog):
fld["rtl"] = f.rtl.isChecked() fld["rtl"] = f.rtl.isChecked()
def reject(self): def reject(self):
self.mm._remove_from_cache(self.model["id"])
QDialog.reject(self)
def accept(self):
self.saveField() self.saveField()
if self.oldSortField != self.model["sortf"]: if self.oldSortField != self.model["sortf"]:
self.mw.progress.start() self.mw.progress.start()
self.mw.col.updateFieldCache(self.mm.nids(self.model)) self.mw.col.updateFieldCache(self.mm.nids(self.model))
self.mw.progress.finish() self.mw.progress.finish()
self.mm.save(self.model) try:
self.mw.reset() self.mm.save(self.model)
QDialog.reject(self) except TemplateError as e:
# fixme: i18n
showWarning("Unable to save changes: " + str(e))
return
def accept(self): self.mw.reset()
self.reject() QDialog.accept(self)
def onHelp(self): def onHelp(self):
openHelp("fields") openHelp("fields")

View file

@ -147,7 +147,7 @@
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="standardButtons"> <property name="standardButtons">
<set>QDialogButtonBox::Close|QDialogButtonBox::Help</set> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Save</set>
</property> </property>
</widget> </widget>
</item> </item>