mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 14:32:22 -04:00

When adding facts, you can now pass in a group id which the GUI should support editing. Templates will have an optional group id which overrides the provided id, so users can automatically put certain card types in a different group (or all of them, if desired). Greying out the group box in the GUI in that case would be a good idea.
144 lines
3.9 KiB
Python
144 lines
3.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright: Damien Elmes <anki@ichi2.net>
|
|
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
|
|
|
|
import time
|
|
from anki.utils import intTime, hexifyID
|
|
|
|
MAX_TIMER = 60
|
|
|
|
# Cards
|
|
##########################################################################
|
|
|
|
# Type: 0=learning, 1=due, 2=new
|
|
# Queue: 0=learning, 1=due, 2=new
|
|
# -1=suspended, -2=user buried, -3=sched buried
|
|
# Due is used differently for different queues.
|
|
# - new queue: fact id
|
|
# - rev queue: integer day
|
|
# - lrn queue: integer timestamp
|
|
|
|
class Card(object):
|
|
|
|
def __init__(self, deck, id=None):
|
|
self.deck = deck
|
|
self.timerStarted = None
|
|
self._qa = None
|
|
if id:
|
|
self.id = id
|
|
self.load()
|
|
else:
|
|
# to flush, set fid, tid, and due
|
|
self.id = None
|
|
self.gid = 1
|
|
self.crt = intTime()
|
|
self.type = 2
|
|
self.queue = 2
|
|
self.ivl = 0
|
|
self.factor = 0
|
|
self.reps = 0
|
|
self.streak = 0
|
|
self.lapses = 0
|
|
self.grade = 0
|
|
self.cycles = 0
|
|
self.data = ""
|
|
|
|
def load(self):
|
|
(self.id,
|
|
self.fid,
|
|
self.tid,
|
|
self.gid,
|
|
self.crt,
|
|
self.mod,
|
|
self.type,
|
|
self.queue,
|
|
self.due,
|
|
self.ivl,
|
|
self.factor,
|
|
self.reps,
|
|
self.streak,
|
|
self.lapses,
|
|
self.grade,
|
|
self.cycles,
|
|
self.data) = self.deck.db.first(
|
|
"select * from cards where id = ?", self.id)
|
|
|
|
def flush(self):
|
|
self.mod = intTime()
|
|
self.deck.db.execute(
|
|
"""
|
|
insert or replace into cards values
|
|
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
self.id,
|
|
self.fid,
|
|
self.tid,
|
|
self.gid,
|
|
self.crt,
|
|
self.mod,
|
|
self.type,
|
|
self.queue,
|
|
self.due,
|
|
self.ivl,
|
|
self.factor,
|
|
self.reps,
|
|
self.streak,
|
|
self.lapses,
|
|
self.grade,
|
|
self.cycles,
|
|
self.data)
|
|
|
|
def flushSched(self):
|
|
self.mod = intTime()
|
|
self.deck.db.execute(
|
|
"""update cards set
|
|
mod=?, type=?, queue=?, due=?, ivl=?, factor=?, reps=?,
|
|
streak=?, lapses=?, grade=?, cycles=? where id = ?""",
|
|
self.mod, self.type, self.queue, self.due, self.ivl,
|
|
self.factor, self.reps, self.streak, self.lapses,
|
|
self.grade, self.cycles, self.id)
|
|
|
|
def q(self):
|
|
return self._getQA()['q']
|
|
|
|
def a(self):
|
|
return self._getQA()['a']
|
|
|
|
def _getQA(self, reload=False):
|
|
if not self._qa or reload:
|
|
self._qa = self.deck.renderQA([self.id], "card")[0]
|
|
return self._qa
|
|
|
|
def fact(self):
|
|
return self.deck.getFact(self.fid)
|
|
|
|
def template(self):
|
|
return self.deck.getTemplate(self.tid)
|
|
|
|
def startTimer(self):
|
|
self.timerStarted = time.time()
|
|
|
|
def timeTaken(self):
|
|
return min(time.time() - self.timerStarted, MAX_TIMER)
|
|
|
|
# Questions and answers
|
|
##########################################################################
|
|
|
|
def htmlQuestion(self, type="question", align=True):
|
|
div = '''<div class="card%s" id="cm%s%s">%s</div>''' % (
|
|
type[0], type[0], hexifyID(self.tid),
|
|
getattr(self, type))
|
|
# add outer div & alignment (with tables due to qt's html handling)
|
|
if not align:
|
|
return div
|
|
attr = type + 'Align'
|
|
if getattr(self.cardModel, attr) == 0:
|
|
align = "center"
|
|
elif getattr(self.cardModel, attr) == 1:
|
|
align = "left"
|
|
else:
|
|
align = "right"
|
|
return (("<center><table width=95%%><tr><td align=%s>" % align) +
|
|
div + "</td></tr></table></center>")
|
|
|
|
def htmlAnswer(self, align=True):
|
|
return self.htmlQuestion(type="answer", align=align)
|