cram creation & config

This commit is contained in:
Damien Elmes 2012-03-13 19:02:39 +09:00
parent 84fc02901d
commit 8fd29bed1c
5 changed files with 308 additions and 7 deletions

View file

@ -38,6 +38,8 @@ class DeckBrowser(object):
self._onShared()
elif cmd == "import":
self.mw.onImport()
elif cmd == "cram":
self.mw.onCram()
elif cmd == "drag":
draggedDeckDid, ontoDeckDid = arg.split(',')
self._dragDeckOnto(draggedDeckDid, ontoDeckDid)
@ -220,6 +222,7 @@ Are you sure you wish to delete all of the cards in %s?""")%deck['name']):
links = [
["shared", _("Get Shared")],
["import", _("Import File")],
["cram", _("Cram")],
]
buf = ""
for b in links:

91
aqt/dyndeckconf.py Normal file
View file

@ -0,0 +1,91 @@
# 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 aqt, simplejson
from anki.utils import ids2str
from aqt.utils import showInfo, showWarning, openHelp, getOnlyText
from operator import itemgetter
class DeckConf(QDialog):
def __init__(self, mw):
QDialog.__init__(self, mw)
self.mw = mw
self.deck = self.mw.col.decks.current()
self.form = aqt.forms.dyndconf.Ui_Dialog()
self.form.setupUi(self)
self.mw.checkpoint(_("Options"))
self.setWindowModality(Qt.WindowModal)
self.connect(self.form.buttonBox,
SIGNAL("helpRequested()"),
lambda: openHelp("deckoptions"))
self.setWindowTitle(_("Options for %s") % self.deck['name'])
self.setupCombos()
self.loadConf()
self.exec_()
def setupCombos(self):
import anki.consts as cs
f = self.form
f.order.addItems(cs.dynOrderLabels().values())
def loadConf(self):
f = self.form
d = self.deck
f.search.setText(d['search'])
f.steps.setText(self.listToUser(d['delays']))
f.order.setCurrentIndex(d['order'])
f.limit.setValue(d['limit'])
f.fmult.setValue(d['fmult']*100)
def saveConf(self):
f = self.form
d = self.deck
steps = self.userToList(f.steps)
if not steps:
return
d['steps'] = steps
d['search'] = f.search.text()
d['order'] = f.order.currentIndex()
d['limit'] = f.limit.value()
d['fmult'] = f.fmult.value() / 100.0
self.mw.col.decks.save(d)
return True
def reject(self):
self.accept()
def accept(self):
if not self.saveConf():
return
self.mw.col.sched.rebuildDyn()
self.mw.reset()
QDialog.accept(self)
# Step load/save - fixme: share with std options screen
########################################################
def listToUser(self, l):
return " ".join([str(x) for x in l])
def userToList(self, w, minSize=1):
items = unicode(w.text()).split(" ")
ret = []
for i in items:
if not i:
continue
try:
i = float(i)
assert i > 0
if i == int(i):
i = int(i)
ret.append(i)
except:
# invalid, don't update
showWarning(_("Steps must be numbers."))
return
if len(ret) < minSize:
showWarning(_("At least one step is required."))
return
return ret

View file

@ -672,8 +672,12 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
self.cardStats = aqt.stats.CardStats(self)
def onDeckConf(self):
import aqt.deckconf
aqt.deckconf.DeckConf(self)
if self.col.decks.current()['dyn']:
import aqt.dyndeckconf
aqt.dyndeckconf.DeckConf(self)
else:
import aqt.deckconf
aqt.deckconf.DeckConf(self)
def onOverview(self):
self.col.reset()
@ -710,6 +714,24 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
import aqt.exporting
aqt.exporting.ExportDialog(self)
# Cramming
##########################################################################
def onCram(self):
n = 1
decks = self.col.decks.allNames()
while _("Cram %d") % n in decks:
n += 1
name = _("Cram %d") % n
name = getOnlyText(_("Please name your cram deck."), default=name)
if not name:
return
if name in decks:
showWarning(_("The provided name was already in use."))
return
did = self.col.decks.newDyn(name)
self.onDeckConf()
# Language handling
##########################################################################

View file

@ -39,10 +39,6 @@ class Overview(object):
self.mw.moveToState("review")
elif url == "anki":
print "anki menu"
elif url == "cram":
return showInfo("not yet implemented")
#self.mw.col.cramGroups()
#self.mw.moveToState("review")
elif url == "opts":
self.mw.onDeckConf()
elif url == "decks":
@ -144,7 +140,6 @@ text-align: left;
def _renderBottom(self):
links = [
["opts", _("Options")],
["cram", _("Cram")],
]
buf = ""
for b in links:

190
designer/dyndconf.ui Normal file
View file

@ -0,0 +1,190 @@
<?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>397</width>
<height>293</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="1">
<widget class="QSpinBox" name="limit">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999</number>
</property>
</widget>
</item>
<item row="4" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Search for:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Learning steps:</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Card limit:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="fmult">
<property name="maximum">
<number>100</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Display order:</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Example: deck:french tag:hard</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Interval on fail:</string>
</property>
</widget>
</item>
<item row="5" column="3">
<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="2" column="1" colspan="3">
<widget class="QLineEdit" name="steps"/>
</item>
<item row="0" column="1" colspan="3">
<widget class="QLineEdit" name="search"/>
</item>
<item row="3" column="1" colspan="3">
<widget class="QComboBox" name="order"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>search</tabstop>
<tabstop>steps</tabstop>
<tabstop>order</tabstop>
<tabstop>limit</tabstop>
<tabstop>fmult</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>