new active/inactive tag handling, new study options screen

- break study options into multiple tabs
- inactive tags removed from menus and accessible via study options now
- save various study options immediately instead of requiring review button to
  be pressed
This commit is contained in:
Damien Elmes 2010-10-19 19:15:21 +09:00
parent d698c3d310
commit 1abb47d973
7 changed files with 726 additions and 402 deletions

View file

@ -86,7 +86,6 @@ class Config(dict):
'showLastCardContent': False,
'showLastCardInterval': False,
'showProgress': True,
'showStudyOptions': False,
'showStudyScreen': True,
'showStudyStats': True,
'showTimer': True,

View file

@ -9,53 +9,33 @@ from ankiqt.ui.utils import saveGeom, restoreGeom
class ActiveTagsChooser(QDialog):
def __init__(self, parent):
def __init__(self, parent, active, inactive):
QDialog.__init__(self, parent, Qt.Window)
self.parent = parent
self.deck = self.parent.deck
self.active = active
self.inactive = inactive
self.dialog = ankiqt.forms.activetags.Ui_Dialog()
self.dialog.setupUi(self)
self.selectAll = QPushButton(_("Select All"))
self.connect(self.selectAll, SIGNAL("clicked()"), self.onSelectAll)
self.dialog.buttonBox.addButton(self.selectAll,
QDialogButtonBox.ActionRole)
self.selectNone = QPushButton(_("Select None"))
self.connect(self.selectNone, SIGNAL("clicked()"), self.onSelectNone)
self.dialog.buttonBox.addButton(self.selectNone,
QDialogButtonBox.ActionRole)
self.invert = QPushButton(_("Invert"))
self.connect(self.invert, SIGNAL("clicked()"), self.onInvert)
self.dialog.buttonBox.addButton(self.invert,
QDialogButtonBox.ActionRole)
self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"),
self.onHelp)
self.rebuildTagList()
restoreGeom(self, "activeTags")
def onSelectAll(self):
self.dialog.list.selectAll()
def onSelectNone(self):
self.dialog.list.clearSelection()
def onInvert(self):
sm = self.dialog.list.selectionModel()
sel = sm.selection()
self.dialog.list.selectAll()
sm.select(sel, QItemSelectionModel.Deselect)
def rebuildTagList(self):
self.tags = self.deck.allTags()
usertags = self.deck.allTags()
self.items = []
self.suspended = {}
alltags = []
# get list of currently suspended
for t in parseTags(self.deck.suspended):
self.suspended[t] = 1
if t not in self.tags:
self.tags.append(t)
# sort and remove special 'Suspended' tag
self.tags.sort()
yes = parseTags(self.deck.getVar(self.active))
no = parseTags(self.deck.getVar(self.inactive))
yesHash = {}
noHash = {}
for y in yes:
yesHash[y] = True
for n in no:
noHash[n] = True
groupedTags = []
usertags.sort()
# render models and templates
for (type, sql, icon) in (
("models", "select tags from models", "contents.png"),
@ -66,60 +46,74 @@ class ActiveTagsChooser(QDialog):
for tag in parseTags(tags):
d[tag] = 1
sortedtags = sorted(d.keys())
alltags.extend(sortedtags)
icon = QIcon(":/icons/" + icon)
for t in sortedtags:
item = QListWidgetItem(icon, t.replace("_", " "))
self.dialog.list.addItem(item)
self.items.append(item)
idx = self.dialog.list.indexFromItem(item)
if t in self.suspended:
mode = QItemSelectionModel.Select
else:
mode = QItemSelectionModel.Deselect
self.dialog.list.selectionModel().select(idx, mode)
groupedTags.append([icon, sortedtags])
# remove from user tags
for tag in alltags:
for tag in groupedTags[0][1] + groupedTags[1][1]:
try:
self.tags.remove(tag)
usertags.remove(tag)
except:
pass
# user tags
icon = QIcon(":/icons/Anki_Fact.png")
for t in self.tags:
groupedTags.append([icon, usertags])
self.tags = []
for (icon, tags) in groupedTags:
for t in tags:
self.tags.append(t)
item = QListWidgetItem(icon, t.replace("_", " "))
self.dialog.list.addItem(item)
self.items.append(item)
idx = self.dialog.list.indexFromItem(item)
if t in self.suspended:
self.dialog.activeList.addItem(item)
if t in yesHash:
mode = QItemSelectionModel.Select
self.dialog.activeCheck.setChecked(True)
else:
mode = QItemSelectionModel.Deselect
self.dialog.list.selectionModel().select(idx, mode)
self.tags = alltags + self.tags
idx = self.dialog.activeList.indexFromItem(item)
self.dialog.activeList.selectionModel().select(idx, mode)
# inactive
item = QListWidgetItem(icon, t.replace("_", " "))
self.dialog.inactiveList.addItem(item)
if t in noHash:
mode = QItemSelectionModel.Select
self.dialog.inactiveCheck.setChecked(True)
else:
mode = QItemSelectionModel.Deselect
idx = self.dialog.inactiveList.indexFromItem(item)
self.dialog.inactiveList.selectionModel().select(idx, mode)
def accept(self):
self.hide()
self.deck.startProgress()
n = 0
suspended = []
for item in self.items:
idx = self.dialog.list.indexFromItem(item)
if self.dialog.list.selectionModel().isSelected(idx):
suspended.append(self.tags[n])
n += 1
self.deck.suspended = canonifyTags(joinTags(suspended))
self.deck.setModified()
self.deck.updateAllPriorities(partial=True, dirty=False)
yes = []
no = []
for c in range(self.dialog.activeList.count()):
# active
item = self.dialog.activeList.item(c)
idx = self.dialog.activeList.indexFromItem(item)
if self.dialog.activeList.selectionModel().isSelected(idx):
yes.append(self.tags[c])
# inactive
item = self.dialog.inactiveList.item(c)
idx = self.dialog.inactiveList.indexFromItem(item)
if self.dialog.inactiveList.selectionModel().isSelected(idx):
no.append(self.tags[c])
if self.dialog.activeCheck.isChecked():
self.deck.setVar(self.active, joinTags(yes))
else:
self.deck.setVar(self.active, "")
if self.dialog.inactiveCheck.isChecked():
self.deck.setVar(self.inactive, joinTags(no))
else:
self.deck.setVar(self.inactive, "")
self.parent.reset()
saveGeom(self, "activeTags")
self.deck.finishProgress()
QDialog.accept(self)
def onHelp(self):
QDesktopServices.openUrl(QUrl(ankiqt.appWiki +
"ActiveTags"))
def show(parent):
at = ActiveTagsChooser(parent)
def show(parent, active, inactive):
at = ActiveTagsChooser(parent, active, inactive)
at.exec_()

View file

@ -62,7 +62,6 @@ class DeckProperties(QDialog):
self.dialog.delay2.setText(unicode(self.d.delay2))
self.dialog.collapse.setCheckState(self.d.collapseTime
and Qt.Checked or Qt.Unchecked)
self.dialog.failedCardMax.setText(unicode(self.d.failedCardMax))
self.dialog.perDay.setCheckState(self.d.getBool("perDay")
and Qt.Checked or Qt.Unchecked)
# sources
@ -245,10 +244,6 @@ class DeckProperties(QDialog):
self.updateField(self.d, 'delay1', v2)
v = float(self.dialog.delay2.text())
self.updateField(self.d, 'delay2', min(v, 1))
v = int(self.dialog.failedCardMax.text())
if v == 1 or v < 0:
v = 2
self.updateField(self.d, 'failedCardMax', v)
except ValueError:
pass
try:

View file

@ -826,6 +826,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
##########################################################################
def onClose(self):
# allow focusOut to save
if self.inMainWindow() or not self.app.activeWindow():
isCram = self.isCramming()
self.saveAndClose(hideWelcome=isCram)
@ -836,6 +837,8 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
def saveAndClose(self, hideWelcome=False, parent=None):
"(Auto)save and close. Prompt if necessary. True if okay to proceed."
# allow any focusOut()s to run first
self.setFocus()
if not parent:
parent = self
self.hideWelcome = hideWelcome
@ -1465,6 +1468,7 @@ later by using File>Close.
##########################################################################
def setupStudyScreen(self):
self.mainWin.buttonStack.hide()
self.mainWin.newCardOrder.insertItems(
0, QStringList(newCardOrderLabels().values()))
self.mainWin.newCardScheduling.insertItems(
@ -1475,9 +1479,10 @@ later by using File>Close.
SIGNAL("clicked()"),
lambda: QDesktopServices.openUrl(QUrl(
ankiqt.appWiki + "StudyOptions")))
self.mainWin.optionsBox.setShown(False)
self.connect(self.mainWin.minuteLimit,
SIGNAL("textChanged(QString)"), self.onMinuteLimitChanged)
self.connect(self.mainWin.questionLimit,
SIGNAL("textChanged(QString)"), self.onQuestionLimitChanged)
self.connect(self.mainWin.newPerDay,
SIGNAL("textChanged(QString)"), self.onNewLimitChanged)
self.connect(self.mainWin.startReviewingButton,
@ -1485,6 +1490,37 @@ later by using File>Close.
self.onStartReview)
self.connect(self.mainWin.newCardOrder,
SIGNAL("activated(int)"), self.onNewCardOrderChanged)
self.connect(self.mainWin.advancedOptions,
SIGNAL("clicked()"),
self.onAdvancedOptions)
self.connect(self.mainWin.failedCardMax,
SIGNAL("editingFinished()"),
self.onFailedMaxChanged)
self.connect(self.mainWin.newCategories,
SIGNAL("clicked()"), self.onNewCategoriesClicked)
self.connect(self.mainWin.revCategories,
SIGNAL("clicked()"), self.onRevCategoriesClicked)
def onNewCategoriesClicked(self):
ui.activetags.show(self, "newActive", "newInactive")
def onRevCategoriesClicked(self):
ui.activetags.show(self, "revActive", "revInactive")
def onFailedMaxChanged(self):
try:
v = int(self.mainWin.failedCardMax.text())
if v == 1 or v < 0:
v = 2
self.deck.failedCardMax = v
except ValueError:
pass
self.mainWin.failedCardMax.setText(str(self.deck.failedCardMax))
self.deck.flushMod()
def onAdvancedOptions(self):
self.onDeckProperties()
self.deckProperties.dialog.qtabwidget.setCurrentIndex(2)
def onMinuteLimitChanged(self, qstr):
try:
@ -1497,6 +1533,17 @@ later by using File>Close.
self.deck.flushMod()
self.updateStudyStats()
def onQuestionLimitChanged(self, qstr):
try:
val = int(self.mainWin.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.mainWin.newPerDay.text())
@ -1531,15 +1578,28 @@ later by using File>Close.
self.deck.finishProgress()
uf(self.deck, 'newCardOrder', ncOrd)
def updateActives(self):
labels = [
u"Show All Due Cards",
u"Show Chosen Categories"
]
if self.deck.getVar("newActive") or self.deck.getVar("newInactive"):
new = labels[1]
else:
new = labels[0]
self.mainWin.newCategoryLabel.setText(new)
if self.deck.getVar("revActive") or self.deck.getVar("revInactive"):
rev = labels[1]
else:
rev = labels[0]
self.mainWin.revCategoryLabel.setText(rev)
def updateStudyStats(self):
self.deck.reset()
self.updateActives()
wasReached = self.deck.sessionLimitReached()
sessionColour = '<font color=#0000ff>%s</font>'
cardColour = '<font color=#0000ff>%s</font>'
if not wasReached:
top = _("<h1>Study Options</h1>")
else:
top = _("<h1>Well done!</h1>")
# top label
h = {}
s = self.deck.getStats()
@ -1574,15 +1634,15 @@ day = :d""", d=yesterday)
anki.utils.fmtTimeSpan(ttoday, short=True, point=1))
h['timeTodayChg'] = str(anki.utils.fmtTimeSpan(
tyest, short=True, point=1))
h['cs_header'] = _("Cards/session:")
h['cd_header'] = _("Cards/day:")
h['td_header'] = _("Time/day:")
h['rd_header'] = _("Reviews due:")
h['ntod_header'] = _("New today:")
h['ntot_header'] = _("New total:")
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=80>%(cs_header)s</td><td width=50><b>%(repsInSesChg)s</b></td>
<tr><td width=190>%(cs_header)s</td><td width=50><b>%(repsInSesChg)s</b></td>
<td><b>%(repsInSes)s</b></td></tr>
<tr><td>%(cd_header)s</td><td><b>%(repsTodayChg)s</b></td>
<td><b>%(repsToday)s</b></td></tr>
@ -1592,7 +1652,7 @@ day = :d""", d=yesterday)
stats2 = ("""\
<table>
<tr><td width=100>%(rd_header)s</td><td align=right><b>%(ret)s</b></td></tr>
<tr><td width=220>%(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
@ -1603,10 +1663,11 @@ day = :d""", d=yesterday)
self.haveYesterday = True
stats1 = (
"<td>%s</td><td>&nbsp;&nbsp;&nbsp;&nbsp;</td>" % stats1)
self.mainWin.optionsLabel.setText(top + """\
self.mainWin.optionsLabel.setText("""\
<p><table><tr>
%s
<td>%s</td></tr></table>""" % (stats1, stats2))
</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)")
@ -1632,22 +1693,12 @@ learnt today")
def showStudyScreen(self):
# forget last card
self.lastCard = None
self.mainWin.optionsButton.setChecked(self.config['showStudyOptions'])
self.mainWin.optionsBox.setShown(self.config['showStudyOptions'])
self.switchToStudyScreen()
self.updateStudyStats()
# start reviewing button
self.mainWin.buttonStack.hide()
if self.reviewingStarted:
self.mainWin.startReviewingButton.setText(_("Continue &Reviewing"))
else:
self.mainWin.startReviewingButton.setText(_("Start &Reviewing"))
self.mainWin.startReviewingButton.setFocus()
self.setupStudyOptions()
self.mainWin.studyOptionsFrame.setFixedWidth(300)
self.mainWin.studyOptionsFrame.show()
if self.haveYesterday:
size = self.mainWin.optionsLabel.sizeHint().width() + 50
self.mainWin.studyOptionsFrame.setFixedWidth(size)
def setupStudyOptions(self):
self.mainWin.newPerDay.setText(str(self.deck.newCardsPerDay))
@ -1666,6 +1717,7 @@ learnt today")
labels = failedCardOptionLabels().values()[0:-1]
self.mainWin.failedCardsOption.insertItems(0, labels)
self.mainWin.failedCardsOption.setCurrentIndex(self.deck.getFailedCardPolicy())
self.mainWin.failedCardMax.setText(unicode(self.deck.failedCardMax))
def onStartReview(self):
def uf(obj, field, value):
@ -1675,15 +1727,6 @@ learnt today")
self.mainWin.studyOptionsFrame.hide()
# make sure the size is updated before button stack shown
self.app.processEvents()
self.config['showStudyOptions'] = self.mainWin.optionsButton.isChecked()
try:
uf(self.deck, 'newCardsPerDay', int(self.mainWin.newPerDay.text()))
uf(self.deck, 'sessionTimeLimit', min(float(
self.mainWin.minuteLimit.text()), 3600) * 60)
uf(self.deck, 'sessionRepLimit',
int(self.mainWin.questionLimit.text()))
except (ValueError, OverflowError):
pass
uf(self.deck, 'newCardSpacing',
self.mainWin.newCardScheduling.currentIndex())
uf(self.deck, 'revCardOrder',
@ -1890,9 +1933,6 @@ will be lost when you close the deck."""))
def onDonate(self):
QDesktopServices.openUrl(QUrl(ankiqt.appDonate))
def onActiveTags(self):
ui.activetags.show(self)
# Importing & exporting
##########################################################################
@ -2374,7 +2414,6 @@ Are you sure?""" % deckName),
"Graphs",
"Dstats",
"Cstats",
"ActiveTags",
"StudyOptions",
)
@ -2426,7 +2465,6 @@ Are you sure?""" % deckName),
self.connect(m.actionOpenPluginFolder, s, self.onOpenPluginFolder)
self.connect(m.actionEnableAllPlugins, s, self.onEnableAllPlugins)
self.connect(m.actionDisableAllPlugins, s, self.onDisableAllPlugins)
self.connect(m.actionActiveTags, s, self.onActiveTags)
self.connect(m.actionReleaseNotes, s, self.onReleaseNotes)
self.connect(m.actionCacheLatex, s, self.onCacheLatex)
self.connect(m.actionUncacheLatex, s, self.onUncacheLatex)
@ -2980,8 +3018,6 @@ Consider backing up your media directory first."""))
def changeLayoutSpacing(self):
if sys.platform.startswith("darwin"):
self.mainWin.studyOptionsReviewBar.setContentsMargins(0, 20, 0, 0)
self.mainWin.optionsBox.layout().setSpacing(10)
self.mainWin.optionsBox.layout().setContentsMargins(4, 10, 4, 4)
# Proxy support
##########################################################################

View file

@ -11,28 +11,49 @@
</rect>
</property>
<property name="windowTitle">
<string>Inactive Tags</string>
<string>Selective Study</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="activeCheck">
<property name="text">
<string>Cards with any of the selected tags below will not be shown.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
<string>Show only cards with these tags:</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListWidget" name="list">
<widget class="QListWidget" name="activeList">
<property name="enabled">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="inactiveCheck">
<property name="text">
<string>Hide cards with these tags:</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="inactiveList">
<property name="enabled">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
@ -56,8 +77,8 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
<x>358</x>
<y>264</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
@ -81,5 +102,37 @@
</hint>
</hints>
</connection>
<connection>
<sender>activeCheck</sender>
<signal>toggled(bool)</signal>
<receiver>activeList</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>133</x>
<y>18</y>
</hint>
<hint type="destinationlabel">
<x>133</x>
<y>85</y>
</hint>
</hints>
</connection>
<connection>
<sender>inactiveCheck</sender>
<signal>toggled(bool)</signal>
<receiver>inactiveList</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>146</x>
<y>213</y>
</hint>
<hint type="destinationlabel">
<x>68</x>
<y>276</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -486,40 +486,14 @@
</item>
<item>
<layout class="QGridLayout" name="gridLayout_5">
<item row="1" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>&lt;b&gt;Maximum failed cards&lt;/b&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<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>
<item row="1" column="2">
<widget class="QLineEdit" name="failedCardMax"/>
</item>
<item row="3" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
<string>&lt;b&gt;New day starts at&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="2" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -532,7 +506,7 @@
</property>
</spacer>
</item>
<item row="3" column="2">
<item row="2" column="2">
<widget class="QLineEdit" name="timeOffset"/>
</item>
<item row="0" column="0">
@ -565,38 +539,38 @@
</property>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>&lt;b&gt;Suspend leeches&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="4" column="2">
<item row="3" column="2">
<widget class="QCheckBox" name="suspendLeeches">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<item row="4" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>&lt;b&gt;Leech failure threshold&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="5" column="2">
<item row="4" column="2">
<widget class="QSpinBox" name="leechFails"/>
</item>
<item row="6" column="0">
<item row="1" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>&lt;b&gt;Per-day scheduling&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="6" column="2">
<item row="1" column="2">
<widget class="QCheckBox" name="perDay">
<property name="text">
<string/>
@ -658,11 +632,10 @@
<tabstop>easyMin</tabstop>
<tabstop>easyMax</tabstop>
<tabstop>collapse</tabstop>
<tabstop>failedCardMax</tabstop>
<tabstop>perDay</tabstop>
<tabstop>timeOffset</tabstop>
<tabstop>suspendLeeches</tabstop>
<tabstop>leechFails</tabstop>
<tabstop>perDay</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>

View file

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>617</width>
<width>605</width>
<height>563</height>
</rect>
</property>
@ -774,30 +774,23 @@
<item>
<widget class="QFrame" name="studyOptionsFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_11">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>10</number>
<number>0</number>
</property>
<item>
<widget class="QLabel" name="optionsLabel">
<property name="text">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
@ -815,25 +808,37 @@
</spacer>
</item>
<item>
<widget class="Line" name="line_2">
<property name="maximumSize">
<size>
<width>400</width>
<height>16777215</height>
</size>
<widget class="QTabWidget" name="tabWidget">
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<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_19">
<property name="leftMargin">
<number>15</number>
</property>
<property name="topMargin">
<number>15</number>
</property>
<property name="rightMargin">
<number>15</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="studyOptionsLayout1">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>6</number>
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>0</number>
@ -841,7 +846,374 @@
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_22">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>The maximum number of &lt;b&gt;new cards shown per day&lt;/b&gt;. The default is 20, to ensure you don't get overwhelmed with reviews after a few days.</string>
</property>
<property name="text">
<string>&lt;b&gt;New Cards/Day:&lt;/b&gt;</string>
</property>
<property name="margin">
<number>0</number>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="newPerDay">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_12">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>&lt;b&gt;Display Order:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="newCardOrder"/>
</item>
<item>
<widget class="QComboBox" name="newCardScheduling"/>
</item>
<item>
<spacer name="verticalSpacer_14">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>&lt;b&gt;Selective Study:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="2">
<widget class="QPushButton" name="newCategories">
<property name="text">
<string>&amp;Change</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="newCategoryLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</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>15</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Reviews</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="leftMargin">
<number>15</number>
</property>
<property name="topMargin">
<number>15</number>
</property>
<property name="rightMargin">
<number>15</number>
</property>
<property name="bottomMargin">
<number>8</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>&lt;b&gt;Max Failed Cards:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<widget class="QLineEdit" name="failedCardMax">
<property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_15">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>&lt;b&gt;Display Order:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="revCardOrder"/>
</item>
<item>
<widget class="QComboBox" name="failedCardsOption"/>
</item>
<item>
<spacer name="verticalSpacer_16">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>&lt;b&gt;Selective Study:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_7">
<item row="1" column="2">
<widget class="QPushButton" name="revCategories">
<property name="text">
<string>&amp;Change</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="revCategoryLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_11">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>15</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QPushButton" name="advancedOptions">
<property name="text">
<string>&amp;Advanced</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Timeboxing</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_20">
<property name="leftMargin">
<number>15</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>15</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLabel" name="optionsLabel">
<property name="text">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_5">
<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>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_20">
<property name="minimumSize">
<size>
@ -860,7 +1232,7 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="0" column="1">
<widget class="QLineEdit" name="minuteLimit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@ -876,55 +1248,20 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_22">
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>The maximum number of &lt;b&gt;new cards shown per day&lt;/b&gt;. The default is 20, to ensure you don't get overwhelmed with reviews after a few days.</string>
<string>The &lt;b&gt;number of questions in a session&lt;/b&gt;. When a session is finished, this screen will be shown again, allowing you to start another session. Choose 0 for no limit.</string>
</property>
<property name="text">
<string>&lt;b&gt;New cards per day:&lt;/b&gt;</string>
<string>&lt;b&gt;Session limit (questions):&lt;/b&gt;</string>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="newPerDay">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<item row="1" column="1">
<widget class="QLineEdit" name="questionLimit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@ -940,60 +1277,34 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>The &lt;b&gt;number of questions in a session&lt;/b&gt;. When a session is finished, this screen will be shown again, allowing you to start another session. Choose 0 for no limit.</string>
</layout>
</item>
<item>
<spacer name="verticalSpacer_13">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="text">
<string>&lt;b&gt;Session limit (questions):&lt;/b&gt;</string>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="margin">
<number>4</number>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>15</height>
</size>
</property>
</widget>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QWidget" name="optionsBox" native="true">
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>10</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QComboBox" name="newCardOrder"/>
</item>
<item>
<widget class="QComboBox" name="newCardScheduling"/>
</item>
<item>
<widget class="QComboBox" name="revCardOrder"/>
</item>
<item>
<widget class="QComboBox" name="failedCardsOption"/>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QGridLayout" name="studyOptionsReviewBar">
<property name="topMargin">
<number>20</number>
<number>10</number>
</property>
<property name="horizontalSpacing">
<number>10</number>
@ -1028,28 +1339,6 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="optionsButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>26</height>
</size>
</property>
<property name="text">
<string>More</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="optionsHelpButton">
<property name="minimumSize">
<size>
@ -2715,7 +3004,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>617</width>
<width>605</width>
<height>20</height>
</rect>
</property>
@ -2835,8 +3124,6 @@
<addaction name="menuStartup"/>
<addaction name="separator"/>
</widget>
<addaction name="actionActiveTags"/>
<addaction name="separator"/>
<addaction name="actionStudyOptions"/>
<addaction name="actionDisplayProperties"/>
<addaction name="actionDeckProperties"/>
@ -3476,51 +3763,38 @@
</action>
</widget>
<tabstops>
<tabstop>newPerDay</tabstop>
<tabstop>minuteLimit</tabstop>
<tabstop>questionLimit</tabstop>
<tabstop>newCardOrder</tabstop>
<tabstop>newCardScheduling</tabstop>
<tabstop>revCardOrder</tabstop>
<tabstop>failedCardsOption</tabstop>
<tabstop>startReviewingButton</tabstop>
<tabstop>optionsButton</tabstop>
<tabstop>optionsHelpButton</tabstop>
<tabstop>easeButton3</tabstop>
<tabstop>easeButton4</tabstop>
<tabstop>learnMoreButton</tabstop>
<tabstop>reviewEarlyButton</tabstop>
<tabstop>finishButton</tabstop>
<tabstop>downloadDeckButton</tabstop>
<tabstop>newDeckButton</tabstop>
<tabstop>importDeckButton</tabstop>
<tabstop>newPerDay</tabstop>
<tabstop>newCardOrder</tabstop>
<tabstop>newCardScheduling</tabstop>
<tabstop>newCategories</tabstop>
<tabstop>startReviewingButton</tabstop>
<tabstop>optionsHelpButton</tabstop>
<tabstop>failedCardMax</tabstop>
<tabstop>revCardOrder</tabstop>
<tabstop>failedCardsOption</tabstop>
<tabstop>revCategories</tabstop>
<tabstop>advancedOptions</tabstop>
<tabstop>minuteLimit</tabstop>
<tabstop>questionLimit</tabstop>
<tabstop>welcomeText</tabstop>
<tabstop>saveEditorButton</tabstop>
<tabstop>easeButton1</tabstop>
<tabstop>easeButton2</tabstop>
<tabstop>easeButton3</tabstop>
<tabstop>easeButton4</tabstop>
<tabstop>saveEditorButton</tabstop>
<tabstop>showAnswerButton</tabstop>
<tabstop>help</tabstop>
<tabstop>noticeButton</tabstop>
<tabstop>welcomeText</tabstop>
<tabstop>tabWidget</tabstop>
</tabstops>
<resources>
<include location="../icons.qrc"/>
</resources>
<connections>
<connection>
<sender>optionsButton</sender>
<signal>toggled(bool)</signal>
<receiver>optionsBox</receiver>
<slot>setShown(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>218</x>
<y>250</y>
</hint>
<hint type="destinationlabel">
<x>222</x>
<y>300</y>
</hint>
</hints>
</connection>
</connections>
<connections/>
</ui>