facts->notes

This commit is contained in:
Damien Elmes 2011-11-23 13:35:14 +09:00
parent be921563f0
commit 87da9f48b1
11 changed files with 194 additions and 195 deletions

View file

@ -6,7 +6,6 @@ from aqt.qt import *
import sys, re
import aqt.forms
import anki
from anki.facts import Fact
from anki.errors import *
from anki.utils import stripHTML
from aqt.utils import saveGeom, restoreGeom, showWarning, askUser, shortcut, \
@ -37,7 +36,7 @@ class AddCards(QDialog):
addHook('currentModelChanged', self.onReset)
self.mw.requireReset(modal=True)
self.open()
self.setupNewFact()
self.setupNewNote()
def setupEditor(self):
self.editor = aqt.editor.Editor(self.mw, self.form.fieldsArea, True)
@ -75,78 +74,78 @@ class AddCards(QDialog):
b.setEnabled(False)
self.historyButton = b
# FIXME: need to make sure to clean up fact on exit
def setupNewFact(self, set=True):
f = self.mw.deck.newFact()
# FIXME: need to make sure to clean up note on exit
def setupNewNote(self, set=True):
f = self.mw.deck.newNote()
f.tags = f.model()['tags']
if set:
self.editor.setFact(f)
self.editor.setNote(f)
return f
def onReset(self, model=None, keep=False):
oldFact = self.editor.fact
fact = self.setupNewFact(set=False)
flds = fact.model()['flds']
# copy fields from old fact
if oldFact:
oldNote = self.editor.note
note = self.setupNewNote(set=False)
flds = note.model()['flds']
# copy fields from old note
if oldNote:
if not keep:
self.removeTempFact(oldFact)
for n in range(len(fact.fields)):
self.removeTempNote(oldNote)
for n in range(len(note.fields)):
try:
if not keep or flds[n]['sticky']:
fact.fields[n] = oldFact.fields[n]
note.fields[n] = oldNote.fields[n]
else:
fact.fields[n] = ""
note.fields[n] = ""
except IndexError:
break
self.editor.setFact(fact)
self.editor.setNote(note)
def removeTempFact(self, fact):
if not fact or not fact.id:
def removeTempNote(self, note):
if not note or not note.id:
return
# we don't have to worry about cards; just the fact
self.mw.deck._remFacts([fact.id])
# we don't have to worry about cards; just the note
self.mw.deck._remNotes([note.id])
def addHistory(self, fact):
txt = stripHTMLMedia(",".join(fact.fields))[:30]
self.history.append((fact.id, txt))
def addHistory(self, note):
txt = stripHTMLMedia(",".join(note.fields))[:30]
self.history.append((note.id, txt))
self.history = self.history[-15:]
self.historyButton.setEnabled(True)
def onHistory(self):
m = QMenu(self)
for fid, txt in self.history:
for nid, txt in self.history:
a = m.addAction(_("Edit %s" % txt))
a.connect(a, SIGNAL("triggered()"),
lambda fid=fid: self.editHistory(fid))
lambda nid=nid: self.editHistory(nid))
m.exec_(self.historyButton.mapToGlobal(QPoint(0,0)))
def editHistory(self, fid):
def editHistory(self, nid):
browser = aqt.dialogs.open("Browser", self.mw)
browser.form.searchEdit.setText("fid:%d" % fid)
browser.form.searchEdit.setText("nid:%d" % nid)
browser.onSearch()
def addFact(self, fact):
if any(fact.problems()):
def addNote(self, note):
if any(note.problems()):
showWarning(_(
"Some fields are missing or not unique."),
help="AddItems#AddError")
return
cards = self.mw.deck.addFact(fact)
cards = self.mw.deck.addNote(note)
if not cards:
showWarning(_("""\
The input you have provided would make an empty
question or answer on all cards."""), help="AddItems")
return
self.addHistory(fact)
self.addHistory(note)
# FIXME: return to overview on add?
return fact
return note
def addCards(self):
self.editor.saveNow()
fact = self.editor.fact
fact = self.addFact(fact)
if not fact:
note = self.editor.note
note = self.addNote(note)
if not note:
return
tooltip("Added", period=500)
# stop anything playing
@ -168,8 +167,8 @@ question or answer on all cards."""), help="AddItems")
removeHook('reset', self.onReset)
removeHook('currentModelChanged', self.onReset)
clearAudioQueue()
self.removeTempFact(self.editor.fact)
self.editor.setFact(None)
self.removeTempNote(self.editor.note)
self.editor.setNote(None)
self.modelChooser.cleanup()
self.mw.maybeReset()
saveGeom(self, "add")

View file

@ -36,7 +36,7 @@ class DeckModel(QAbstractTableModel):
self.deck = browser.deck
self.sortKey = None
self.activeCols = self.deck.conf.get(
"activeCols", ["factFld", "template", "cardDue", "cardEase"])
"activeCols", ["noteFld", "template", "cardDue", "cardEase"])
self.cards = []
self.cardObjs = {}
@ -46,9 +46,9 @@ class DeckModel(QAbstractTableModel):
self.cardObjs[id] = self.deck.getCard(id)
return self.cardObjs[id]
def refreshFact(self, fact):
def refreshNote(self, note):
refresh = False
for c in fact.cards():
for c in note.cards():
if c.id in self.cardObjs:
del self.cardObjs[c.id]
refresh = True
@ -123,7 +123,7 @@ class DeckModel(QAbstractTableModel):
def beginReset(self):
self.browser.editor.saveNow()
self.browser.editor.setFact(None, hide=False)
self.browser.editor.setNote(None, hide=False)
self.browser.mw.progress.start()
self.saveSelection()
self.beginResetModel()
@ -192,7 +192,7 @@ class DeckModel(QAbstractTableModel):
except:
# debugging
print column, self.activeCols
return "factFld"
return "noteFld"
return type
def columnData(self, index):
@ -204,17 +204,17 @@ class DeckModel(QAbstractTableModel):
return self.question()
elif type == "answer":
return self.answer()
elif type == "factFld":
f = c.fact()
elif type == "noteFld":
f = c.note()
return self.formatQA(f.fields[self.deck.models.sortIdx(f.model())])
elif type == "template":
return c.template()['name']
elif type == "cardDue":
return self.nextDue(c, index)
elif type == "factCrt":
return time.strftime("%Y-%m-%d", time.localtime(c.fact().id/1000))
elif type == "factMod":
return time.strftime("%Y-%m-%d", time.localtime(c.fact().mod))
elif type == "noteCrt":
return time.strftime("%Y-%m-%d", time.localtime(c.note().id/1000))
elif type == "noteMod":
return time.strftime("%Y-%m-%d", time.localtime(c.note().mod))
elif type == "cardMod":
return time.strftime("%Y-%m-%d", time.localtime(c.mod))
elif type == "cardReps":
@ -231,8 +231,8 @@ class DeckModel(QAbstractTableModel):
return "%d%%" % (c.factor/10)
elif type == "cardGroup":
return self.browser.mw.deck.groups.name(c.gid)
elif type == "factGroup":
return self.browser.mw.deck.groups.name(c.fact().gid)
elif type == "noteGroup":
return self.browser.mw.deck.groups.name(c.note().gid)
def question(self):
return self.formatQA(c.a())
@ -280,7 +280,7 @@ class StatusDelegate(QItemDelegate):
painter.save()
painter.fillRect(option.rect, brush)
painter.restore()
elif c.fact().hasTag("Marked"):
elif c.note().hasTag("Marked"):
if index.row() % 2 == 0:
brush = QBrush(QColor(COLOUR_MARKED1))
else:
@ -355,14 +355,14 @@ class Browser(QMainWindow):
c(f.actionOptions, s, self.onOptions)
c(f.actionUndo, s, self.mw.onUndo)
c(f.actionInvertSelection, s, self.invertSelection)
c(f.actionSelectFacts, s, self.selectFacts)
c(f.actionSelectNotes, s, self.selectNotes)
c(f.actionFindReplace, s, self.onFindReplace)
c(f.actionFindDuplicates, s, self.onFindDupes)
# jumps
c(f.actionPreviousCard, s, self.onPreviousCard)
c(f.actionNextCard, s, self.onNextCard)
c(f.actionFind, s, self.onFind)
c(f.actionFact, s, self.onFact)
c(f.actionNote, s, self.onNote)
c(f.actionTags, s, self.onTags)
c(f.actionSort, s, self.onSort)
c(f.actionCardList, s, self.onCardList)
@ -381,7 +381,7 @@ class Browser(QMainWindow):
saveSplitter(self.form.splitter_2, "editor2")
saveSplitter(self.form.splitter_3, "editor3")
self.editor.saveNow()
self.editor.setFact(None)
self.editor.setNote(None)
saveGeom(self, "editor")
saveState(self, "editor")
saveHeader(self.form.tableView.horizontalHeader(), "editor")
@ -407,10 +407,10 @@ class Browser(QMainWindow):
('answer', _("Answer")),
('template', _("Card")),
('cardGroup', _("C.Group")),
('factGroup', _("I.Group")),
('factFld', _("Sort Field")),
('factCrt', _("Created")),
('factMod', _("Edited")),
('noteGroup', _("I.Group")),
('noteFld', _("Sort Field")),
('noteCrt', _("Created")),
('noteMod', _("Edited")),
('cardMod', _("Reviewed")),
('cardDue', _("Due")),
('cardIvl', _("Interval")),
@ -439,7 +439,7 @@ class Browser(QMainWindow):
self.form.searchEdit.setCompleter(self.searchComp)
def onSearch(self, reset=True):
"Careful: if reset is true, the current fact is saved."
"Careful: if reset is true, the current note is saved."
txt = unicode(self.form.searchEdit.text()).strip()
sh = self.mw.config['searchHistory']
if txt not in sh:
@ -471,7 +471,7 @@ class Browser(QMainWindow):
return selected
def onReset(self):
self.editor.setFact(None)
self.editor.setNote(None)
self.onSearch()
# Table view & editor
@ -494,21 +494,21 @@ class Browser(QMainWindow):
self.editor.stealFocus = False
def onRowChanged(self, current, previous):
"Update current fact and hide/show editor."
"Update current note and hide/show editor."
show = self.model.cards and self.updateTitle() == 1
self.form.splitter_2.widget(1).setShown(not not show)
if not show:
self.editor.setFact(None)
self.editor.setNote(None)
else:
self.card = self.model.getCard(
self.form.tableView.selectionModel().currentIndex())
self.editor.setFact(self.card.fact())
self.editor.setNote(self.card.note())
self.editor.card = self.card
self.showCardInfo(self.card)
self.updateToggles()
def refreshCurrentCard(self, fact):
self.model.refreshFact(fact)
def refreshCurrentCard(self, note):
self.model.refreshNote(note)
# Headers & sorting
######################################################################
@ -533,7 +533,7 @@ class Browser(QMainWindow):
def onSortChanged(self, idx, ord):
type = self.model.activeCols[idx]
noSort = ("question", "answer", "template", "cardGroup", "factGroup")
noSort = ("question", "answer", "template", "cardGroup", "noteGroup")
if type in noSort:
showInfo(_("Sorting on this column is not supported. Please "
"choose another."))
@ -541,7 +541,7 @@ class Browser(QMainWindow):
if self.deck.conf['sortType'] != type:
self.deck.conf['sortType'] = type
# default to descending for non-text fields
if type == "factFld":
if type == "noteFld":
ord = not ord
self.deck.conf['sortBackwards'] = ord
self.onSearch()
@ -592,7 +592,7 @@ class Browser(QMainWindow):
def setColumnSizes(self):
hh = self.form.tableView.horizontalHeader()
for c, i in enumerate(self.model.activeCols):
if i in ("question", "answer", "factFld"):
if i in ("question", "answer", "noteFld"):
hh.setResizeMode(c, QHeaderView.Stretch)
else:
hh.setResizeMode(c, QHeaderView.Interactive)
@ -809,24 +809,24 @@ class Browser(QMainWindow):
return [self.model.cards[idx.row()] for idx in
self.form.tableView.selectionModel().selectedRows()]
def selectedFacts(self):
def selectedNotes(self):
return self.deck.db.list("""
select distinct fid from cards
select distinct nid from cards
where id in %s""" % ids2str(
[self.model.cards[idx.row()] for idx in
self.form.tableView.selectionModel().selectedRows()]))
def selectedFactsAsCards(self):
def selectedNotesAsCards(self):
return self.deck.db.list(
"select id from cards where fid in (%s)" %
",".join([str(s) for s in self.selectedFacts()]))
"select id from cards where nid in (%s)" %
",".join([str(s) for s in self.selectedNotes()]))
def oneModelFacts(self):
sf = self.selectedFacts()
def oneModelNotes(self):
sf = self.selectedNotes()
if not sf:
return
mods = self.deck.db.scalar("""
select count(distinct mid) from facts
select count(distinct mid) from notes
where id in %s""" % ids2str(sf))
if mods > 1:
showInfo(_("Please select cards from only one model."))
@ -840,14 +840,14 @@ where id in %s""" % ids2str(sf))
######################################################################
def genCards(self):
fids = self.oneModelFacts()
if fids:
GenCards(self, fids)
nids = self.oneModelNotes()
if nids:
GenCards(self, nids)
def onChangeModel(self):
fids = self.oneModelFacts()
if fids:
ChangeModel(self, fids)
nids = self.oneModelNotes()
if nids:
ChangeModel(self, nids)
def cram(self):
return showInfo("not yet implemented")
@ -900,11 +900,11 @@ where id in %s""" % ids2str(sf))
self.selectedCards()), mod, gid)
if frm.setInitial.isChecked():
self.deck.db.execute(
"update facts set mod=?, gid=? where id in " + ids2str(
self.selectedFacts()), mod, gid)
"update notes set mod=?, gid=? where id in " + ids2str(
self.selectedNotes()), mod, gid)
else:
self.deck.db.execute("""
update cards set mod=?, gid=(select gid from facts where id = cards.fid)
update cards set mod=?, gid=(select gid from notes where id = cards.nid)
where id in %s""" % ids2str(self.selectedCards()), mod)
self.onSearch(reset=False)
self.mw.requireReset()
@ -929,7 +929,7 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
label = _("Add Tags")
if label:
self.mw.checkpoint(label)
func(self.selectedFacts(), tags)
func(self.selectedNotes(), tags)
self.onSearch(reset=False)
self.mw.requireReset()
self.model.endReset()
@ -962,7 +962,7 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
self.mw.requireReset()
def isMarked(self):
return not not (self.card and self.card.fact().hasTag("Marked"))
return not not (self.card and self.card.note().hasTag("Marked"))
def onMark(self, mark):
if mark:
@ -1023,9 +1023,9 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
# Edit: selection
######################################################################
def selectFacts(self):
fids = self.selectedFacts()
self.form.searchEdit.setText("fid:"+",".join([str(x) for x in fids]))
def selectNotes(self):
nids = self.selectedNotes()
self.form.searchEdit.setText("nid:"+",".join([str(x) for x in nids]))
# clear the selection so we don't waste energy preserving it
tv = self.form.tableView
tv.selectionModel().clear()
@ -1084,7 +1084,7 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
######################################################################
def onFindReplace(self):
sf = self.selectedFacts()
sf = self.selectedNotes()
if not sf:
return
import anki.find
@ -1123,8 +1123,8 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
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)d of %(b)d note updated",
"%(a)d of %(b)d notes updated", len(sf)) % {
'a': changed,
'b': len(sf),
})
@ -1141,7 +1141,7 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
aqt = ankiqt.forms.finddupes.Ui_Dialog()
dialog.setupUi(win)
restoreGeom(win, "findDupes")
fields = sorted(self.card.fact.model.fieldModels, key=attrgetter("name"))
fields = sorted(self.card.note.model.fieldModels, key=attrgetter("name"))
# per-model data
data = self.deck.db.all("""
select fm.id, m.name || '>' || fm.name from fieldmodels fm, models m
@ -1196,7 +1196,7 @@ select fm.id, fm.name from fieldmodels fm""")
for group in res:
t += '<li><a href="%s">%s</a>' % (
"fid:" + ",".join(str(id) for id in group[1]),
"nid:" + ",".join(str(id) for id in group[1]),
group[0])
t += "</ol>"
@ -1207,7 +1207,7 @@ select fm.id, fm.name from fieldmodels fm""")
def dupeLinkClicked(self, link):
self.form.searchEdit.setText(link.toString())
self.onSearch()
self.onFact()
self.onNote()
# Jumping
######################################################################
@ -1231,7 +1231,7 @@ select fm.id, fm.name from fieldmodels fm""")
self.form.searchEdit.setFocus()
self.form.searchEdit.selectAll()
def onFact(self):
def onNote(self):
self.editor.focus()
def onTags(self):
@ -1248,10 +1248,10 @@ select fm.id, fm.name from fieldmodels fm""")
class GenCards(QDialog):
def __init__(self, browser, fids):
def __init__(self, browser, nids):
QDialog.__init__(self, browser)
self.browser = browser
self.fids = fids
self.nids = nids
self.form = aqt.forms.gencards.Ui_Dialog()
self.form.setupUi(self)
self.setWindowModality(Qt.WindowModal)
@ -1262,7 +1262,7 @@ class GenCards(QDialog):
def getSelection(self):
# get cards to enable
f = self.browser.deck.getFact(self.fids[0])
f = self.browser.deck.getNote(self.nids[0])
self.model = f.model()
self.items = []
for t in self.model.templates:
@ -1296,15 +1296,15 @@ class GenCards(QDialog):
mw = self.browser.mw
mw.checkpoint(_("Generate Cards"))
mw.progress.start()
for c, fid in enumerate(self.fids):
f = mw.deck.getFact(fid)
for c, nid in enumerate(self.nids):
f = mw.deck.getNote(nid)
mw.deck.genCards(f, tplates)
if c % 100 == 0:
mw.progress.update()
if unused:
cids = mw.deck.db.list("""
select id from cards where fid in %s and ord in %s""" % (
ids2str(self.fids), ids2str(unused)))
select id from cards where nid in %s and ord in %s""" % (
ids2str(self.nids), ids2str(unused)))
mw.deck.remCards(cids)
mw.progress.finish()
mw.requireReset()
@ -1318,11 +1318,11 @@ select id from cards where fid in %s and ord in %s""" % (
class ChangeModel(QDialog):
def __init__(self, browser, fids):
def __init__(self, browser, nids):
QDialog.__init__(self, browser)
self.browser = browser
self.fids = fids
self.oldModel = browser.card.fact().model()
self.nids = nids
self.oldModel = browser.card.note().model()
self.form = aqt.forms.changemodel.Ui_Dialog()
self.form.setupUi(self)
self.setWindowModality(Qt.WindowModal)
@ -1461,14 +1461,14 @@ class ChangeModel(QDialog):
if any(True for c in cmap.values() if c is None):
if not askUser(_("""\
Any cards with templates mapped to nothing will be deleted. \
If a fact has no remaining cards, it will be lost. \
If a note has no remaining cards, it will be lost. \
Are you sure you want to continue?""")):
return
self.browser.mw.checkpoint(_("Change Model"))
b = self.browser
b.mw.progress.start()
b.model.beginReset()
self.oldModel.changeModel(self.fids, self.targetModel, fmap, cmap)
self.oldModel.changeModel(self.nids, self.targetModel, fmap, cmap)
b.onSearch(reset=False)
b.model.endReset()
b.mw.progress.finish()

View file

@ -20,17 +20,17 @@ class ResizingTextEdit(QTextEdit):
class CardLayout(QDialog):
# type is previewCards() type
def __init__(self, mw, fact, type=0, ord=0, parent=None):
def __init__(self, mw, note, type=0, ord=0, parent=None):
QDialog.__init__(self, parent or mw, Qt.Window)
raise Exception("Remember to disallow media&latex refs in edit.")
self.mw = aqt.mw
self.parent = parent or mw
self.fact = fact
self.note = note
self.type = type
self.ord = ord
self.deck = self.mw.deck
self.mm = self.mw.deck.models
self.model = fact.model()
self.model = note.model()
self.form = aqt.forms.clayout.Ui_Dialog()
self.form.setupUi(self)
self.setWindowTitle(_("%s Layout") % self.model['name'])
@ -50,13 +50,13 @@ class CardLayout(QDialog):
self.exec_()
def reload(self, first=False):
self.cards = self.deck.previewCards(self.fact, self.type)
self.cards = self.deck.previewCards(self.note, self.type)
if not self.cards:
self.accept()
if first:
showInfo(_("Please enter some text first."))
else:
showInfo(_("The current fact was deleted."))
showInfo(_("The current note was deleted."))
return
self.fillCardList()
self.fillFieldList()
@ -76,7 +76,7 @@ class CardLayout(QDialog):
_("Templates that will be created:"))
elif self.type == 1:
f.templateType.setText(
_("Templates used by fact:"))
_("Templates used by note:"))
else:
f.templateType.setText(
_("All templates:"))
@ -259,10 +259,10 @@ class CardLayout(QDialog):
if self.needFieldRebuild:
modified = True
if modified:
self.fact.model.setModified()
self.note.model.setModified()
self.deck.flushMod()
if self.factedit and self.factedit.onChange:
self.factedit.onChange("all")
if self.noteedit and self.noteedit.onChange:
self.noteedit.onChange("all")
reset=False
if reset:
self.mw.reset()
@ -358,7 +358,7 @@ class CardLayout(QDialog):
if fld['name'] != name:
self.mm.renameField(self.model, fld, name)
# as the field name has changed, we have to regenerate cards
self.cards = self.deck.previewCards(self.fact, self.type)
self.cards = self.deck.previewCards(self.note, self.type)
self.cardChanged(0)
self.renderPreview()
self.fillFieldList()
@ -413,7 +413,7 @@ class CardLayout(QDialog):
if len(self.model.fields) < 2:
showInfo(_("Please add a new field first."))
return
if askUser(_("Delete this field and its data from all facts?")):
if askUser(_("Delete this field and its data from all notes?")):
self.mw.progress.start()
self.model.delField(self.field)
self.mw.progress.finish()

View file

@ -24,7 +24,7 @@ class EditCurrent(QDialog):
SIGNAL("rejected()"),
self.onSave)
self.editor = aqt.editor.Editor(self.mw, self.form.fieldsArea)
self.editor.setFact(self.mw.reviewer.card.fact())
self.editor.setNote(self.mw.reviewer.card.note())
restoreGeom(self, "editcurrent")
addHook("closeEditCurrent", self.onSave)
self.mw.requireReset(modal=True)
@ -35,7 +35,7 @@ class EditCurrent(QDialog):
def onSave(self):
removeHook("closeEditCurrent", self.onSave)
self.editor.saveNow()
self.editor.setFact(None)
self.editor.setNote(None)
r = self.mw.reviewer
r.card.load()
r.keep = True

View file

@ -188,12 +188,12 @@ $(function () {
</body></html>
"""
# caller is responsible for resetting fact on reset
# caller is responsible for resetting note on reset
class Editor(object):
def __init__(self, mw, widget, addMode=False):
self.widget = widget
self.mw = mw
self.fact = None
self.note = None
self.stealFocus = True
self.addMode = addMode
self._loaded = False
@ -311,28 +311,28 @@ class Editor(object):
type = 1; ord = self.card.ord
else:
type = 0; ord = 0
CardLayout(self.mw, self.fact, type=type, ord=ord, parent=self.widget)
self.loadFact()
CardLayout(self.mw, self.note, type=type, ord=ord, parent=self.widget)
self.loadNote()
# JS->Python bridge
######################################################################
def bridge(self, str):
if not self.fact or not runHook:
if not self.note or not runHook:
# shutdown
return
# focus lost or key/button pressed?
if str.startswith("blur") or str.startswith("key"):
(type, txt) = str.split(":", 1)
self.fact.fields[self.currentField] = self.mungeHTML(txt)
self.note.fields[self.currentField] = self.mungeHTML(txt)
self.mw.requireReset()
self.fact.flush()
self.note.flush()
if type == "blur":
if not self._keepButtons:
self.disableButtons()
runHook("editFocusLost", self.fact)
runHook("editFocusLost", self.note)
else:
runHook("editTimer", self.fact)
runHook("editTimer", self.note)
self.checkValid()
# focused into field?
elif str.startswith("focus"):
@ -358,19 +358,19 @@ class Editor(object):
txt = ""
return txt
# Setting/unsetting the current fact
# Setting/unsetting the current note
######################################################################
def _loadFinished(self, w):
self._loaded = True
if self.fact:
self.loadFact()
if self.note:
self.loadNote()
def setFact(self, fact, hide=True):
"Make FACT the current fact."
self.fact = fact
def setNote(self, note, hide=True):
"Make NOTE the current note."
self.note = note
# change timer
if self.fact:
if self.note:
self.web.setHtml(_html % (getBase(self.mw.deck), anki.js.all,
_("Show Duplicates")),
loadCB=self._loadFinished)
@ -379,12 +379,12 @@ class Editor(object):
elif hide:
self.widget.hide()
def loadFact(self, field=0):
def loadNote(self, field=0):
if not self._loaded:
# will be loaded when page is ready
return
self.web.eval("setFields(%s, %d);" % (
simplejson.dumps(self.fact.items()), field))
simplejson.dumps(self.note.items()), field))
self.web.eval("setFonts(%s);" % (
simplejson.dumps(self.fonts())))
self.checkValid()
@ -397,11 +397,11 @@ class Editor(object):
def fonts(self):
return [(f['font'], f['esize'])
for f in self.fact.model()['flds']]
for f in self.note.model()['flds']]
def saveNow(self):
"Must call this before adding cards, closing dialog, etc."
if not self.fact:
if not self.note:
return
self._keepButtons = True
self.web.eval("saveField('blur');")
@ -411,7 +411,7 @@ class Editor(object):
def checkValid(self):
cols = []
self.dupe = None
for c, p in enumerate(self.fact.problems()):
for c, p in enumerate(self.note.problems()):
if not p:
cols.append("#fff")
elif p == "unique":
@ -426,16 +426,16 @@ class Editor(object):
self.web.eval("hideDupes();")
def showDupes(self):
contents = self.fact.fields[self.dupe]
contents = self.note.fields[self.dupe]
browser = aqt.dialogs.open("Browser", self.mw)
browser.form.searchEdit.setText(
"'model:%s' '%s'" % (self.fact.model().name, contents))
"'model:%s' '%s'" % (self.note.model().name, contents))
browser.onSearch()
def fieldsAreBlank(self):
if not self.fact:
if not self.note:
return True
for f in self.fact.fields:
for f in self.note.fields:
if f:
return False
return True
@ -450,12 +450,12 @@ class Editor(object):
form.setupUi(d)
d.connect(form.buttonBox, SIGNAL("helpRequested()"),
lambda: aqt.openHelp("HtmlEditor"))
form.textEdit.setPlainText(self.fact.fields[self.currentField])
form.textEdit.setPlainText(self.note.fields[self.currentField])
form.textEdit.moveCursor(QTextCursor.End)
d.exec_()
self.fact.fields[self.currentField] = unicode(
self.note.fields[self.currentField] = unicode(
form.textEdit.toPlainText())
self.loadFact(self.currentField)
self.loadNote(self.currentField)
# Tag and group handling
######################################################################
@ -494,32 +494,32 @@ class Editor(object):
self.tags.setDeck(self.mw.deck)
if self.addMode:
self.group.setDeck(self.mw.deck)
self.tags.setText(self.fact.stringTags().strip())
if getattr(self.fact, 'gid', None):
gid = self.fact.gid
self.tags.setText(self.note.stringTags().strip())
if getattr(self.note, 'gid', None):
gid = self.note.gid
else:
gid = self.fact.model().conf['gid']
gid = self.note.model().conf['gid']
self.group.setText(self.mw.deck.groups.name(gid))
def saveTagsAndGroup(self):
if not self.fact:
if not self.note:
return
self.fact.tags = self.mw.deck.tags.split(unicode(self.tags.text()))
self.note.tags = self.mw.deck.tags.split(unicode(self.tags.text()))
if self.addMode:
# save group and tags to model
self.fact.gid = self.mw.deck.groups.id(unicode(self.group.text()))
m = self.fact.model()
m['gid'] = self.fact.gid
m['tags'] = self.fact.tags
self.note.gid = self.mw.deck.groups.id(unicode(self.group.text()))
m = self.note.model()
m['gid'] = self.note.gid
m['tags'] = self.note.tags
self.mw.deck.models.save(m)
self.fact.flush()
runHook("tagsAndGroupUpdated", self.fact)
self.note.flush()
runHook("tagsAndGroupUpdated", self.note)
def changeGroup(self):
id = self.fact.id
id = self.note.id
runHook("closeEditCurrent")
browser = aqt.dialogs.open("Browser", self.mw)
browser.form.searchEdit.setText("fid:%d" % id)
browser.form.searchEdit.setText("nid:%d" % id)
browser.onSearch()
browser.setGroup(True)
@ -547,7 +547,7 @@ class Editor(object):
def onCloze(self):
# check that the model is set up for cloze deletion
ok = False
for t in self.fact.model().templates:
for t in self.note.model().templates:
if "cloze" in t['qfmt'] or "cloze" in t['afmt']:
ok = True
break
@ -555,7 +555,7 @@ class Editor(object):
showInfo(_("Please use a cloze deletion model."),
help="ClozeDeletion")
return
f = self.fact.fields[self.currentField]
f = self.note.fields[self.currentField]
# find the highest existing cloze
m = re.findall("\{\{c(\d+)::", f)
if m:

View file

@ -214,7 +214,7 @@ you can enter it here. Use \\t to represent tab."""),
self.parent.deck.finishProgress()
self.parent.deck.setUndoEnd(n)
txt = (
_("Importing complete. %(num)d facts imported from %(file)s.\n") %
_("Importing complete. %(num)d notes imported from %(file)s.\n") %
{"num": self.importer.total, "file": os.path.basename(self.file)})
self.dialog.groupBox.setShown(False)
self.dialog.buttonBox.button(QDialogButtonBox.Close).setFocus()

View file

@ -123,9 +123,9 @@ class AnkiQt(QMainWindow):
def _editCurrentState(self, oldState):
pass
def factChanged(self, fid):
"Called when a card or fact is edited (but not deleted)."
runHook("factChanged", fid)
def noteChanged(self, nid):
"Called when a card or note is edited (but not deleted)."
runHook("noteChanged", nid)
# Resetting state
##########################################################################
@ -541,7 +541,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
def closeEvent(self, event):
"User hit the X button, etc."
print "fixme: exit from edit current, review, etc"
if self.state == "editCurrentFact":
if self.state == "editCurrentNote":
event.ignore()
return self.moveToState("saveEdit")
self.close(showBrowser=False)
@ -602,11 +602,11 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
def updateMarkAction(self, ):
self.form.actionMarkCard.blockSignals(True)
self.form.actionMarkCard.setChecked(
self.reviewer.card.fact().hasTag("marked"))
self.reviewer.card.note().hasTag("marked"))
self.form.actionMarkCard.blockSignals(False)
def onMark(self, toggled):
f = self.reviewer.card.fact()
f = self.reviewer.card.note()
if f.hasTag("marked"):
f.delTag("marked")
else:
@ -623,9 +623,9 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
self.deck.remCards([self.reviewer.card.id])
self.reviewer.nextCard()
def onBuryFact(self):
def onBuryNote(self):
self.checkpoint(_("Bury"))
self.deck.sched.buryFact(self.reviewer.card.fid)
self.deck.sched.buryNote(self.reviewer.card.nid)
self.reviewer.nextCard()
# Undo & autosave
@ -690,7 +690,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
def onCardLayout(self):
from aqt.clayout import CardLayout
CardLayout(self, self.reviewer.card.fact(), type=1,
CardLayout(self, self.reviewer.card.note(), type=1,
ord=self.reviewer.card.ord)
def onDeckOpts(self):
@ -829,7 +829,7 @@ Please choose a new deck name:"""))
self.connect(m.actionGroups, s, self.onGroups)
self.connect(m.actionDocumentation, s, self.onDocumentation)
self.connect(m.actionDonate, s, self.onDonate)
self.connect(m.actionBuryFact, s, self.onBuryFact)
self.connect(m.actionBuryNote, s, self.onBuryNote)
def enableDeckMenuItems(self, enabled=True):
"setEnabled deck-related items."
@ -855,7 +855,7 @@ Please choose a new deck name:"""))
self.form.actionMarkCard.setEnabled(False)
self.form.actionSuspendCard.setEnabled(False)
self.form.actionDelete.setEnabled(False)
self.form.actionBuryFact.setEnabled(False)
self.form.actionBuryNote.setEnabled(False)
self.form.actionRepeatAudio.setEnabled(False)
runHook("disableCardMenuItems")
@ -865,7 +865,7 @@ Please choose a new deck name:"""))
self.form.actionMarkCard.setEnabled(True)
self.form.actionSuspendCard.setEnabled(True)
self.form.actionDelete.setEnabled(True)
self.form.actionBuryFact.setEnabled(True)
self.form.actionBuryNote.setEnabled(True)
self.form.actionEditCurrent.setEnabled(True)
self.form.actionEditdeck.setEnabled(True)
self.updateMarkAction()

View file

@ -59,8 +59,8 @@ class Models(QDialog):
self.models = [self.deck.getModel(mid) for mid in mids]
self.form.modelsList.clear()
for m in self.models:
item = QListWidgetItem(_("%(name)s [%(facts)d facts]") % dict(
name=m.name, facts=m.useCount()))
item = QListWidgetItem(_("%(name)s [%(notes)d notes]") % dict(
name=m.name, notes=m.useCount()))
self.form.modelsList.addItem(item)
self.form.modelsList.setCurrentRow(row)
@ -78,23 +78,23 @@ class Models(QDialog):
def onLayout(self):
# set to current
# # see if there's an available fact
# # see if there's an available note
dummy = False
id = self.deck.db.scalar(
"select id from facts where mid = ?", self.model.id)
"select id from notes where mid = ?", self.model.id)
if id:
fact = self.deck.getFact(id)
note = self.deck.getNote(id)
else:
# generate a dummy one
self.deck.conf['currentModelId'] = self.model.id
fact = self.deck.newFact()
for f in fact.keys():
fact[f] = f
self.deck.addFact(fact)
note = self.deck.newNote()
for f in note.keys():
note[f] = f
self.deck.addNote(note)
dummy = True
aqt.clayout.CardLayout(self.mw, fact, type=2, parent=self)
aqt.clayout.CardLayout(self.mw, note, type=2, parent=self)
if dummy:
self.deck._delFacts([fact.id])
self.deck._delNotes([note.id])
def onDelete(self):
if len(self.models) < 2:

View file

@ -402,7 +402,7 @@ div#filler {
ord = self.typeAns()
try:
cor = self.mw.deck.media.strip(
stripHTML(self.card.fact().fields[ord]))
stripHTML(self.card.note().fields[ord]))
except IndexError:
self.card.template()['typeAns'] = None
self.card.model().flush()

View file

@ -54,14 +54,14 @@
self.deck.updateProgress()
d.s.statement("vacuum")
self.deck.updateProgress()
nfacts = d.factCount
nnotes = d.noteCount
mdir = self.deck.mediaDir()
d.close()
dir = os.path.dirname(path)
zippath = os.path.join(dir, "shared-%d.zip" % time.time())
# zip it up
zip = zipfile.ZipFile(zippath, "w", zipfile.ZIP_DEFLATED)
zip.writestr("facts", str(nfacts))
zip.writestr("notes", str(nnotes))
zip.writestr("version", str(2))
readmep = os.path.join(dir, "README.html")
readme = open(readmep, "w")

View file

@ -388,8 +388,8 @@ firewall software temporarily, or try again from a different network.
Debugging info: %s""") % error.data.get("exc", "<none>")
else:
tb = traceback.format_exc()
if "missingFacts" in tb:
msg=_("""Facts were missing after sync, so the \
if "missingNotes" in tb:
msg=_("""Notes were missing after sync, so the \
sync was aborted. Please report this error.""")
else:
msg=_("Unknown error: %s") % tb