diff --git a/aqt/cram.py b/aqt/cram.py index 582e7f454..6047bd88b 100644 --- a/aqt/cram.py +++ b/aqt/cram.py @@ -44,3 +44,20 @@ self.moveToState("initial") if not self.deck.finishScheduler: 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() diff --git a/aqt/deckconf.py b/aqt/deckconf.py index c4946cbdb..5e1c62c9d 100644 --- a/aqt/deckconf.py +++ b/aqt/deckconf.py @@ -5,34 +5,137 @@ from aqt.qt import * import aqt, simplejson 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 GroupConf(QDialog): - def __init__(self, mw, gcid, parent=None): - QDialog.__init__(self, parent or mw) +class DeckConf(QDialog): + def __init__(self, mw): + QDialog.__init__(self, mw) self.mw = mw - self.gcid = gcid - self.form = aqt.forms.groupconf.Ui_Dialog() + self.deck = self.mw.col.decks.current() + self.form = aqt.forms.dconf.Ui_Dialog() self.form.setupUi(self) - (self.name, self.conf) = self.mw.col.db.first( - "select name, conf from gconf where id = ?", self.gcid) - self.conf = simplejson.loads(self.conf) - self.setWindowTitle(self.name) - self.setup() + self.mw.checkpoint(_("Options")) + self.setupConfs() self.connect(self.form.buttonBox, 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), SIGNAL("clicked()"), self.onRestore) + self.setupCombos() + self.setupCollection() + self.setWindowTitle(_("Options for %s") % self.deck['name']) self.exec_() - def accept(self): - self.save() - QDialog.accept(self) + def setupCombos(self): + import anki.consts as cs + 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 ################################################## @@ -40,15 +143,26 @@ class GroupConf(QDialog): def listToUser(self, 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 c = self.conf['new'] f = self.form f.lrnSteps.setText(self.listToUser(c['delays'])) f.lrnGradInt.setValue(c['ints'][0]) - f.lrnEasyInt.setValue(c['ints'][2]) - f.lrnFirstInt.setValue(c['ints'][1]) + f.lrnEasyInt.setValue(c['ints'][1]) 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 c = self.conf['lapse'] f.lapSteps.setText(self.listToUser(c['delays'])) @@ -56,27 +170,30 @@ class GroupConf(QDialog): f.lapMinInt.setValue(c['minInt']) f.leechThreshold.setValue(c['leechFails']) 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 c = self.conf f.maxTaken.setValue(c['maxTaken']) def onRestore(self): - from anki.groups import defaultConf - self.conf = defaultConf.copy() - self.setup() + self.mw.col.decks.restoreToDefault(self.conf) + self.loadConf() + 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 ################################################## @@ -97,15 +214,24 @@ class GroupConf(QDialog): return conf[key] = ret - def save(self): + def saveConf(self): # new c = self.conf['new'] f = self.form self.updateList(c, 'delays', f.lrnSteps) c['ints'][0] = f.lrnGradInt.value() - c['ints'][2] = f.lrnEasyInt.value() - c['ints'][1] = f.lrnFirstInt.value() + c['ints'][1] = f.lrnEasyInt.value() 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 c = self.conf['lapse'] self.updateList(c, 'delays', f.lapSteps) @@ -113,105 +239,19 @@ class GroupConf(QDialog): c['minInt'] = f.lapMinInt.value() c['leechFails'] = f.leechThreshold.value() 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 c = self.conf c['maxTaken'] = f.maxTaken.value() - # update db - self.mw.checkpoint(_("Group Options")) - self.mw.col.db.execute( - "update gconf set conf = ? where id = ?", - simplejson.dumps(self.conf), self.gcid) + self.mw.col.decks.save(self.conf) -# Managing configurations -########################################################################## -class GroupConfSelector(QDialog): - 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) +#make sure to save() deck and conf (on saveConf()) def reject(self): self.accept() - def reload(self): - self.confs = self.mw.col.groupConfs() - self.form.list.clear() - deflt = None - for c in self.confs: - 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() + def accept(self): + self.saveCollection() + self.saveConf() + self.mw.reset() + QDialog.accept(self) diff --git a/aqt/deckopts.py b/aqt/deckopts.py deleted file mode 100644 index b4b3f411f..000000000 --- a/aqt/deckopts.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright: Damien Elmes -# 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) diff --git a/aqt/main.py b/aqt/main.py index ae30f5aaa..7084563d9 100755 --- a/aqt/main.py +++ b/aqt/main.py @@ -48,10 +48,12 @@ class AnkiQt(QMainWindow): try: self.setupUI() self.setupAddons() - self.setupProfile() except: showInfo("Error during startup:\n%s" % traceback.format_exc()) 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): self.col = None @@ -661,9 +663,9 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") import aqt.stats self.cardStats = aqt.stats.CardStats(self) - def onStudyOptions(self): - import aqt.studyopts - aqt.studyopts.StudyOptions(self) + def onDeckConf(self): + import aqt.deckconf + aqt.deckconf.DeckConf(self) def onOverview(self): self.col.reset() diff --git a/aqt/overview.py b/aqt/overview.py index 055c2ba79..493b45a09 100644 --- a/aqt/overview.py +++ b/aqt/overview.py @@ -42,7 +42,7 @@ class Overview(object): #self.mw.col.cramGroups() #self.mw.moveToState("review") elif url == "opts": - self.mw.onStudyOptions() + self.mw.onDeckConf() elif url == "decks": self.mw.moveToState("deckBrowser") diff --git a/aqt/studyopts.py b/aqt/studyopts.py deleted file mode 100644 index 6255ab215..000000000 --- a/aqt/studyopts.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright: Damien Elmes -# -*- 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() diff --git a/designer/cram.ui b/designer/cram.ui new file mode 100644 index 000000000..d1865e321 --- /dev/null +++ b/designer/cram.ui @@ -0,0 +1,149 @@ + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + + + + Steps (in minutes) + + + + + + + + + + New interval + + + + + + + Reset interval of cards failed during cram + + + + + + + false + + + 1 + + + + + + + Minimal interval + + + + + + + Boost regular interval + + + + + + + false + + + 100 + + + 5 + + + + + + + days + + + + + + + + 0 + 0 + + + + % + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/designer/dconf.ui b/designer/dconf.ui index d8b83506b..526e2595f 100644 --- a/designer/dconf.ui +++ b/designer/dconf.ui @@ -6,11 +6,55 @@ 0 0 - 453 - 325 + 500 + 437 + + + + + + Options group: + + + + + + + + 3 + 0 + + + + + + + + + 16777215 + 32 + + + + + + + + :/icons/gears.png:/icons/gears.png + + + Qt::ToolButtonTextBesideIcon + + + Qt::NoArrow + + + + + @@ -24,68 +68,14 @@ - - - Graduating interval - - - - - - - - - - - 0 - 0 - - - - days - - - - - - - Easy - - - - - - - - - - days - - - - - - - Easy on first sight - - - - - - - - days + Order - - - - Starting factor - - + + @@ -97,7 +87,56 @@ + + + + New cards/day + + + + + + + 9999 + + + + + + + Graduating interval + + + + + + + Easy + + + + + + + Starting factor + + + + + + + 1 + + + + + + 1 + + + + 130 @@ -110,7 +149,27 @@ + + + + + 0 + 0 + + + + days + + + + + + days + + + + % @@ -134,6 +193,176 @@ + + + Reviews + + + + + + + + Space siblings by up to + + + + + + + 100 + + + 5 + + + + + + + + 0 + 0 + + + + % + + + + + + + Minimum sibling range + + + + + + + days + + + + + + + Easy bonus + + + + + + + % + + + + + + + + + + 100 + + + 1000 + + + 5 + + + + + + + + + + Order + + + + + + + Desired forgetting index + + + + + + + 1 + + + 50 + + + + + + + % + + + + + + + Assumed forgetting index + + + + + + + Maximum reviews/day + + + + + + + 25 + + + 9999 + + + + + + + % + + + + + + + 1 + + + + + + + + + Qt::Vertical + + + + 20 + 152 + + + + + + Lapses @@ -154,14 +383,14 @@ - New interval + New Interval - Leech threshold + Leech Threshold @@ -184,14 +413,7 @@ - Leech action - - - - - - - Automatically relearn lapsed cards + Leech Action @@ -208,7 +430,7 @@ - Minimum interval + Minimum Interval @@ -289,209 +511,6 @@ - - - Reviews - - - - - - - - Space siblings by up to - - - - - - - 100 - - - 5 - - - - - - - - 0 - 0 - - - - % - - - - - - - Minimum sibling range - - - - - - - days - - - - - - - Easy bonus - - - - - - - % - - - - - - - - - - 100 - - - 1000 - - - 5 - - - - - - - - - Qt::Vertical - - - - 20 - 152 - - - - - - - - - Cramming - - - - - - - - Steps (in minutes) - - - - - - - - - - New interval - - - - - - - Reset interval of cards failed during cram - - - - - - - false - - - 1 - - - - - - - Minimal interval - - - - - - - Boost regular interval - - - - - - - false - - - 100 - - - 5 - - - - - - - days - - - - - - - - 0 - 0 - - - - % - - - - - - - - - Qt::Vertical - - - - 20 - 93 - - - - - - General @@ -528,6 +547,92 @@ + + + + <b>Collection Options</b><br>The settings below are shared between all decks. + + + + + + + + + + + + Next day starts at + + + + + + + + 60 + 16777215 + + + + 23 + + + + + + + Learn ahead limit + + + + + + + + 60 + 16777215 + + + + + + + + mins + + + + + + + Timebox time limit + + + + + + + 9999 + + + + + + + mins + + + + + + + hours past midnight + + + + + @@ -558,30 +663,37 @@ + dconf + confOpts tabWidget lrnSteps + newOrder + newPerDay lrnGradInt lrnEasyInt - lrnFirstInt lrnFactor + revOrder + revPerDay + revSpace + revMinSpace + easyBonus + fi1 + fi2 lapSteps lapMult lapMinInt leechThreshold leechAction - lapRelearn - revSpace - revMinSpace - easyBonus - cramSteps - cramBoost - cramReset - cramMult - cramMinInt maxTaken + newSpread + dayOffset + lrnCutoff + timeLimit buttonBox - + + + buttonBox @@ -615,37 +727,5 @@ - - cramReset - toggled(bool) - cramMult - setEnabled(bool) - - - 96 - 103 - - - 187 - 133 - - - - - cramReset - toggled(bool) - cramMinInt - setEnabled(bool) - - - 138 - 103 - - - 187 - 168 - - - diff --git a/designer/studyopts.ui b/designer/studyopts.ui deleted file mode 100644 index 113927c58..000000000 --- a/designer/studyopts.ui +++ /dev/null @@ -1,222 +0,0 @@ - - - Dialog - - - - 0 - 0 - 382 - 319 - - - - Study Options - - - - - - - - - - Next day starts at - - - - - - - - 60 - 16777215 - - - - 23 - - - - - - - Learn ahead limit - - - - - - - - 60 - 16777215 - - - - - - - - mins - - - - - - - New cards/day - - - - - - - 999 - - - - - - - - - - - - - - - - Timebox question limit - - - - - - - Timebox time limit - - - - - - - 9999 - - - - - - - 9999 - - - - - - - mins - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Qt::Vertical - - - QDialogButtonBox::Close|QDialogButtonBox::Help - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - More study options are available in the group settings. - - - - - - - newPerDay - newOrder - newSpread - revOrder - dayOffset - lrnCutoff - questionLimit - timeLimit - buttonBox - - - - - buttonBox - accepted() - Dialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Dialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - -