make preview delay customizable

This commit is contained in:
Damien Elmes 2018-01-20 15:26:11 +10:00
parent 1343101add
commit 651b107b18
5 changed files with 47 additions and 11 deletions

View file

@ -42,6 +42,9 @@ defaultDynamicDeck = {
'terms': [["", 100, 0]], 'terms': [["", 100, 0]],
'resched': True, 'resched': True,
'return': True, # currently unused 'return': True, # currently unused
# v2 scheduler
"previewDelay": 10,
} }
defaultConf = { defaultConf = {

View file

@ -94,16 +94,13 @@ class Scheduler:
# update daily limit # update daily limit
self._updateStats(card, 'rev') self._updateStats(card, 'rev')
# hard-coded for now
_previewDelay = 600
def _answerCardPreview(self, card, ease): def _answerCardPreview(self, card, ease):
assert 1 <= ease <= 2 assert 1 <= ease <= 2
if ease == 1: if ease == 1:
# repeat after delay # repeat after delay
card.queue = 4 card.queue = 4
card.due = intTime() + self._previewDelay card.due = intTime() + self._previewDelay(card)
self.lrnCount += 1 self.lrnCount += 1
else: else:
# restore original card state and remove from filtered deck # restore original card state and remove from filtered deck
@ -1193,6 +1190,9 @@ where id = ?
conf = self._cardConf(card) conf = self._cardConf(card)
return conf['dyn'] and not conf['resched'] return conf['dyn'] and not conf['resched']
def _previewDelay(self, card):
return self._cardConf(card).get("previewDelay", 10)*60
# Daily cutoff # Daily cutoff
########################################################################## ##########################################################################
@ -1317,7 +1317,7 @@ To study outside of the normal schedule, click the Custom Study button below."""
# preview mode? # preview mode?
if self._previewingCard(card): if self._previewingCard(card):
if ease == 1: if ease == 1:
return self._previewDelay return self._previewDelay(card)
return 0 return 0
# (re)learning? # (re)learning?

View file

@ -25,7 +25,7 @@ class DeckConf(QDialog):
self.form.buttonBox.helpRequested.connect(lambda: openHelp("filtered")) self.form.buttonBox.helpRequested.connect(lambda: openHelp("filtered"))
self.setWindowTitle(_("Options for %s") % self.deck['name']) self.setWindowTitle(_("Options for %s") % self.deck['name'])
restoreGeom(self, "dyndeckconf") restoreGeom(self, "dyndeckconf")
self.setupOrder() self.initialSetup()
self.loadConf() self.loadConf()
if search: if search:
self.form.search.setText(search + " is:due") self.form.search.setText(search + " is:due")
@ -39,21 +39,29 @@ class DeckConf(QDialog):
self.exec_() self.exec_()
saveGeom(self, "dyndeckconf") saveGeom(self, "dyndeckconf")
def setupOrder(self): def initialSetup(self):
import anki.consts as cs import anki.consts as cs
self.form.order.addItems(list(cs.dynOrderLabels().values())) self.form.order.addItems(list(cs.dynOrderLabels().values()))
self.form.order_2.addItems(list(cs.dynOrderLabels().values())) self.form.order_2.addItems(list(cs.dynOrderLabels().values()))
self.form.resched.stateChanged.connect(self._onReschedToggled)
def _onReschedToggled(self, _state):
self.form.previewDelayWidget.setVisible(not self.form.resched.isChecked()
and self.mw.col.schedVer() > 1)
def loadConf(self): def loadConf(self):
f = self.form f = self.form
d = self.deck d = self.deck
f.resched.setChecked(d['resched']) f.resched.setChecked(d['resched'])
self._onReschedToggled(0)
search, limit, order = d['terms'][0] search, limit, order = d['terms'][0]
f.search.setText(search) f.search.setText(search)
f.order.setCurrentIndex(order) f.order.setCurrentIndex(order)
f.limit.setValue(limit) f.limit.setValue(limit)
f.previewDelay.setValue(d.get("previewDelay", 10))
if len(d['terms']) > 1: if len(d['terms']) > 1:
search, limit, order = d['terms'][1] search, limit, order = d['terms'][1]
@ -86,6 +94,7 @@ class DeckConf(QDialog):
f.order_2.currentIndex()]) f.order_2.currentIndex()])
d['terms'] = terms d['terms'] = terms
d['previewDelay'] = f.previewDelay.value()
self.mw.col.decks.save(d) self.mw.col.decks.save(d)
return True return True

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>445</width> <width>382</width>
<height>354</height> <height>413</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -134,13 +134,36 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="2" column="0">
<widget class="QCheckBox" name="secondFilter"> <widget class="QCheckBox" name="secondFilter">
<property name="text"> <property name="text">
<string>Enable second filter</string> <string>Enable second filter</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QWidget" name="previewDelayWidget" native="true">
<layout class="QHBoxLayout" name="previewDelayBox">
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Repeat failed cards after</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="previewDelay"/>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>minutes</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -177,6 +200,7 @@
<tabstop>limit_2</tabstop> <tabstop>limit_2</tabstop>
<tabstop>order_2</tabstop> <tabstop>order_2</tabstop>
<tabstop>resched</tabstop> <tabstop>resched</tabstop>
<tabstop>previewDelay</tabstop>
<tabstop>secondFilter</tabstop> <tabstop>secondFilter</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>buttonBox</tabstop>
</tabstops> </tabstops>

View file

@ -724,7 +724,7 @@ def test_preview():
# grab the first card # grab the first card
c = d.sched.getCard() c = d.sched.getCard()
assert d.sched.answerButtons(c) == 2 assert d.sched.answerButtons(c) == 2
assert d.sched.nextIvl(c, 1) == d.sched._previewDelay assert d.sched.nextIvl(c, 1) == 600
assert d.sched.nextIvl(c, 2) == 0 assert d.sched.nextIvl(c, 2) == 0
# failing it will push its due time back # failing it will push its due time back
due = c.due due = c.due