card dialog improvements

- clone current card instead of making empty one
- option to flip current card
- if opened from add screen, fill blank fields
This commit is contained in:
Damien Elmes 2012-04-24 08:03:15 +09:00
parent b5c562d552
commit 1cf1efa852
2 changed files with 46 additions and 6 deletions

View file

@ -208,7 +208,7 @@ class DataModel(QAbstractTableModel):
elif type == "template": elif type == "template":
t = c.template()['name'] t = c.template()['name']
if c.model()['type'] == MODEL_CLOZE: if c.model()['type'] == MODEL_CLOZE:
t += " (%d)" % (c.ord+1) t += " %d" % (c.ord+1)
return t return t
elif type == "cardDue": elif type == "cardDue":
return self.nextDue(c, index) return self.nextDue(c, index)

View file

@ -28,6 +28,12 @@ class CardLayout(QDialog):
self.addMode = addMode self.addMode = addMode
if addMode: if addMode:
# save it to DB temporarily # save it to DB temporarily
self.emptyFields = []
for name, val in note.items():
if val.strip():
continue
self.emptyFields.append(name)
note[name] = "(%s)" % name
note.flush() note.flush()
self.setupTabs() self.setupTabs()
self.setupButtons() self.setupButtons()
@ -133,6 +139,11 @@ Please create a new card type first."""))
l.addWidget(help) l.addWidget(help)
c(help, SIGNAL("clicked()"), self.onHelp) c(help, SIGNAL("clicked()"), self.onHelp)
l.addStretch() l.addStretch()
if self.model['type'] != MODEL_CLOZE:
flip = QPushButton(_("Flip Front/Back"))
flip.setAutoDefault(False)
l.addWidget(flip)
c(flip, SIGNAL("clicked()"), self.onFlip)
rename = QPushButton(_("Rename...")) rename = QPushButton(_("Rename..."))
rename.setAutoDefault(False) rename.setAutoDefault(False)
l.addWidget(rename) l.addWidget(rename)
@ -249,15 +260,41 @@ Please create a new card type first."""))
self.ord = pos self.ord = pos
self.redraw() self.redraw()
def _newCardName(self):
n = len(self.cards) + 1
while 1:
name = _("Card %d") % n
if name not in [c.template()['name'] for c in self.cards]:
break
n += 1
return name
def onAddCard(self): def onAddCard(self):
name = getOnlyText(_("Name:")) name = self._newCardName()
if not name:
return
if name in [c.template()['name'] for c in self.cards]:
return showWarning(_("That name is already used."))
t = self.mm.newTemplate(name) t = self.mm.newTemplate(name)
old = self.card.template()
t['qfmt'] = "%s<br>\n%s" % (_("Edit to customize"), old['qfmt'])
t['afmt'] = old['afmt']
self.mm.addTemplate(self.model, t) self.mm.addTemplate(self.model, t)
self.redraw() self.redraw()
self.selectCard(t['ord'])
def onFlip(self):
old = self.card.template()
self._flipQA(old, old)
self.redraw()
def _flipQA(self, src, dst):
m = re.match("(?s)(.+)<hr id=answer>(.+)", src['afmt'])
if not m:
showInfo(_("""\
Anki couldn't find the line between the question and answer. Please \
adjust the template manually to switch the question and answer."""))
return
dst['qfmt'] = m.group(2).strip()
dst['afmt'] = "%s\n\n<hr id=answer>\n\n%s" % (m.group(2).strip(),
m.group(1).strip())
return True
def onTargetDeck(self): def onTargetDeck(self):
from aqt.tagedit import TagEdit from aqt.tagedit import TagEdit
@ -296,6 +333,9 @@ Enter deck to place new %s cards in, or leave blank:""") %
def reject(self): def reject(self):
clearAudioQueue() clearAudioQueue()
if self.addMode: if self.addMode:
# remove the filler fields we added
for name in self.emptyFields:
self.note[name] = ""
self.mw.col.db.execute("delete from notes where id = ?", self.mw.col.db.execute("delete from notes where id = ?",
self.note.id) self.note.id)
self.mm.save(self.model, templates=True) self.mm.save(self.model, templates=True)