add new study options

This commit is contained in:
Damien Elmes 2011-03-27 23:07:15 +09:00
parent 6b0e51dc74
commit a036b97a68
7 changed files with 807 additions and 369 deletions

39
aqt/groupconf.py Normal file
View file

@ -0,0 +1,39 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# -*- coding: utf-8 -*-
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import aqt
class GroupConf(QDialog):
def __init__(self, mw):
QDialog.__init__(self, mw)
self.mw = mw
self.form = aqt.forms.groupconf.Ui_Dialog()
self.form.setupUi(self)
self.setupNew()
self.setupLapse()
self.setupRev()
self.setupCram()
self.setupGeneral()
self.connect(self.form.optionsHelpButton,
SIGNAL("clicked()"),
lambda: QDesktopServices.openUrl(QUrl(
aqt.appWiki + "StudyOptions")))
self.exec_()
def setupNew(self):
pass
def setupLapse(self):
pass
def setupRev(self):
pass
def setupCram(self):
pass
def setupGeneral(self):
pass

View file

@ -17,7 +17,7 @@ from anki.utils import addTags, parseTags, canonifyTags, stripHTML, checksum
from anki.hooks import runHook, addHook, removeHook
import anki.consts
import aqt, aqt.facteditor, aqt.progress, aqt.webview, aqt.stats
import aqt, aqt.facteditor, aqt.progress, aqt.webview, aqt.stats, aqt.studyopts
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
saveState, restoreState, getOnlyText, askUser, GetTextDialog, \
askUserDialog, applyStyles, getText, showText, showCritical
@ -647,6 +647,9 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
def setupCardStats(self):
self.cardStats = aqt.stats.CardStats(self)
def onStudyOptions(self):
aqt.studyopts.StudyOptions(self)
def onCardStats(self):
self.cardStats.show()
@ -783,7 +786,7 @@ Please give your deck a name:"""))
self.connect(m.actionCheckMediaDatabase, s, self.onCheckMediaDB)
self.connect(m.actionDownloadMissingMedia, s, self.onDownloadMissingMedia)
self.connect(m.actionLocalizeMedia, s, self.onLocalizeMedia)
#self.connect(m.actionStudyOptions, s, self.onStudyOptions)
self.connect(m.actionStudyOptions, s, self.onStudyOptions)
self.connect(m.actionDonate, s, self.onDonate)
self.connect(m.actionBuryFact, s, self.onBuryFact)

View file

@ -54,7 +54,7 @@ class Overview(object):
self.mw.deck.cramGroups(self.mw.deck.qconf['revGroups'])
self.mw.moveToState("review")
elif url == "opts":
print "study options"
self.mw.onStudyOptions()
elif url == "list":
self.mw.close()
elif url == "chgrp":

View file

@ -1,284 +1,75 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# -*- coding: utf-8 -*-
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
def _studyScreenState(self, oldState):
self.currentCard = None
# if self.deck.finishScheduler:
# self.deck.finishScheduler()
self.disableCardMenuItems()
self.showStudyScreen()
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import datetime, time, aqt
# Study screen
##########################################################################
def setupStudyScreen(self):
return
self.form.buttonStack.hide()
self.form.newCardOrder.insertItems(
0, QStringList(anki.consts.newCardOrderLabels().values()))
self.form.newCardScheduling.insertItems(
0, QStringList(anki.consts.newCardSchedulingLabels().values()))
self.form.revCardOrder.insertItems(
0, QStringList(anki.consts.revCardOrderLabels().values()))
self.connect(self.form.optionsHelpButton,
SIGNAL("clicked()"),
class StudyOptions(QDialog):
def __init__(self, mw):
QDialog.__init__(self, mw)
self.mw = mw
self.form = aqt.forms.studyopts.Ui_Dialog()
self.form.setupUi(self)
self.setup()
self.load()
self.connect(self.form.buttonBox,
SIGNAL("helpRequested()"),
lambda: QDesktopServices.openUrl(QUrl(
aqt.appWiki + "StudyOptions")))
self.connect(self.form.minuteLimit,
SIGNAL("textChanged(QString)"), self.onMinuteLimitChanged)
self.connect(self.form.questionLimit,
SIGNAL("textChanged(QString)"), self.onQuestionLimitChanged)
self.connect(self.form.newPerDay,
SIGNAL("textChanged(QString)"), self.onNewLimitChanged)
self.connect(self.form.startReviewingButton,
SIGNAL("clicked()"),
self.onStartReview)
self.connect(self.form.newCardOrder,
SIGNAL("activated(int)"), self.onNewCardOrderChanged)
self.connect(self.form.failedCardMax,
SIGNAL("editingFinished()"),
self.onFailedMaxChanged)
self.connect(self.form.newCategories,
SIGNAL("clicked()"), self.onNewCategoriesClicked)
self.connect(self.form.revCategories,
SIGNAL("clicked()"), self.onRevCategoriesClicked)
self.form.tabWidget.setCurrentIndex(self.config['studyOptionsTab'])
aqt.appWiki + "StudyOptions")))
self.exec_()
def onNewCategoriesClicked(self):
aqt.activetags.show(self, "new")
def setup(self):
import anki.consts as c
self.form.newOrder.insertItems(
0, QStringList(c.newCardOrderLabels().values()))
self.form.newSpread.insertItems(
0, QStringList(c.newCardSchedulingLabels().values()))
self.form.revOrder.insertItems(
0, QStringList(c.revCardOrderLabels().values()))
def onRevCategoriesClicked(self):
aqt.activetags.show(self, "rev")
def load(self):
f = self.form
d = self.mw.deck
qc = d.qconf
f.newPerDay.setValue(qc['newPerDay'])
f.newOrder.setCurrentIndex(qc['newOrder'])
f.newSpread.setCurrentIndex(qc['newSpread'])
f.revOrder.setCurrentIndex(qc['revOrder'])
f.timeLimit.setValue(qc['timeLim']/60.0)
f.questionLimit.setValue(qc['repLim'])
self.startDate = datetime.datetime.fromtimestamp(d.crt)
f.dayOffset.setValue(self.startDate.hour)
f.lrnCutoff.setValue(qc['collapseTime']/60.0)
def onFailedMaxChanged(self):
try:
v = int(self.form.failedCardMax.text())
if v == 1 or v < 0:
v = 2
self.deck.failedCardMax = v
except ValueError:
pass
self.form.failedCardMax.setText(str(self.deck.failedCardMax))
self.deck.flushMod()
def accept(self):
f = self.form
d = self.mw.deck
qc = d.qconf
old = qc['newOrder']
qc['newOrder'] = f.newOrder.currentIndex()
self.updateNewOrder(old, qc['newOrder'])
qc['newSpread'] = f.newSpread.currentIndex()
qc['revOrder'] = f.revOrder.currentIndex()
qc['newPerDay'] = f.newPerDay.value()
qc['timeLim'] = f.timeLimit.value()*60
qc['repLim'] = f.questionLimit.value()
qc['collapseTime'] = f.lrnCutoff.value()*60
hrs = f.dayOffset.value()
old = self.startDate
date = datetime.datetime(
old.year, old.month, old.day, hrs)
d.crt = int(time.mktime(date.timetuple()))
self.mw.reset()
QDialog.accept(self)
def onMinuteLimitChanged(self, qstr):
try:
val = float(self.form.minuteLimit.text()) * 60
if self.deck.sessionTimeLimit == val:
return
self.deck.sessionTimeLimit = val
except ValueError:
pass
self.deck.flushMod()
self.updateStudyStats()
def onQuestionLimitChanged(self, qstr):
try:
val = int(self.form.questionLimit.text())
if self.deck.sessionRepLimit == val:
return
self.deck.sessionRepLimit = val
except ValueError:
pass
self.deck.flushMod()
self.updateStudyStats()
def onNewLimitChanged(self, qstr):
try:
val = int(self.form.newPerDay.text())
if self.deck.newCardsPerDay == val:
return
self.deck.newCardsPerDay = val
except ValueError:
pass
self.deck.flushMod()
self.deck.reset()
self.statusView.redraw()
self.updateStudyStats()
def onNewCardOrderChanged(self, ncOrd):
def uf(obj, field, value):
if getattr(obj, field) != value:
setattr(obj, field, value)
self.deck.flushMod()
if ncOrd != 0:
if self.deck.newCardOrder == 0:
# need to put back in order
self.mw.startProgress()
self.mw.updateProgress(_("Ordering..."))
self.deck.orderNewCards()
self.deck.finishProgress()
uf(self.deck, 'newCardOrder', ncOrd)
elif ncOrd == 0:
# (re-)randomize
self.deck.startProgress()
self.deck.updateProgress(_("Randomizing..."))
def updateNewOrder(self, old, new):
if old == new:
return
self.mw.progress.start()
if new == 1:
self.deck.orderNewCards()
else:
self.deck.randomizeNewCards()
self.deck.finishProgress()
uf(self.deck, 'newCardOrder', ncOrd)
def updateActives(self):
labels = [
_("Show All Due Cards"),
_("Show Chosen Categories")
]
if self.deck.getVar("newActive") or self.deck.getVar("newInactive"):
new = labels[1]
else:
new = labels[0]
self.form.newCategoryLabel.setText(new)
if self.deck.getVar("revActive") or self.deck.getVar("revInactive"):
rev = labels[1]
else:
rev = labels[0]
self.form.revCategoryLabel.setText(rev)
def updateStudyStats(self):
self.form.buttonStack.hide()
self.deck.reset()
self.updateActives()
wasReached = self.deck.timeboxReached()
sessionColour = '<font color=#0000ff>%s</font>'
cardColour = '<font color=#0000ff>%s</font>'
# top label
h = {}
h['ret'] = cardColour % (self.deck.revCount+self.deck.failedSoonCount)
h['new'] = cardColour % self.deck.newCount
h['newof'] = str(self.deck.newCountAll())
# counts & time for today
todayStart = self.deck.failedCutoff - 86400
sql = "select count(), sum(userTime) from revlog"
(reps, time_) = self.deck.db.first(
sql + " where time > :start", start=todayStart)
h['timeToday'] = sessionColour % (
anki.utils.fmtTimeSpan(time_ or 0, short=True, point=1))
h['repsToday'] = sessionColour % reps
# and yesterday
yestStart = todayStart - 86400
(reps, time_) = self.deck.db.first(
sql + " where time > :start and time <= :end",
start=yestStart, end=todayStart)
h['timeTodayChg'] = str(
anki.utils.fmtTimeSpan(time_ or 0, short=True, point=1))
h['repsTodayChg'] = str(reps)
# session counts
limit = self.deck.sessionTimeLimit
start = self.deck.sessionStartTime or time.time() - limit
start2 = self.deck.lastSessionStart or start - limit
last10 = self.deck.db.scalar(
"select count(*) from revlog where time >= :t",
t=start)
last20 = self.deck.db.scalar(
"select count(*) from revlog where "
"time >= :t and time < :t2",
t=start2, t2=start)
h['repsInSes'] = sessionColour % last10
h['repsInSesChg'] = str(last20)
h['cs_header'] = "<b>" + _("Cards/session:") + "</b>"
h['cd_header'] = "<b>" + _("Cards/day:") + "</b>"
h['td_header'] = "<b>" + _("Time/day:") + "</b>"
h['rd_header'] = "<b>" + _("Reviews due:") + "</b>"
h['ntod_header'] = "<b>" + _("New today:") + "</b>"
h['ntot_header'] = "<b>" + _("New total:") + "</b>"
stats1 = ("""\
<table>
<tr><td width=150>%(cs_header)s</td><td width=50><b>%(repsInSesChg)s</b></td>
<td><b>%(repsInSes)s</b></td></tr></table>
<hr>
<table>
<tr><td width=150>
%(cd_header)s</td><td width=50><b>%(repsTodayChg)s</b></td>
<td><b>%(repsToday)s</b></td></tr>
<tr><td>%(td_header)s</td><td><b>%(timeTodayChg)s</b></td>
<td><b>%(timeToday)s</b></td></tr>
</table>""") % h
stats2 = ("""\
<table>
<tr><td width=180>%(rd_header)s</td><td align=right><b>%(ret)s</b></td></tr>
<tr><td>%(ntod_header)s</td><td align=right><b>%(new)s</b></td></tr>
<tr><td>%(ntot_header)s</td><td align=right>%(newof)s</td></tr>
</table>""") % h
self.form.optionsLabel.setText("""\
<p><table><tr>
%s
</tr><tr>
<td><hr>%s<hr></td></tr></table>""" % (stats1, stats2))
h['tt_header'] = _("Session Statistics")
h['cs_tip'] = _("The number of cards you studied in the current \
session (blue) and previous session (black)")
h['cd_tip'] = _("The number of cards you studied today (blue) and \
yesterday (black)")
h['td_tip'] = _("The number of minutes you studied today (blue) and \
yesterday (black)")
h['rd_tip'] = _("The number of cards that are waiting to be reviewed \
today")
h['ntod_tip'] = _("The number of new cards that are waiting to be \
learnt today")
h['ntot_tip'] = _("The total number of new cards in the deck")
statToolTip = ("""<h1>%(tt_header)s</h1>
<dl><dt><b>%(cs_header)s</b></dt><dd>%(cs_tip)s</dd></dl>
<dl><dt><b>%(cd_header)s</b></dt><dd>%(cd_tip)s</dd></dl>
<dl><dt><b>%(td_header)s</b></dt><dd>%(td_tip)s</dd></dl>
<dl><dt><b>%(rd_header)s</b></dt><dd>%(rd_tip)s</dd></dl>
<dl><dt><b>%(ntod_header)s</b></dt><dd>%(ntod_tip)s</dd></dl>
<dl><dt><b>%(ntot_header)s</b></dt><dd>%(ntot_tip)s<</dd></dl>""") % h
self.form.optionsLabel.setToolTip(statToolTip)
def showStudyScreen(self):
# forget last card
self.lastCard = None
self.switchToStudyScreen()
self.updateStudyStats()
self.form.startReviewingButton.setFocus()
self.setupStudyOptions()
self.form.studyOptionsFrame.setMaximumWidth(500)
self.form.studyOptionsFrame.show()
def setupStudyOptions(self):
self.form.newPerDay.setText(str(self.deck.newCardsPerDay))
lim = self.deck.sessionTimeLimit/60
if int(lim) == lim:
lim = int(lim)
self.form.minuteLimit.setText(str(lim))
self.form.questionLimit.setText(str(self.deck.sessionRepLimit))
self.form.newCardOrder.setCurrentIndex(self.deck.newCardOrder)
self.form.newCardScheduling.setCurrentIndex(self.deck.newCardSpacing)
self.form.revCardOrder.setCurrentIndex(self.deck.revCardOrder)
self.form.failedCardsOption.clear()
if self.deck.getFailedCardPolicy() == 5:
labels = failedCardOptionLabels().values()
else:
labels = failedCardOptionLabels().values()[0:-1]
self.form.failedCardsOption.insertItems(0, labels)
self.form.failedCardsOption.setCurrentIndex(self.deck.getFailedCardPolicy())
self.form.failedCardMax.setText(unicode(self.deck.failedCardMax))
def onStartReview(self):
def uf(obj, field, value):
if getattr(obj, field) != value:
setattr(obj, field, value)
self.deck.flushMod()
self.form.studyOptionsFrame.hide()
# make sure the size is updated before button stack shown
self.app.processEvents()
uf(self.deck, 'newCardSpacing',
self.form.newCardScheduling.currentIndex())
uf(self.deck, 'revCardOrder',
self.form.revCardOrder.currentIndex())
pol = self.deck.getFailedCardPolicy()
if (pol != 5 and pol !=
self.form.failedCardsOption.currentIndex()):
self.deck.setFailedCardPolicy(
self.form.failedCardsOption.currentIndex())
self.deck.flushMod()
self.deck.reset()
if not self.deck.finishScheduler:
self.deck.startTimebox()
self.config['studyOptionsTab'] = self.form.tabWidget.currentIndex()
self.moveToState("getQuestion")
def onStudyOptions(self):
if self.state == "studyScreen":
pass
else:
self.moveToState("studyScreen")
self.mw.progress.finish()

554
designer/groupconf.ui Normal file
View file

@ -0,0 +1,554 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>453</width>
<height>325</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>New Cards</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Graduating interval</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="lrnGradInt"/>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Easy</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="lrnEasyInt"/>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Easy on first sight</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="lrnFirstInt"/>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Starting factor</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="lrnFactor"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Steps (in minutes)</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="lrnSteps"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Lapses</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Steps (in minutes)</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="lapSteps"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Interval multiplier</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="lapMult">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.050000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Leech threshold</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="leechThreshold"/>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>lapses</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Leech action</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3">
<widget class="QCheckBox" name="lapRelearn">
<property name="text">
<string>Automatically relearn lapsed cards</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="lapMinInt">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>99</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Minimum interval</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_14">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="leechAction">
<item>
<property name="text">
<string>Suspend Card</string>
</property>
</item>
<item>
<property name="text">
<string>Tag Only</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>72</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Reviews</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Space siblings by up to</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="revSpace"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_18">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Minimum sibling range</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_19">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Easy bonus</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_21">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="easyBonus">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="revMinSpace"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>152</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Cramming</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Steps (in minutes)</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="cramSteps"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Lapse interval multiplier</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="cramMult">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.050000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QCheckBox" name="cramReset">
<property name="text">
<string>Reset interval of cards failed during cram</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="cramMinInt">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>Minimal interval</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QCheckBox" name="cramBoost">
<property name="text">
<string>Boost regular interval</string>
</property>
</widget>
</item>
<item row="3" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>93</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QLabel" name="label_25">
<property name="text">
<string>Ignore answer times longer than</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="maxTaken"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_26">
<property name="text">
<string>seconds</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>199</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>tabWidget</tabstop>
<tabstop>lrnSteps</tabstop>
<tabstop>lrnGradInt</tabstop>
<tabstop>lrnEasyInt</tabstop>
<tabstop>lrnFirstInt</tabstop>
<tabstop>lrnFactor</tabstop>
<tabstop>lapSteps</tabstop>
<tabstop>lapMult</tabstop>
<tabstop>lapMinInt</tabstop>
<tabstop>leechThreshold</tabstop>
<tabstop>leechAction</tabstop>
<tabstop>lapRelearn</tabstop>
<tabstop>revSpace</tabstop>
<tabstop>revMinSpace</tabstop>
<tabstop>easyBonus</tabstop>
<tabstop>cramSteps</tabstop>
<tabstop>cramBoost</tabstop>
<tabstop>cramReset</tabstop>
<tabstop>cramMult</tabstop>
<tabstop>cramMinInt</tabstop>
<tabstop>maxTaken</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -6,117 +6,168 @@
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<height>271</height>
<width>435</width>
<height>334</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Next day starts at</string>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Next day starts at</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="dayOffset">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
<property name="maximum">
<number>23</number>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Learn ahead limit</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="lrnCutoff">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>mins</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>New cards/day</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="newPerDay">
<property name="maximum">
<number>999</number>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QComboBox" name="newOrder"/>
</item>
<item row="2" column="0" colspan="3">
<widget class="QComboBox" name="newSpread"/>
</item>
<item row="3" column="0" colspan="3">
<widget class="QComboBox" name="revOrder"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Timebox question limit</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Timebox time limit</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="questionLimit">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QSpinBox" name="timeLimit">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>mins</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="dayOffset">
<property name="maximumSize">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>16777215</height>
<width>20</width>
<height>40</height>
</size>
</property>
</widget>
</spacer>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_3">
<item>
<widget class="QPushButton" name="groupSettings">
<property name="text">
<string>AM</string>
<string>Group Settings...</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Collapse learning by up to</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="lrnCutoff">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>mins</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>New cards/day</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="newPerDay"/>
</item>
<item row="1" column="0" colspan="3">
<widget class="QComboBox" name="newOrder"/>
</item>
<item row="2" column="0" colspan="3">
<widget class="QComboBox" name="newSpread"/>
</item>
<item row="3" column="0" colspan="3">
<widget class="QComboBox" name="revOrder"/>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="groupSettings">
<property name="text">
<string>Group Settings...</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>newPerDay</tabstop>
<tabstop>newOrder</tabstop>
<tabstop>newSpread</tabstop>
<tabstop>revOrder</tabstop>
<tabstop>dayOffset</tabstop>
<tabstop>lrnCutoff</tabstop>
<tabstop>questionLimit</tabstop>
<tabstop>timeLimit</tabstop>
<tabstop>groupSettings</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
<connections>
<connection>

View file

@ -17,14 +17,14 @@ pyrcc=`which pyrcc4`
if [ $? != 0 ]; then
if [ xDarwin = x$(uname) ]
then
if [ -e /Library/Frameworks/Python.framework/Versions/2.5/bin/pyuic4 ]
if [ -e /Library/Frameworks/Python.framework/Versions/2.7/bin/pyuic4 ]
then
pyuic=/Library/Frameworks/Python.framework/Versions/2.5/bin/pyuic4
pyrcc=/Library/Frameworks/Python.framework/Versions/2.5/bin/pyrcc4
elif [ -e /opt/local/Library/Frameworks/Python.framework/Versions/2.5/bin/pyuic4 ]
pyuic=/Library/Frameworks/Python.framework/Versions/2.7/bin/pyuic4
pyrcc=/Library/Frameworks/Python.framework/Versions/2.7/bin/pyrcc4
elif [ -e /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/pyuic4 ]
then
pyuic=/opt/local/Library/Frameworks/Python.framework/Versions/2.5/bin/pyuic4
pyrcc=/opt/local/Library/Frameworks/Python.framework/Versions/2.5/bin/pyrcc4
pyuic=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/pyuic4
pyrcc=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/pyrcc4
elif [ -e /System/Library/Frameworks/Python.framework/Versions/2.6/bin/pyuic4 ]
then
pyuic=/System/Library/Frameworks/Python.framework/Versions/2.6/bin/pyuic4