update deck configuration dialog

This commit is contained in:
Damien Elmes 2011-12-10 04:21:53 +09:00
parent 82fb30aa4a
commit f8d39ca210
9 changed files with 742 additions and 805 deletions

View file

@ -44,3 +44,20 @@
self.moveToState("initial") self.moveToState("initial")
if not self.deck.finishScheduler: if not self.deck.finishScheduler:
showInfo(_("No cards matched the provided tags.")) showInfo(_("No cards matched the provided tags."))
# cram options
c = self.conf['cram']
f.cramSteps.setText(self.listToUser(c['delays']))
f.cramBoost.setChecked(c['resched'])
f.cramReset.setChecked(c['reset'])
f.cramMult.setValue(c['mult']*100)
f.cramMinInt.setValue(c['minInt'])
c = self.conf['cram']
self.updateList(c, 'delays', f.cramSteps)
c['resched'] = f.cramBoost.isChecked()
c['reset'] = f.cramReset.isChecked()
c['mult'] = f.cramMult.value()/100.0
c['minInt'] = f.cramMinInt.value()

View file

@ -5,34 +5,137 @@
from aqt.qt import * from aqt.qt import *
import aqt, simplejson import aqt, simplejson
from anki.utils import ids2str from anki.utils import ids2str
from aqt.utils import showInfo, showWarning, openHelp from aqt.utils import showInfo, showWarning, openHelp, getOnlyText
from operator import itemgetter
import datetime, time
# Configuration editing class DeckConf(QDialog):
########################################################################## def __init__(self, mw):
QDialog.__init__(self, mw)
class GroupConf(QDialog):
def __init__(self, mw, gcid, parent=None):
QDialog.__init__(self, parent or mw)
self.mw = mw self.mw = mw
self.gcid = gcid self.deck = self.mw.col.decks.current()
self.form = aqt.forms.groupconf.Ui_Dialog() self.form = aqt.forms.dconf.Ui_Dialog()
self.form.setupUi(self) self.form.setupUi(self)
(self.name, self.conf) = self.mw.col.db.first( self.mw.checkpoint(_("Options"))
"select name, conf from gconf where id = ?", self.gcid) self.setupConfs()
self.conf = simplejson.loads(self.conf)
self.setWindowTitle(self.name)
self.setup()
self.connect(self.form.buttonBox, self.connect(self.form.buttonBox,
SIGNAL("helpRequested()"), SIGNAL("helpRequested()"),
lambda: openHelp("GroupOptions")) lambda: openHelp("StudyOptions"))
self.connect(self.form.confOpts, SIGNAL("clicked()"), self.confOpts)
self.form.confOpts.setText(u"")
self.connect(self.form.buttonBox.button(QDialogButtonBox.RestoreDefaults), self.connect(self.form.buttonBox.button(QDialogButtonBox.RestoreDefaults),
SIGNAL("clicked()"), SIGNAL("clicked()"),
self.onRestore) self.onRestore)
self.setupCombos()
self.setupCollection()
self.setWindowTitle(_("Options for %s") % self.deck['name'])
self.exec_() self.exec_()
def accept(self): def setupCombos(self):
self.save() import anki.consts as cs
QDialog.accept(self) f = self.form
f.newOrder.addItems(cs.newCardOrderLabels().values())
f.revOrder.addItems(cs.revCardOrderLabels().values())
f.newSpread.addItems(cs.newCardSchedulingLabels().values())
self.connect(f.newOrder, SIGNAL("currentIndexChanged(int)"),
self.onNewOrderChanged)
# Conf list
######################################################################
def setupConfs(self):
self.connect(self.form.dconf, SIGNAL("currentIndexChanged(int)"),
self.onConfChange)
self.conf = None
self.loadConfs()
def loadConfs(self):
current = self.deck['conf']
self.confList = self.mw.col.decks.allConf()
self.confList.sort(key=itemgetter('name'))
startOn = None
self.ignoreConfChange = True
self.form.dconf.clear()
for idx, conf in enumerate(self.confList):
self.form.dconf.addItem(conf['name'])
if conf['id'] == current:
startOn = idx
self.ignoreConfChange = False
self.form.dconf.setCurrentIndex(startOn)
self.onConfChange(startOn)
def confOpts(self):
m = QMenu(self.mw)
a = m.addAction(_("Add"))
a.connect(a, SIGNAL("triggered()"), self.addGroup)
a = m.addAction(_("Delete"))
a.connect(a, SIGNAL("triggered()"), self.remGroup)
a = m.addAction(_("Rename"))
a.connect(a, SIGNAL("triggered()"), self.renameGroup)
m.exec_(QCursor.pos())
def onConfChange(self, idx):
if self.ignoreConfChange:
return
if self.conf:
self.saveConf()
conf = self.confList[idx]
self.deck['conf'] = conf['id']
self.loadConf()
def addGroup(self):
name = getOnlyText(_("New options group name:"))
if not name:
return
# first, save currently entered data to current conf
self.saveConf()
# then clone the conf
id = self.mw.col.decks.confId(name, cloneFrom=self.conf)
# set the deck to the new conf
self.deck['conf'] = id
# then reload the conf list
self.loadConfs()
def remGroup(self):
if self.conf['id'] == 1:
showInfo(_("The default configuration can't be removed."), self)
else:
self.mw.col.decks.remConf(self.conf['id'])
self.deck['conf'] = 1
self.loadConfs()
def renameGroup(self):
name = getOnlyText(_("New name:"))
if not name:
return
self.conf['name'] = name
self.loadConfs()
# Collection options
######################################################################
def setupCollection(self):
import anki.consts as c
f = self.form
qc = self.mw.col.conf
self.startDate = datetime.datetime.fromtimestamp(self.mw.col.crt)
f.dayOffset.setValue(self.startDate.hour)
f.lrnCutoff.setValue(qc['collapseTime']/60.0)
f.newSpread.setCurrentIndex(qc['newSpread'])
f.timeLimit.setValue(qc['timeLim']/60.0)
def saveCollection(self):
f = self.form
d = self.mw.col
qc = d.conf
qc['newSpread'] = f.newSpread.currentIndex()
qc['timeLim'] = f.timeLimit.value()*60
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()))
# Loading # Loading
################################################## ##################################################
@ -40,15 +143,26 @@ class GroupConf(QDialog):
def listToUser(self, l): def listToUser(self, l):
return " ".join([str(x) for x in l]) return " ".join([str(x) for x in l])
def setup(self): def loadConf(self):
self.conf = self.mw.col.decks.conf(self.deck['id'])
# new # new
c = self.conf['new'] c = self.conf['new']
f = self.form f = self.form
f.lrnSteps.setText(self.listToUser(c['delays'])) f.lrnSteps.setText(self.listToUser(c['delays']))
f.lrnGradInt.setValue(c['ints'][0]) f.lrnGradInt.setValue(c['ints'][0])
f.lrnEasyInt.setValue(c['ints'][2]) f.lrnEasyInt.setValue(c['ints'][1])
f.lrnFirstInt.setValue(c['ints'][1])
f.lrnFactor.setValue(c['initialFactor']/10.0) f.lrnFactor.setValue(c['initialFactor']/10.0)
f.newOrder.setCurrentIndex(c['order'])
f.newPerDay.setValue(c['perDay'])
# rev
c = self.conf['rev']
f.revPerDay.setValue(c['perDay'])
f.revOrder.setCurrentIndex(c['order'])
f.revSpace.setValue(c['fuzz']*100)
f.revMinSpace.setValue(c['minSpace'])
f.easyBonus.setValue(c['ease4']*100)
f.fi1.setValue(c['fi'][0])
f.fi2.setValue(c['fi'][1])
# lapse # lapse
c = self.conf['lapse'] c = self.conf['lapse']
f.lapSteps.setText(self.listToUser(c['delays'])) f.lapSteps.setText(self.listToUser(c['delays']))
@ -56,27 +170,30 @@ class GroupConf(QDialog):
f.lapMinInt.setValue(c['minInt']) f.lapMinInt.setValue(c['minInt'])
f.leechThreshold.setValue(c['leechFails']) f.leechThreshold.setValue(c['leechFails'])
f.leechAction.setCurrentIndex(c['leechAction']) f.leechAction.setCurrentIndex(c['leechAction'])
f.lapRelearn.setChecked(c['relearn'])
# rev
c = self.conf['rev']
f.revSpace.setValue(c['fuzz']*100)
f.revMinSpace.setValue(c['minSpace'])
f.easyBonus.setValue(c['ease4']*100)
# cram
c = self.conf['cram']
f.cramSteps.setText(self.listToUser(c['delays']))
f.cramBoost.setChecked(c['resched'])
f.cramReset.setChecked(c['reset'])
f.cramMult.setValue(c['mult']*100)
f.cramMinInt.setValue(c['minInt'])
# general # general
c = self.conf c = self.conf
f.maxTaken.setValue(c['maxTaken']) f.maxTaken.setValue(c['maxTaken'])
def onRestore(self): def onRestore(self):
from anki.groups import defaultConf self.mw.col.decks.restoreToDefault(self.conf)
self.conf = defaultConf.copy() self.loadConf()
self.setup() f = self.form
f.dayOffset.setValue(4)
f.lrnCutoff.setValue(20)
f.newSpread.setCurrentIndex(0)
f.timeLimit.setValue(0)
# New order
##################################################
def onNewOrderChanged(self, new):
old = self.conf['new']['order']
if old == new:
return
self.conf['new']['order'] = new
self.mw.progress.start()
self.mw.col.sched.resortConf(self.conf)
self.mw.progress.finish()
# Saving # Saving
################################################## ##################################################
@ -97,15 +214,24 @@ class GroupConf(QDialog):
return return
conf[key] = ret conf[key] = ret
def save(self): def saveConf(self):
# new # new
c = self.conf['new'] c = self.conf['new']
f = self.form f = self.form
self.updateList(c, 'delays', f.lrnSteps) self.updateList(c, 'delays', f.lrnSteps)
c['ints'][0] = f.lrnGradInt.value() c['ints'][0] = f.lrnGradInt.value()
c['ints'][2] = f.lrnEasyInt.value() c['ints'][1] = f.lrnEasyInt.value()
c['ints'][1] = f.lrnFirstInt.value()
c['initialFactor'] = f.lrnFactor.value()*10 c['initialFactor'] = f.lrnFactor.value()*10
c['order'] = f.newOrder.currentIndex()
c['perDay'] = f.newPerDay.value()
# rev
c = self.conf['rev']
c['perDay'] = f.revPerDay.value()
c['fuzz'] = f.revSpace.value()/100.0
c['minSpace'] = f.revMinSpace.value()
c['ease4'] = f.easyBonus.value()/100.0
c['order'] = f.revOrder.currentIndex()
c['fi'] = [f.fi1.value(), f.fi2.value()]
# lapse # lapse
c = self.conf['lapse'] c = self.conf['lapse']
self.updateList(c, 'delays', f.lapSteps) self.updateList(c, 'delays', f.lapSteps)
@ -113,105 +239,19 @@ class GroupConf(QDialog):
c['minInt'] = f.lapMinInt.value() c['minInt'] = f.lapMinInt.value()
c['leechFails'] = f.leechThreshold.value() c['leechFails'] = f.leechThreshold.value()
c['leechAction'] = f.leechAction.currentIndex() c['leechAction'] = f.leechAction.currentIndex()
c['relearn'] = f.lapRelearn.isChecked()
# rev
c = self.conf['rev']
c['fuzz'] = f.revSpace.value()/100.0
c['minSpace'] = f.revMinSpace.value()
c['ease4'] = f.easyBonus.value()/100.0
# cram
c = self.conf['cram']
self.updateList(c, 'delays', f.cramSteps)
c['resched'] = f.cramBoost.isChecked()
c['reset'] = f.cramReset.isChecked()
c['mult'] = f.cramMult.value()/100.0
c['minInt'] = f.cramMinInt.value()
# general # general
c = self.conf c = self.conf
c['maxTaken'] = f.maxTaken.value() c['maxTaken'] = f.maxTaken.value()
# update db self.mw.col.decks.save(self.conf)
self.mw.checkpoint(_("Group Options"))
self.mw.col.db.execute(
"update gconf set conf = ? where id = ?",
simplejson.dumps(self.conf), self.gcid)
# Managing configurations
##########################################################################
class GroupConfSelector(QDialog): #make sure to save() deck and conf (on saveConf())
def __init__(self, mw, gids, parent=None):
QDialog.__init__(self, parent or mw)
self.mw = mw
self.gids = gids
self.form = aqt.forms.groupconfsel.Ui_Dialog()
self.form.setupUi(self)
self.connect(self.form.list, SIGNAL("itemChanged(QListWidgetItem*)"),
self.onRename)
self.defaultId = self.mw.col.db.scalar(
"select gcid from groups where id = ?", self.gids[0])
self.reload()
self.addButtons()
self.exec_()
def accept(self):
# save
self.mw.col.db.execute(
"update groups set gcid = ? where id in "+ids2str(self.gids),
self.gcid())
QDialog.accept(self)
def reject(self): def reject(self):
self.accept() self.accept()
def reload(self): def accept(self):
self.confs = self.mw.col.groupConfs() self.saveCollection()
self.form.list.clear() self.saveConf()
deflt = None self.mw.reset()
for c in self.confs: QDialog.accept(self)
item = QListWidgetItem(c[0])
item.setFlags(item.flags() | Qt.ItemIsEditable)
self.form.list.addItem(item)
if c[1] == self.defaultId:
deflt = item
self.form.list.setCurrentItem(deflt)
def addButtons(self):
box = self.form.buttonBox
def button(name, func, type=QDialogButtonBox.ActionRole):
b = box.addButton(name, type)
b.connect(b, SIGNAL("clicked()"), func)
return b
button(_("Edit..."), self.onEdit).setShortcut("e")
button(_("Copy"), self.onCopy).setShortcut("c")
button(_("Delete"), self.onDelete)
def gcid(self):
return self.confs[self.form.list.currentRow()][1]
def onRename(self, item):
gcid = self.gcid()
self.mw.col.db.execute("update gconf set name = ? where id = ?",
unicode(item.text()), gcid)
def onEdit(self):
GroupConf(self.mw, self.gcid(), self)
def onCopy(self):
gcid = self.gcid()
gc = list(self.mw.col.db.first("select * from gconf where id = ?", gcid))
gc[0] = self.mw.col.nextID("gcid")
gc[2] = _("%s copy")%gc[2]
self.mw.col.db.execute("insert into gconf values (?,?,?,?)", *gc)
self.reload()
def onDelete(self):
gcid = self.gcid()
if gcid == 1:
showInfo(_("The default configuration can't be removed."), self)
else:
self.mw.checkpoint(_("Delete Group Config"))
self.mw.col.db.execute(
"update groups set gcid = 1 where gcid = ?", gcid)
self.mw.col.db.execute(
"delete from gconf where id = ?", gcid)
self.reload()

View file

@ -1,52 +0,0 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from aqt.qt import *
import sys, re
import aqt
from aqt.utils import maybeHideClose, openHelp
class ColOptions(QDialog):
def __init__(self, mw):
QDialog.__init__(self, mw, Qt.Window)
self.mw = mw
self.d = mw.col
self.form = aqt.forms.colopts.Ui_Dialog()
self.form.setupUi(self)
self.setup()
self.exec_()
def setup(self):
self.form.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False)
self.form.buttonBox.button(QDialogButtonBox.Close).setAutoDefault(False)
self.connect(self.form.buttonBox, SIGNAL("helpRequested()"),
self.helpRequested)
maybeHideClose(self.form.buttonBox)
# syncing
self.form.doSync.setChecked(self.d.syncingEnabled())
self.form.mediaURL.setText(self.d.conf['mediaURL'])
def helpRequested(self):
openHelp("ColOptions")
def reject(self):
needSync = False
# syncing
if self.form.doSync.isChecked():
old = self.d.syncName
self.d.enableSyncing()
if self.d.syncName != old:
needSync = True
else:
self.d.disableSyncing()
url = unicode(self.form.mediaURL.text())
if url:
if not re.match("^(http|https|ftp)://", url, re.I):
url = "http://" + url
if not url.endswith("/"):
url += "/"
self.d.conf['mediaURL'] = url
QDialog.reject(self)
if needSync:
aqt.mw.syncCol(interactive=-1)

View file

@ -48,10 +48,12 @@ class AnkiQt(QMainWindow):
try: try:
self.setupUI() self.setupUI()
self.setupAddons() self.setupAddons()
self.setupProfile()
except: except:
showInfo("Error during startup:\n%s" % traceback.format_exc()) showInfo("Error during startup:\n%s" % traceback.format_exc())
sys.exit(1) sys.exit(1)
# Load profile in a timer so we can let the window finish init and not
# close on profile load error.
self.progress.timer(10, self.setupProfile, False)
def setupUI(self): def setupUI(self):
self.col = None self.col = None
@ -661,9 +663,9 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
import aqt.stats import aqt.stats
self.cardStats = aqt.stats.CardStats(self) self.cardStats = aqt.stats.CardStats(self)
def onStudyOptions(self): def onDeckConf(self):
import aqt.studyopts import aqt.deckconf
aqt.studyopts.StudyOptions(self) aqt.deckconf.DeckConf(self)
def onOverview(self): def onOverview(self):
self.col.reset() self.col.reset()

View file

@ -42,7 +42,7 @@ class Overview(object):
#self.mw.col.cramGroups() #self.mw.col.cramGroups()
#self.mw.moveToState("review") #self.mw.moveToState("review")
elif url == "opts": elif url == "opts":
self.mw.onStudyOptions() self.mw.onDeckConf()
elif url == "decks": elif url == "decks":
self.mw.moveToState("deckBrowser") self.mw.moveToState("deckBrowser")

View file

@ -1,77 +0,0 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# -*- coding: utf-8 -*-
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from aqt.qt import *
import datetime, time, aqt
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.setWindowModality(Qt.WindowModal)
self.setup()
self.load()
self.exec_()
def setup(self):
import anki.consts as c
self.form.newOrder.insertItems(
0, c.newCardOrderLabels().values())
self.form.newSpread.insertItems(
0, c.newCardSchedulingLabels().values())
self.form.revOrder.insertItems(
0, c.revCardOrderLabels().values())
self.connect(self.form.buttonBox,
SIGNAL("helpRequested()"),
lambda: openHelp("StudyOptions"))
def load(self):
f = self.form
d = self.mw.col
qc = d.conf
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 reject(self):
self.accept()
def accept(self):
f = self.form
d = self.mw.col
qc = d.conf
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 updateNewOrder(self, old, new):
if old == new:
return
self.mw.progress.start()
if new == 1:
self.mw.col.sched.orderCards()
else:
self.mw.col.sched.randomizeCards()
self.mw.progress.finish()

149
designer/cram.ui Normal file
View file

@ -0,0 +1,149 @@
<?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>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<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>New interval</string>
</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="enabled">
<bool>false</bool>
</property>
<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="1">
<widget class="QSpinBox" name="cramMult">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_29">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_30">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>%</string>
</property>
</widget>
</item>
</layout>
</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>
<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,11 +6,55 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>453</width> <width>500</width>
<height>325</height> <height>437</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_31">
<property name="text">
<string>Options group:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="dconf">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>3</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="confOpts">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/icons/gears.png</normaloff>:/icons/gears.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="arrowType">
<enum>Qt::NoArrow</enum>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
@ -24,68 +68,14 @@
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="1" column="0"> <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"> <widget class="QLabel" name="label_8">
<property name="text"> <property name="text">
<string>days</string> <string>Order</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="1" column="1" colspan="2">
<widget class="QLabel" name="label_3"> <widget class="QComboBox" name="newOrder"/>
<property name="text">
<string>Starting factor</string>
</property>
</widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
@ -97,7 +87,56 @@
<item row="0" column="1" colspan="2"> <item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="lrnSteps"/> <widget class="QLineEdit" name="lrnSteps"/>
</item> </item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>New cards/day</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="newPerDay">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Graduating interval</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Easy</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Starting factor</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="lrnGradInt">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QSpinBox" name="lrnEasyInt">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="lrnFactor"> <widget class="QSpinBox" name="lrnFactor">
<property name="minimum"> <property name="minimum">
<number>130</number> <number>130</number>
@ -110,7 +149,27 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" 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="4" column="2"> <item row="4" column="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_27"> <widget class="QLabel" name="label_27">
<property name="text"> <property name="text">
<string>%</string> <string>%</string>
@ -134,6 +193,176 @@
</item> </item>
</layout> </layout>
</widget> </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="2" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Space siblings by up to</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="revSpace">
<property name="maximum">
<number>100</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</item>
<item row="2" 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="3" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Minimum sibling range</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_19">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Easy bonus</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_21">
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="revMinSpace"/>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="easyBonus">
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="revOrder"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_32">
<property name="text">
<string>Order</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_33">
<property name="text">
<string>Desired forgetting index</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="fi1">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>50</number>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_34">
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_35">
<property name="text">
<string>Assumed forgetting index</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_37">
<property name="text">
<string>Maximum reviews/day</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="revPerDay">
<property name="minimum">
<number>25</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QLabel" name="label_36">
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="fi2">
<property name="minimum">
<number>1</number>
</property>
</widget>
</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_2"> <widget class="QWidget" name="tab_2">
<attribute name="title"> <attribute name="title">
<string>Lapses</string> <string>Lapses</string>
@ -154,14 +383,14 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>New interval</string> <string>New Interval</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_10"> <widget class="QLabel" name="label_10">
<property name="text"> <property name="text">
<string>Leech threshold</string> <string>Leech Threshold</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -184,14 +413,7 @@
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
<string>Leech action</string> <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> </property>
</widget> </widget>
</item> </item>
@ -208,7 +430,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_13"> <widget class="QLabel" name="label_13">
<property name="text"> <property name="text">
<string>Minimum interval</string> <string>Minimum Interval</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -289,209 +511,6 @@
</item> </item>
</layout> </layout>
</widget> </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">
<property name="maximum">
<number>100</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</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>%</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="revMinSpace"/>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="easyBonus">
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</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>New interval</string>
</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="enabled">
<bool>false</bool>
</property>
<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="1">
<widget class="QSpinBox" name="cramMult">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_29">
<property name="text">
<string>days</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_30">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>%</string>
</property>
</widget>
</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"> <widget class="QWidget" name="tab_5">
<attribute name="title"> <attribute name="title">
<string>General</string> <string>General</string>
@ -528,6 +547,92 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="QLabel" name="label_22">
<property name="text">
<string>&lt;b&gt;Collection Options&lt;/b&gt;&lt;br&gt;The settings below are shared between all decks.</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="newSpread"/>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Next day starts at</string>
</property>
</widget>
</item>
<item row="0" 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="1" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>Learn ahead limit</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="lrnCutoff">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_29">
<property name="text">
<string>mins</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_30">
<property name="text">
<string>Timebox time limit</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="timeLimit">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_39">
<property name="text">
<string>mins</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_40">
<property name="text">
<string>hours past midnight</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
@ -558,30 +663,37 @@
</layout> </layout>
</widget> </widget>
<tabstops> <tabstops>
<tabstop>dconf</tabstop>
<tabstop>confOpts</tabstop>
<tabstop>tabWidget</tabstop> <tabstop>tabWidget</tabstop>
<tabstop>lrnSteps</tabstop> <tabstop>lrnSteps</tabstop>
<tabstop>newOrder</tabstop>
<tabstop>newPerDay</tabstop>
<tabstop>lrnGradInt</tabstop> <tabstop>lrnGradInt</tabstop>
<tabstop>lrnEasyInt</tabstop> <tabstop>lrnEasyInt</tabstop>
<tabstop>lrnFirstInt</tabstop>
<tabstop>lrnFactor</tabstop> <tabstop>lrnFactor</tabstop>
<tabstop>revOrder</tabstop>
<tabstop>revPerDay</tabstop>
<tabstop>revSpace</tabstop>
<tabstop>revMinSpace</tabstop>
<tabstop>easyBonus</tabstop>
<tabstop>fi1</tabstop>
<tabstop>fi2</tabstop>
<tabstop>lapSteps</tabstop> <tabstop>lapSteps</tabstop>
<tabstop>lapMult</tabstop> <tabstop>lapMult</tabstop>
<tabstop>lapMinInt</tabstop> <tabstop>lapMinInt</tabstop>
<tabstop>leechThreshold</tabstop> <tabstop>leechThreshold</tabstop>
<tabstop>leechAction</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>maxTaken</tabstop>
<tabstop>newSpread</tabstop>
<tabstop>dayOffset</tabstop>
<tabstop>lrnCutoff</tabstop>
<tabstop>timeLimit</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>buttonBox</tabstop>
</tabstops> </tabstops>
<resources/> <resources>
<include location="icons.qrc"/>
</resources>
<connections> <connections>
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
@ -615,37 +727,5 @@
</hint> </hint>
</hints> </hints>
</connection> </connection>
<connection>
<sender>cramReset</sender>
<signal>toggled(bool)</signal>
<receiver>cramMult</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>96</x>
<y>103</y>
</hint>
<hint type="destinationlabel">
<x>187</x>
<y>133</y>
</hint>
</hints>
</connection>
<connection>
<sender>cramReset</sender>
<signal>toggled(bool)</signal>
<receiver>cramMinInt</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>138</x>
<y>103</y>
</hint>
<hint type="destinationlabel">
<x>187</x>
<y>168</y>
</hint>
</hints>
</connection>
</connections> </connections>
</ui> </ui>

View file

@ -1,222 +0,0 @@
<?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>382</width>
<height>319</height>
</rect>
</property>
<property name="windowTitle">
<string>Study Options</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<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>
</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>
<item row="8" column="0">
<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>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,5">
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close|QDialogButtonBox::Help</set>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<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>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>More study options are available in the group settings.</string>
</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>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>