diff --git a/aqt/addcards.py b/aqt/addcards.py index d808b51c4..41db99d44 100644 --- a/aqt/addcards.py +++ b/aqt/addcards.py @@ -13,7 +13,7 @@ from aqt.utils import saveGeom, restoreGeom, showWarning, askUser, shortcut, \ from anki.sound import clearAudioQueue from anki.hooks import addHook, remHook from anki.utils import stripHTMLMedia, isMac -import aqt.editor, aqt.modelchooser +import aqt.editor, aqt.modelchooser, aqt.deckchooser class AddCards(QDialog): @@ -25,7 +25,7 @@ class AddCards(QDialog): self.setWindowTitle(_("Add")) self.setMinimumHeight(400) self.setMinimumWidth(500) - self.setupChooser() + self.setupChoosers() self.setupEditor() self.setupButtons() self.onReset() @@ -41,9 +41,11 @@ class AddCards(QDialog): self.editor = aqt.editor.Editor( self.mw, self.form.fieldsArea, self, True) - def setupChooser(self): + def setupChoosers(self): self.modelChooser = aqt.modelchooser.ModelChooser( self.mw, self.form.modelArea) + self.deckChooser = aqt.deckchooser.DeckChooser( + self.mw, self.form.deckArea) def helpRequested(self): openHelp("addingnotes") @@ -126,6 +128,7 @@ class AddCards(QDialog): browser.onSearch() def addNote(self, note): + note.model()['did'] = self.deckChooser.selectedId() if note.dupeOrEmpty(): showWarning(_( "The first field is empty or not unique."), @@ -171,6 +174,7 @@ question on all cards."""), help="AddItems") self.removeTempNote(self.editor.note) self.editor.setNote(None) self.modelChooser.cleanup() + self.deckChooser.cleanup() self.mw.maybeReset() saveGeom(self, "add") aqt.dialogs.close("AddCards") diff --git a/aqt/deckchooser.py b/aqt/deckchooser.py new file mode 100644 index 000000000..0659ad9b8 --- /dev/null +++ b/aqt/deckchooser.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# Copyright: Damien Elmes +# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + +from aqt.qt import * +from operator import itemgetter +from anki.hooks import addHook, remHook, runHook +from aqt.utils import isMac +import aqt + +class DeckChooser(QHBoxLayout): + + def __init__(self, mw, widget, label=True, start=None): + QHBoxLayout.__init__(self) + self.widget = widget + self.mw = mw + self.deck = mw.col + self.label = label + self.setMargin(0) + self.setSpacing(8) + self.setupDecks() + self.widget.setLayout(self) + addHook('currentModelChanged', self.onModelChange) + + def setupDecks(self): + if self.label: + self.deckLabel = QLabel(_("Deck")) + self.addWidget(self.deckLabel) + # decks box + self.deck = QPushButton() + self.deck.setToolTip(_("Target Deck (Ctrl+D)")) + s = QShortcut(QKeySequence(_("Ctrl+D")), self.widget) + s.connect(s, SIGNAL("activated()"), self.onDeckChange) + self.addWidget(self.deck) + self.connect(self.deck, SIGNAL("clicked()"), self.onDeckChange) + # starting label + if self.mw.col.conf.get("addToCur", True): + col = self.mw.col + did = col.conf['curDeck'] + if col.decks.isDyn(did): + did = 1 + self.deck.setText(self.mw.col.decks.nameOrNone( + did) or _("Default")) + else: + self.deck.setText(self.mw.col.decks.nameOrNone( + self.mw.col.models.current()['did']) or _("Default")) + # layout + sizePolicy = QSizePolicy( + QSizePolicy.Policy(7), + QSizePolicy.Policy(0)) + self.deck.setSizePolicy(sizePolicy) + + def show(self): + self.widget.show() + + def hide(self): + self.widget.hide() + + def cleanup(self): + remHook('currentModelChanged', self.onModelChange) + + def onModelChange(self): + if not self.mw.col.conf.get("addToCur", True): + self.deck.setText(self.mw.col.decks.nameOrNone( + self.mw.col.models.current()['did']) or _("Default")) + + def onDeckChange(self): + from aqt.studydeck import StudyDeck + current = self.deck.text() + ret = StudyDeck( + self.mw, current=current, accept=_("Choose"), + title=_("Select Deck"), help="addingnotes", + cancel=False, parent=self.widget) + self.deck.setText(ret.name) + + def selectedId(self): + # save deck name + name = self.deck.text() + if not name.strip(): + did = 1 + else: + did = self.mw.col.decks.id(name) + return did diff --git a/aqt/editor.py b/aqt/editor.py index aa34d049d..2018ee5e6 100644 --- a/aqt/editor.py +++ b/aqt/editor.py @@ -325,7 +325,7 @@ class Editor(object): self.setupOuter() self.setupButtons() self.setupWeb() - self.setupTagsAndDeck() + self.setupTags() self.setupKeyboard() # Initial setup @@ -539,7 +539,7 @@ class Editor(object): self.web.setHtml(_html % ( getBase(self.mw.col), fontForPlatform(), anki.js.jquery, _("Show Duplicates")), loadCB=self._loadFinished) - self.updateTagsAndDeck() + self.updateTags() self.updateKeyboard() else: self.hideCompleters() @@ -637,36 +637,16 @@ class Editor(object): self.note.fields[self.currentField] = html self.loadNote() - # Tag & deck handling + # Tag handling ###################################################################### - def setupTagsAndDeck(self): + def setupTags(self): import aqt.tagedit g = QGroupBox(self.widget) g.setFlat(True) tb = QGridLayout() tb.setSpacing(12) tb.setMargin(6) - # deck - if self.addMode: - l = QLabel(_("Deck")) - tb.addWidget(l, 0, 0) - self.deck = QPushButton() - self.deck.setAutoDefault(False) - self.deck.setStyleSheet("* { text-align: left; }") - # not working for some reason - #self.deck.setShortcut("Ctrl+D") - self.deckShortcut = QShortcut( - QKeySequence("Ctrl+D"), self.widget) - self.deckShortcut.connect( - self.deckShortcut, SIGNAL("activated()"), - self.deck.click) - self.deck.connect(self.deck, SIGNAL("clicked()"), - self.onChangeDeck) - self.deck.setToolTip("Change Deck (Ctrl+D)") - tb.addWidget(self.deck, 0, 1) - else: - self.deck = None # tags l = QLabel(_("Tags")) tb.addWidget(l, 1, 0) @@ -677,21 +657,9 @@ class Editor(object): g.setLayout(tb) self.outerLayout.addWidget(g) - def updateTagsAndDeck(self): + def updateTags(self): if self.tags.col != self.mw.col: self.tags.setCol(self.mw.col) - if self.addMode: - if self.mw.col.conf.get("addToCur", True): - if not self.deck.text(): - col = self.mw.col - did = col.conf['curDeck'] - if col.decks.isDyn(did): - did = 1 - self.deck.setText(self.mw.col.decks.nameOrNone( - did) or _("Default")) - else: - self.deck.setText(self.mw.col.decks.nameOrNone( - self.note.model()['did']) or _("Default")) if not self.tags.text() or not self.addMode: self.tags.setText(self.note.stringTags().strip()) @@ -705,31 +673,11 @@ class Editor(object): def saveAddModeVars(self): if self.addMode: - # save deck name - name = self.deck.text() - if not name.strip(): - self.note.model()['did'] = 1 - else: - did = self.mw.col.decks.id(name) - deck = self.mw.col.decks.get(did) - if deck['dyn']: - did = 1 - showInfo(_("Using default deck instead of cram deck.")) - self.note.model()['did'] = did # save tags to model m = self.note.model() m['tags'] = self.note.tags self.mw.col.models.save(m) - def onChangeDeck(self): - from aqt.studydeck import StudyDeck - cur = self.deck.text() - ret = StudyDeck( - self.mw, current=cur, accept=_("Choose"), - title=_("Select Deck"), help="addingnotes", - cancel=False, parent=self.parentWindow) - self.deck.setText(ret.name) - def hideCompleters(self): self.tags.hideCompleter() diff --git a/aqt/modelchooser.py b/aqt/modelchooser.py index c166824ac..8e6e21f51 100644 --- a/aqt/modelchooser.py +++ b/aqt/modelchooser.py @@ -23,29 +23,18 @@ class ModelChooser(QHBoxLayout): self.widget.setLayout(self) def setupModels(self): + if self.label: - self.modelLabel = QLabel(_("Note Type:")) + self.modelLabel = QLabel(_("Type")) self.addWidget(self.modelLabel) # models box self.models = QPushButton() - self.models.setStyleSheet("* { text-align: left; }") + #self.models.setStyleSheet("* { text-align: left; }") self.models.setToolTip(_("Change Note Type (Ctrl+N)")) s = QShortcut(QKeySequence(_("Ctrl+N")), self.widget) s.connect(s, SIGNAL("activated()"), self.onModelChange) self.addWidget(self.models) self.connect(self.models, SIGNAL("clicked()"), self.onModelChange) - # edit button - self.edit = QPushButton() - if isMac: - self.edit.setFixedWidth(24) - self.edit.setFixedHeight(21) - else: - self.edit.setFixedWidth(32) - self.edit.setIcon(QIcon(":/icons/gears.png")) - self.edit.setToolTip(_("Customize Note Types")) - self.edit.setAutoDefault(False) - self.addWidget(self.edit) - self.connect(self.edit, SIGNAL("clicked()"), self.onEdit) # layout sizePolicy = QSizePolicy( QSizePolicy.Policy(7), @@ -72,9 +61,13 @@ class ModelChooser(QHBoxLayout): def onModelChange(self): from aqt.studydeck import StudyDeck current = self.deck.models.current()['name'] + # edit button + edit = QPushButton(_("Manage")) + self.connect(edit, SIGNAL("clicked()"), self.onEdit) ret = StudyDeck(self.mw, names=sorted(self.deck.models.allNames()), accept=_("Select"), title=_("Choose Note Type"), - help="_notes", current=current, parent=self.widget) + help="_notes", current=current, parent=self.widget, + buttons=[edit], cancel=False) if not ret.name: return m = self.deck.models.byName(ret.name) diff --git a/aqt/studydeck.py b/aqt/studydeck.py index 3e100c044..b291c227f 100644 --- a/aqt/studydeck.py +++ b/aqt/studydeck.py @@ -11,7 +11,7 @@ from operator import itemgetter class StudyDeck(QDialog): def __init__(self, mw, names=None, accept=None, title=None, help="studydeck", current=None, cancel=True, - parent=None, dyn=False): + parent=None, dyn=False, buttons=[]): QDialog.__init__(self, parent or mw) self.mw = mw self.form = aqt.forms.studydeck.Ui_Dialog() @@ -21,6 +21,8 @@ class StudyDeck(QDialog): if not cancel: self.form.buttonBox.removeButton( self.form.buttonBox.button(QDialogButtonBox.Cancel)) + for b in buttons: + self.form.buttonBox.addButton(b, QDialogButtonBox.ActionRole) if title: self.setWindowTitle(title) if not names: diff --git a/designer/addcards.ui b/designer/addcards.ui index c3e9b75a7..4d492883a 100644 --- a/designer/addcards.ui +++ b/designer/addcards.ui @@ -21,30 +21,27 @@ 3 - + + 12 + + + 6 + + + 12 + + 12 - - - 0 - - - 4 - - + + 0 - 4 - - 0 - - 4 - - + @@ -54,15 +51,18 @@ - - - - Qt::Horizontal - - + + + + + + Qt::Horizontal + + +