diff --git a/anki.bat b/anki.bat
old mode 100644
new mode 100755
diff --git a/aqt/about.py b/aqt/about.py
index 3755aea85..5a8f9b2cf 100644
--- a/aqt/about.py
+++ b/aqt/about.py
@@ -29,13 +29,13 @@ Duggan, Matthew Holtz, Meelis Vasser, Michael Penkov, Michael Keppler, Michal
Petr Michalec, Piotr Kubowicz, Richard Colley, Samson Melamed, Stefaan
De Pooter, Susanna Björverud, Tacutu, Timm Preetz, Timo Paulssen, Ursus, Victor
Suba, and Xtru.
-
-Anki icon by Alex Fraser (CC GNU GPL)
-Deck icon by Laurent Baumann (CC BY-NC-SA 3.0)
-Deck browser icons from:
-http://led24.de/iconset
-http://p.yusukekamiyamane.com/
-Other icons under LGPL or public domain.
+
+Anki icon by Alex Fraser (CC GNU GPL)
+Deck icon by Laurent Baumann (CC BY-NC-SA 3.0)
+Deck browser icons from:
+http://led24.de/iconset
+http://p.yusukekamiyamane.com/
+Other icons under LGPL or public domain.
"""
}
diff --git a/aqt/addcards.py b/aqt/addcards.py
index 01ca8ac90..27b5a9c91 100644
--- a/aqt/addcards.py
+++ b/aqt/addcards.py
@@ -9,7 +9,7 @@ import anki
from anki.errors import *
from anki.utils import stripHTML
from aqt.utils import saveGeom, restoreGeom, showWarning, askUser, shortcut, \
- tooltip
+ tooltip, openHelp
from anki.sound import clearAudioQueue
from anki.hooks import addHook, removeHook
from anki.utils import stripHTMLMedia, isMac
@@ -46,7 +46,7 @@ class AddCards(QDialog):
self.mw, self.form.modelArea)
def helpRequested(self):
- aqt.openHelp("AddItems")
+ openHelp("AddItems")
def setupButtons(self):
bb = self.form.buttonBox
diff --git a/aqt/browser.py b/aqt/browser.py
index 2c36b3de7..0bd8de803 100644
--- a/aqt/browser.py
+++ b/aqt/browser.py
@@ -10,7 +10,7 @@ import anki, anki.utils, aqt.forms
from anki.utils import fmtTimeSpan, ids2str, stripHTMLMedia, isWin, intTime
from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \
saveHeader, restoreHeader, saveState, restoreState, applyStyles, getTag, \
- showInfo, askUser, tooltip
+ showInfo, askUser, tooltip, openHelp
from anki.errors import *
from anki.db import *
from anki.hooks import runHook, addHook, removeHook
@@ -69,7 +69,7 @@ class DataModel(QAbstractTableModel):
return
if role == Qt.FontRole:
f = QFont()
- f.setPixelSize(self.browser.mw.config['editFontSize'])
+ f.setPixelSize(self.browser.mw.pm.profile['editFontSize'])
return f
if role == Qt.TextAlignmentRole:
align = Qt.AlignVCenter
@@ -112,7 +112,7 @@ class DataModel(QAbstractTableModel):
# the db progress handler may cause a refresh, so we need to zero out
# old data first
self.cards = []
- self.cards = self.col.findCards(txt, self.browser.mw.config['fullSearch'])
+ self.cards = self.col.findCards(txt, self.browser.mw.pm.profile['fullSearch'])
print "fetch cards in %dms" % ((time.time() - t)*1000)
if reset:
self.endReset()
@@ -332,8 +332,8 @@ class Browser(QMainWindow):
self.onSearch()
def setupToolbar(self):
- self.form.toolBar.setIconSize(QSize(self.mw.config['iconSize'],
- self.mw.config['iconSize']))
+ self.form.toolBar.setIconSize(QSize(self.mw.pm.profile['iconSize'],
+ self.mw.pm.profile['iconSize']))
self.form.toolBar.toggleViewAction().setText(_("Toggle Toolbar"))
def setupMenus(self):
@@ -372,10 +372,10 @@ class Browser(QMainWindow):
def updateFont(self):
self.form.tableView.setFont(QFont(
- self.mw.config['editFontFamily'],
- self.mw.config['editFontSize']))
+ self.mw.pm.profile['editFontFamily'],
+ self.mw.pm.profile['editFontSize']))
self.form.tableView.verticalHeader().setDefaultSectionSize(
- self.mw.config['editLineSize'])
+ self.mw.pm.profile['editLineSize'])
def closeEvent(self, evt):
saveSplitter(self.form.splitter_2, "editor2")
@@ -432,7 +432,7 @@ class Browser(QMainWindow):
self.onSearch)
self.setTabOrder(self.form.searchEdit, self.form.tableView)
self.compModel = QStringListModel()
- self.compModel.setStringList(self.mw.config['searchHistory'])
+ self.compModel.setStringList(self.mw.pm.profile['searchHistory'])
self.searchComp = QCompleter(self.compModel, self.form.searchEdit)
self.searchComp.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
self.searchComp.setCaseSensitivity(Qt.CaseInsensitive)
@@ -441,18 +441,18 @@ class Browser(QMainWindow):
def onSearch(self, reset=True):
"Careful: if reset is true, the current note is saved."
txt = unicode(self.form.searchEdit.text()).strip()
- sh = self.mw.config['searchHistory']
+ sh = self.mw.pm.profile['searchHistory']
if txt not in sh:
sh.insert(0, txt)
sh = sh[:30]
self.compModel.setStringList(sh)
- self.mw.config['searchHistory'] = sh
+ self.mw.pm.profile['searchHistory'] = sh
self.model.search(txt, reset)
if not self.model.cards:
# no row change will fire
self.onRowChanged(None, None)
txt = _("No matches found.")
- if not self.mw.config['fullSearch']:
+ if not self.mw.pm.profile['fullSearch']:
txt += "
" + _(
_("If your cards have formatting, you may want "
"to enable 'search within formatting' in the "
@@ -834,7 +834,7 @@ where id in %s""" % ids2str(sf))
return sf
def onHelp(self):
- aqt.openHelp("Browser")
+ openHelp("Browser")
# Misc menu options
######################################################################
@@ -1066,18 +1066,18 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
frm = aqt.forms.browseropts.Ui_Dialog()
frm.setupUi(d)
frm.fontCombo.setCurrentFont(QFont(
- self.mw.config['editFontFamily']))
- frm.fontSize.setValue(self.mw.config['editFontSize'])
- frm.lineSize.setValue(self.mw.config['editLineSize'])
- frm.fullSearch.setChecked(self.mw.config['fullSearch'])
+ self.mw.pm.profile['editFontFamily']))
+ frm.fontSize.setValue(self.mw.pm.profile['editFontSize'])
+ frm.lineSize.setValue(self.mw.pm.profile['editLineSize'])
+ frm.fullSearch.setChecked(self.mw.pm.profile['fullSearch'])
if d.exec_():
- self.mw.config['editFontFamily'] = (
+ self.mw.pm.profile['editFontFamily'] = (
unicode(frm.fontCombo.currentFont().family()))
- self.mw.config['editFontSize'] = (
+ self.mw.pm.profile['editFontSize'] = (
int(frm.fontSize.value()))
- self.mw.config['editLineSize'] = (
+ self.mw.pm.profile['editLineSize'] = (
int(frm.lineSize.value()))
- self.mw.config['fullSearch'] = frm.fullSearch.isChecked()
+ self.mw.pm.profile['fullSearch'] = frm.fullSearch.isChecked()
self.updateFont()
# Edit: replacing
@@ -1130,7 +1130,7 @@ where id in %s""" % ids2str(self.selectedCards()), mod)
})
def onFindReplaceHelp(self):
- aqt.openHelp("Browser#FindReplace")
+ openHelp("Browser#FindReplace")
# Edit: finding dupes
######################################################################
@@ -1311,7 +1311,7 @@ select id from cards where nid in %s and ord in %s""" % (
self.browser.onSearch()
def onHelp(self):
- aqt.openHelp("Browser#GenerateCards")
+ openHelp("Browser#GenerateCards")
# Change model dialog
######################################################################
@@ -1477,4 +1477,4 @@ Are you sure you want to continue?""")):
return QDialog.accept(self)
def onHelp(self):
- aqt.openHelp("Browser#ChangeModel")
+ openHelp("Browser#ChangeModel")
diff --git a/aqt/clayout.py b/aqt/clayout.py
index 2298fde8d..b6fa7e4d7 100644
--- a/aqt/clayout.py
+++ b/aqt/clayout.py
@@ -7,439 +7,217 @@ from anki.consts import *
import aqt
from anki.sound import playFromText, clearAudioQueue
from aqt.utils import saveGeom, restoreGeom, getBase, mungeQA, \
- saveSplitter, restoreSplitter, showInfo, askUser, getText
+ saveSplitter, restoreSplitter, showInfo, askUser, getOnlyText, \
+ showWarning, openHelp
from anki.utils import isMac, isWin
import aqt.templates
-# fixme: replace font substitutions with native comma list
-
-class ResizingTextEdit(QTextEdit):
- def sizeHint(self):
- return QSize(200, 800)
+# raise Exception("Remember to disallow media&latex refs in edit.")
class CardLayout(QDialog):
- # type is previewCards() type
- def __init__(self, mw, note, type=0, ord=0, parent=None):
+ def __init__(self, mw, note, ord=0, parent=None):
QDialog.__init__(self, parent or mw, Qt.Window)
- raise Exception("Remember to disallow media&latex refs in edit.")
self.mw = aqt.mw
self.parent = parent or mw
self.note = note
- self.type = type
self.ord = ord
self.col = self.mw.col
self.mm = self.mw.col.models
self.model = note.model()
- self.form = aqt.forms.clayout.Ui_Dialog()
- self.form.setupUi(self)
+ self.setupTabs()
self.setWindowTitle(_("%s Layout") % self.model['name'])
- self.plastiqueStyle = None
- if isMac or isWin:
- self.plastiqueStyle = QStyleFactory.create("plastique")
- self.connect(self.form.buttonBox, SIGNAL("helpRequested()"),
+ v1 = QVBoxLayout()
+ v1.addWidget(self.tabs)
+ self.bbox = QDialogButtonBox(
+ QDialogButtonBox.Close|QDialogButtonBox.Help)
+ v1.addWidget(self.bbox)
+ self.setLayout(v1)
+
+ self.connect(self.bbox, SIGNAL("helpRequested()"),
self.onHelp)
- self.setupCards()
- self.setupFields()
- self.form.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False)
- self.form.buttonBox.button(QDialogButtonBox.Close).setAutoDefault(False)
- restoreSplitter(self.form.splitter, "clayout")
+ self.bbox.button(QDialogButtonBox.Help).setAutoDefault(False)
+ self.bbox.button(QDialogButtonBox.Close).setAutoDefault(False)
+ self.mw.checkpoint(_("Card Layout"))
+ self.redraw()
restoreGeom(self, "CardLayout")
- if not self.reload(first=True):
- return
self.exec_()
- def reload(self, first=False):
- self.cards = self.col.previewCards(self.note, self.type)
- if not self.cards:
- self.accept()
- if first:
- showInfo(_("Please enter some text first."))
- else:
- showInfo(_("The current note was deleted."))
- return
- self.fillCardList()
- self.fillFieldList()
- self.fieldChanged()
- self.readField()
- return True
+ def redraw(self):
+ self.cards = self.col.previewCards(self.note, 2)
+ self.redrawing = True
+ self.updateTabs()
+ self.redrawing = False
+ self.selectCard(self.ord)
+
+ def setupTabs(self):
+ c = self.connect
+ self.tabs = QTabWidget()
+ self.tabs.setTabsClosable(True)
+ self.tabs.setUsesScrollButtons(True)
+ add = QPushButton("+")
+ add.setFixedWidth(30)
+ c(add, SIGNAL("clicked()"), self.onAddCard)
+ self.tabs.setCornerWidget(add)
+ c(self.tabs, SIGNAL("currentChanged(int)"), self.selectCard)
+ c(self.tabs, SIGNAL("tabCloseRequested(int)"), self.onRemoveTab)
+
+ def updateTabs(self):
+ self.forms = []
+ self.tabs.clear()
+ for t in self.model['tmpls']:
+ self.addTab(t)
+
+ def addTab(self, t):
+ c = self.connect
+ w = QWidget()
+ h = QHBoxLayout()
+ h.addStretch()
+ rename = QPushButton("Rename")
+ c(rename, SIGNAL("clicked()"), self.onRename)
+ h.addWidget(rename)
+ order = QPushButton(_("Reposition"))
+ h.addWidget(order)
+ c(order, SIGNAL("clicked()"), self.onReorder)
+ h.addStretch()
+ v = QVBoxLayout()
+ v.setMargin(3)
+ v.setSpacing(3)
+ v.addLayout(h)
+ l = QHBoxLayout()
+ l.setMargin(0)
+ l.setSpacing(3)
+ left = QWidget()
+ # template area
+ tform = aqt.forms.template.Ui_Form()
+ tform.setupUi(left)
+ c(tform.front, SIGNAL("textChanged()"), self.onTemplateEdit)
+ c(tform.back, SIGNAL("textChanged()"), self.onTemplateEdit)
+ l.addWidget(left, 5)
+ # preview area
+ right = QWidget()
+ pform = aqt.forms.preview.Ui_Form()
+ pform.setupUi(right)
+ def linkClicked(url):
+ QDesktopServices.openUrl(QUrl(url))
+ for wig in pform.front, pform.back:
+ wig.page().setLinkDelegationPolicy(
+ QWebPage.DelegateExternalLinks)
+ c(wig, SIGNAL("linkClicked(QUrl)"), linkClicked)
+ l.addWidget(right, 5)
+ v.addLayout(l)
+ w.setLayout(v)
+ self.forms.append({'tform': tform, 'pform': pform})
+ self.tabs.addTab(w, t['name'])
+
+ def onRemoveTab(self, idx):
+ if not self.mm.remTemplate(self.model, self.cards[idx].template()):
+ return showWarning(_("""\
+Removing this card would cause one or more notes to be deleted. \
+Please create a new card first."""))
+ self.redraw()
# Cards & Preview
##########################################################################
- def setupCards(self):
- self.updatingCards = False
- self.playedAudio = {}
- f = self.form
- if self.type == 0:
- f.templateType.setText(
- _("Templates that will be created:"))
- elif self.type == 1:
- f.templateType.setText(
- _("Templates used by note:"))
- else:
- f.templateType.setText(
- _("All templates:"))
- # replace with more appropriate size hints
- for e in ("cardQuestion", "cardAnswer"):
- w = getattr(f, e)
- idx = f.templateLayout.indexOf(w)
- r = f.templateLayout.getItemPosition(idx)
- f.templateLayout.removeWidget(w)
- w.hide()
- w.deleteLater()
- w = ResizingTextEdit(self)
- setattr(f, e, w)
- f.templateLayout.addWidget(w, r[0], r[1])
- c = self.connect
- c(f.cardList, SIGNAL("activated(int)"), self.cardChanged)
- c(f.editTemplates, SIGNAL("clicked()"), self.onEdit)
- c(f.cardQuestion, SIGNAL("textChanged()"), self.formatChanged)
- c(f.cardAnswer, SIGNAL("textChanged()"), self.formatChanged)
- c(f.alignment, SIGNAL("activated(int)"), self.saveCard)
- c(f.background, SIGNAL("clicked()"),
- lambda w=f.background:\
- self.chooseColour(w, "card"))
- c(f.questionInAnswer, SIGNAL("clicked()"), self.saveCard)
- c(f.allowEmptyAnswer, SIGNAL("clicked()"), self.saveCard)
- c(f.typeAnswer, SIGNAL("activated(int)"), self.saveCard)
- c(f.flipButton, SIGNAL("clicked()"), self.onFlip)
- c(f.clozectx, SIGNAL("clicked()"), self.saveCard)
- def linkClicked(url):
- QDesktopServices.openUrl(QUrl(url))
- f.preview.page().setLinkDelegationPolicy(
- QWebPage.DelegateExternalLinks)
- self.connect(f.preview,
- SIGNAL("linkClicked(QUrl)"),
- linkClicked)
- if self.plastiqueStyle:
- f.background.setStyle(self.plastiqueStyle)
- f.alignment.addItems(alignmentLabels().values())
- self.typeFieldNames = self.mm.fieldMap(self.model)
- s = [_("Don't ask me to type in the answer")]
- s += [_("Compare with field '%s'") % fi
- for fi in self.typeFieldNames.keys()]
- f.typeAnswer.insertItems(0, s)
-
- def formatToScreen(self, fmt):
- fmt = fmt.replace("}} ", "}}\n")
- return fmt
-
- def screenToFormat(self, fmt):
- fmt = fmt.replace("}}\n", "}} ")
- return fmt
-
- def onEdit(self):
- aqt.templates.Templates(self.mw, self.model, self)
- self.reload()
-
- def formatChanged(self):
- if self.updatingCards:
+ def selectCard(self, idx):
+ if self.redrawing:
return
- text = unicode(self.form.cardQuestion.toPlainText())
- self.card.template()['qfmt'] = self.screenToFormat(text)
- text = unicode(self.form.cardAnswer.toPlainText())
- self.card.template()['afmt'] = self.screenToFormat(text)
- self.renderPreview()
-
- def onFlip(self):
- q = unicode(self.form.cardQuestion.toPlainText())
- a = unicode(self.form.cardAnswer.toPlainText())
- self.form.cardAnswer.setPlainText(q)
- self.form.cardQuestion.setPlainText(a)
-
- def readCard(self):
- self.updatingCards = True
- t = self.card.template()
- f = self.form
- f.background.setPalette(QPalette(QColor(t['bg'])))
- f.cardQuestion.setPlainText(self.formatToScreen(t['qfmt']))
- f.cardAnswer.setPlainText(self.formatToScreen(t['afmt']))
- f.questionInAnswer.setChecked(t['hideQ'])
- f.allowEmptyAnswer.setChecked(t['emptyAns'])
- f.alignment.setCurrentIndex(t['align'])
- if t['typeAns'] is None:
- f.typeAnswer.setCurrentIndex(0)
- else:
- f.typeAnswer.setCurrentIndex(t['typeAns'] + 1)
- # model-level, but there's nowhere else to put this
- f.clozectx.setChecked(self.model['clozectx'])
- self.updatingCards = False
-
- def fillCardList(self):
- self.form.cardList.clear()
- cards = []
- idx = 0
- for n, c in enumerate(self.cards):
- if c.ord == self.ord:
- cards.append(_("%s (current)") % c.template()['name'])
- idx = n
- else:
- cards.append(c.template()['name'])
- self.form.cardList.addItems(cards)
- self.form.cardList.setCurrentIndex(idx)
- self.cardChanged(idx)
- self.form.cardList.setFocus()
-
- def cardChanged(self, idx):
+ self.ord = idx
self.card = self.cards[idx]
+ self.tab = self.forms[idx]
+ self.tabs.setCurrentIndex(idx)
self.readCard()
self.renderPreview()
- def saveCard(self):
- if self.updatingCards:
- return
+ def readCard(self):
t = self.card.template()
- t['align'] = self.form.alignment.currentIndex()
- t['bg'] = unicode(
- self.form.background.palette().window().color().name())
- t['hideQ'] = self.form.questionInAnswer.isChecked()
- t['emptyAns'] = self.form.allowEmptyAnswer.isChecked()
- idx = self.form.typeAnswer.currentIndex()
- if not idx:
- t['typeAns'] = None
- else:
- t['typeAns'] = idx-1
- self.model['clozectx'] = self.form.clozectx.isChecked()
+ self.redrawing = True
+ self.tab['tform'].front.setPlainText(t['qfmt'])
+ self.tab['tform'].back.setPlainText(t['afmt'])
+ self.redrawing = False
+
+ def onTemplateEdit(self):
+ if self.redrawing:
+ return
+ text = self.tab['tform'].front.toPlainText()
+ self.card.template()['qfmt'] = text
+ text = self.tab['tform'].back.toPlainText()
+ self.card.template()['afmt'] = text
self.renderPreview()
- def chooseColour(self, button, type="field"):
- new = QColorDialog.getColor(button.palette().window().color(), self,
- _("Choose Color"),
- QColorDialog.DontUseNativeDialog)
- if new.isValid():
- button.setPalette(QPalette(new))
- if type == "field":
- self.saveField()
- else:
- self.saveCard()
+ def saveCard(self):
+ t = self.card.template()
+ self.renderPreview()
def renderPreview(self):
+ print "preview"
c = self.card
- styles = self.model['css']
- styles += "\n.cloze { font-weight: bold; color: blue; }"
- self.form.preview.setHtml(
- ('
%s' %
- (getBase(self.col), c.cssClass())) +
- "" +
- mungeQA(c.q(reload=True)) +
- self.maybeTextInput() +
- "" +
- mungeQA(c.a())
- + "")
- clearAudioQueue()
- if c.id not in self.playedAudio:
- playFromText(c.q())
- playFromText(c.a())
- self.playedAudio[c.id] = True
+ styles = "\n.cloze { font-weight: bold; color: blue; }"
+ html = '%s'
+ self.tab['pform'].front.setHtml(
+ html % (styles, mungeQA(c.q(reload=True))))
+ self.tab['pform'].back.setHtml(
+ html % (styles, mungeQA(c.a())))
def maybeTextInput(self):
+ return "text input"
if self.card.template()['typeAns'] is not None:
return "
"
return ""
+ def onRename(self):
+ name = getOnlyText(_("New name:"))
+ if not name:
+ return
+ if name in [c.template()['name'] for c in self.cards
+ if c.template()['ord'] != self.ord]:
+ return showWarning(_("That name is already used."))
+ self.card.template()['name'] = name
+ self.tabs.setTabText(self.tabs.currentIndex(), name)
+
+ def onReorder(self):
+ n = len(self.cards)
+ cur = self.card.template()['ord']+1
+ pos = getOnlyText(
+ _("Enter new card position (1..%s):") % n,
+ default=str(cur))
+ if not pos:
+ return
+ try:
+ pos = int(pos)
+ except ValueError:
+ return
+ if pos < 1 or pos > n:
+ return
+ if pos == cur:
+ return
+ pos -= 1
+ self.mm.moveTemplate(self.model, self.card.template(), pos)
+ self.ord = pos
+ self.redraw()
+
+ def onAddCard(self):
+ name = getOnlyText(_("Name:"))
+ if not name:
+ return
+ if name in [c.template()['name'] for c in self.cards]:
+ return showWarning(_("That name is already used."))
+ t = self.mm.newTemplate(name)
+ self.mm.addTemplate(self.model, t)
+ self.redraw()
+
+ # Closing & Help
+ ######################################################################
+
def accept(self):
self.reject()
def reject(self):
self.mm.save(self.model)
- saveGeom(self, "CardLayout")
- saveSplitter(self.form.splitter, "clayout")
self.mw.reset()
+ saveGeom(self, "CardLayout")
return QDialog.reject(self)
-
- modified = False
- self.mw.startProgress()
- self.col.updateProgress(_("Applying changes..."))
- reset=True
- if len(self.fieldOrdinalUpdatedIds) > 0:
- self.col.rebuildFieldOrdinals(self.model.id, self.fieldOrdinalUpdatedIds)
- modified = True
- if self.needFieldRebuild:
- modified = True
- if modified:
- self.note.model.setModified()
- self.col.flushMod()
- if self.noteedit and self.noteedit.onChange:
- self.noteedit.onChange("all")
- reset=False
- if reset:
- self.mw.reset()
- self.col.finishProgress()
- QDialog.reject(self)
-
def onHelp(self):
- aqt.openHelp("CardLayout")
-
- # Fields
- ##########################################################################
-
- def setupFields(self):
- self.fieldOrdinalUpdatedIds = []
- self.updatingFields = False
- self.needFieldRebuild = False
- c = self.connect; f = self.form
- sc = SIGNAL("stateChanged(int)")
- cl = SIGNAL("clicked()")
- c(f.fieldAdd, cl, self.addField)
- c(f.fieldDelete, cl, self.deleteField)
- c(f.fieldUp, cl, self.moveFieldUp)
- c(f.fieldDown, cl, self.moveFieldDown)
- c(f.preserveWhitespace, sc, self.saveField)
- c(f.fieldUnique, sc, self.saveField)
- c(f.fieldRequired, sc, self.saveField)
- c(f.sticky, sc, self.saveField)
- c(f.fieldList, SIGNAL("currentRowChanged(int)"),
- self.fieldChanged)
- c(f.fieldName, SIGNAL("lostFocus()"),
- self.saveField)
- c(f.fontFamily, SIGNAL("currentFontChanged(QFont)"),
- self.saveField)
- c(f.fontSize, SIGNAL("valueChanged(int)"),
- self.saveField)
- c(f.fontSizeEdit, SIGNAL("valueChanged(int)"),
- self.saveField)
- w = self.form.fontColour
- if self.plastiqueStyle:
- w.setStyle(self.plastiqueStyle)
- c(w, SIGNAL("clicked()"),
- lambda w=w: self.chooseColour(w))
- c(self.form.rtl,
- SIGNAL("stateChanged(int)"),
- self.saveField)
-
- def fieldChanged(self):
- row = self.form.fieldList.currentRow()
- if row == -1:
- row = 0
- self.field = self.model['flds'][row]
- self.readField()
- self.enableFieldMoveButtons()
-
- def readField(self):
- fld = self.field
- f = self.form
- self.updatingFields = True
- f.fieldName.setText(fld['name'])
- f.fieldUnique.setChecked(fld['uniq'])
- f.fieldRequired.setChecked(fld['req'])
- f.fontFamily.setCurrentFont(QFont(fld['font']))
- f.fontSize.setValue(fld['qsize'])
- f.fontSizeEdit.setValue(fld['esize'])
- f.fontColour.setPalette(QPalette(QColor(fld['qcol'])))
- f.rtl.setChecked(fld['rtl'])
- f.preserveWhitespace.setChecked(fld['pre'])
- f.sticky.setChecked(fld['sticky'])
- self.updatingFields = False
-
- def saveField(self, *args):
- self.needFieldRebuild = True
- if self.updatingFields:
- return
- self.updatingFields = True
- fld = self.field
- # get name; we'll handle it last
- name = unicode(self.form.fieldName.text())
- if not name:
- return
- fld['uniq'] = self.form.fieldUnique.isChecked()
- fld['req'] = self.form.fieldRequired.isChecked()
- fld['font'] = unicode(
- self.form.fontFamily.currentFont().family())
- fld['qsize'] = self.form.fontSize.value()
- fld['esize'] = self.form.fontSizeEdit.value()
- fld['qcol'] = str(
- self.form.fontColour.palette().window().color().name())
- fld['rtl'] = self.form.rtl.isChecked()
- fld['pre'] = self.form.preserveWhitespace.isChecked()
- fld['sticky'] = self.form.sticky.isChecked()
- self.updatingFields = False
- if fld['name'] != name:
- self.mm.renameField(self.model, fld, name)
- # as the field name has changed, we have to regenerate cards
- self.cards = self.col.previewCards(self.note, self.type)
- self.cardChanged(0)
- self.renderPreview()
- self.fillFieldList()
-
- def fillFieldList(self, row = None):
- oldRow = self.form.fieldList.currentRow()
- if oldRow == -1:
- oldRow = 0
- self.form.fieldList.clear()
- n = 1
- for field in self.model['flds']:
- label = field['name']
- item = QListWidgetItem(label)
- self.form.fieldList.addItem(item)
- n += 1
- count = self.form.fieldList.count()
- if row != None:
- self.form.fieldList.setCurrentRow(row)
- else:
- while (count > 0 and oldRow > (count - 1)):
- oldRow -= 1
- self.form.fieldList.setCurrentRow(oldRow)
- self.enableFieldMoveButtons()
-
- def enableFieldMoveButtons(self):
- row = self.form.fieldList.currentRow()
- if row < 1:
- self.form.fieldUp.setEnabled(False)
- else:
- self.form.fieldUp.setEnabled(True)
- if row == -1 or row >= (self.form.fieldList.count() - 1):
- self.form.fieldDown.setEnabled(False)
- else:
- self.form.fieldDown.setEnabled(True)
-
- def addField(self):
- f = self.mm.newField(self.model)
- l = len(self.model['flds'])
- f['name'] = _("Field %d") % l
- self.mw.progress.start()
- self.mm.addField(self.model, f)
- self.mw.progress.finish()
- self.reload()
- self.form.fieldList.setCurrentRow(l)
- self.form.fieldName.setFocus()
- self.form.fieldName.selectAll()
-
- def deleteField(self):
- row = self.form.fieldList.currentRow()
- if row == -1:
- return
- if len(self.model.fields) < 2:
- showInfo(_("Please add a new field first."))
- return
- if askUser(_("Delete this field and its data from all notes?")):
- self.mw.progress.start()
- self.model.delField(self.field)
- self.mw.progress.finish()
- # need to update q/a format
- self.reload()
-
- def moveFieldUp(self):
- row = self.form.fieldList.currentRow()
- if row == -1:
- return
- if row == 0:
- return
- self.mw.progress.start()
- self.model.moveField(self.field, row-1)
- self.mw.progress.finish()
- self.form.fieldList.setCurrentRow(row-1)
- self.reload()
-
- def moveFieldDown(self):
- row = self.form.fieldList.currentRow()
- if row == -1:
- return
- if row == len(self.model.fields) - 1:
- return
- self.mw.progress.start()
- self.model.moveField(self.field, row+1)
- self.mw.progress.finish()
- self.form.fieldList.setCurrentRow(row+1)
- self.reload()
+ openHelp("CardLayout")
diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py
index 0fb566ecd..0fa206db1 100644
--- a/aqt/deckbrowser.py
+++ b/aqt/deckbrowser.py
@@ -3,7 +3,7 @@
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from aqt.qt import *
-from aqt.utils import askUser
+from aqt.utils import askUser, getOnlyText
class DeckBrowser(object):
@@ -27,7 +27,7 @@ class DeckBrowser(object):
if cmd == "open":
self._selDeck(arg)
elif cmd == "opts":
- self._optsForRow(int(arg))
+ self._showOptions(arg)
elif cmd == "download":
self.mw.onGetSharedDeck()
elif cmd == "new":
@@ -43,7 +43,7 @@ class DeckBrowser(object):
def _selDeck(self, did):
self.mw.col.decks.select(did)
- self.mw.moveToState("overview")
+ self.mw.onOverview()
# HTML generation
##########################################################################
@@ -85,13 +85,15 @@ body { margin: 1em; }
def _deckRow(self, node, depth):
name, did, due, new, children = node
+ def indent():
+ return " "*3*depth
# due image
- buf = "