move deck selection to top of add cards

This commit is contained in:
Damien Elmes 2012-05-24 22:12:09 +09:00
parent c3d990534e
commit c42865425a
6 changed files with 128 additions and 98 deletions

View file

@ -13,7 +13,7 @@ from aqt.utils import saveGeom, restoreGeom, showWarning, askUser, shortcut, \
from anki.sound import clearAudioQueue from anki.sound import clearAudioQueue
from anki.hooks import addHook, remHook from anki.hooks import addHook, remHook
from anki.utils import stripHTMLMedia, isMac from anki.utils import stripHTMLMedia, isMac
import aqt.editor, aqt.modelchooser import aqt.editor, aqt.modelchooser, aqt.deckchooser
class AddCards(QDialog): class AddCards(QDialog):
@ -25,7 +25,7 @@ class AddCards(QDialog):
self.setWindowTitle(_("Add")) self.setWindowTitle(_("Add"))
self.setMinimumHeight(400) self.setMinimumHeight(400)
self.setMinimumWidth(500) self.setMinimumWidth(500)
self.setupChooser() self.setupChoosers()
self.setupEditor() self.setupEditor()
self.setupButtons() self.setupButtons()
self.onReset() self.onReset()
@ -41,9 +41,11 @@ class AddCards(QDialog):
self.editor = aqt.editor.Editor( self.editor = aqt.editor.Editor(
self.mw, self.form.fieldsArea, self, True) self.mw, self.form.fieldsArea, self, True)
def setupChooser(self): def setupChoosers(self):
self.modelChooser = aqt.modelchooser.ModelChooser( self.modelChooser = aqt.modelchooser.ModelChooser(
self.mw, self.form.modelArea) self.mw, self.form.modelArea)
self.deckChooser = aqt.deckchooser.DeckChooser(
self.mw, self.form.deckArea)
def helpRequested(self): def helpRequested(self):
openHelp("addingnotes") openHelp("addingnotes")
@ -126,6 +128,7 @@ class AddCards(QDialog):
browser.onSearch() browser.onSearch()
def addNote(self, note): def addNote(self, note):
note.model()['did'] = self.deckChooser.selectedId()
if note.dupeOrEmpty(): if note.dupeOrEmpty():
showWarning(_( showWarning(_(
"The first field is empty or not unique."), "The first field is empty or not unique."),
@ -171,6 +174,7 @@ question on all cards."""), help="AddItems")
self.removeTempNote(self.editor.note) self.removeTempNote(self.editor.note)
self.editor.setNote(None) self.editor.setNote(None)
self.modelChooser.cleanup() self.modelChooser.cleanup()
self.deckChooser.cleanup()
self.mw.maybeReset() self.mw.maybeReset()
saveGeom(self, "add") saveGeom(self, "add")
aqt.dialogs.close("AddCards") aqt.dialogs.close("AddCards")

83
aqt/deckchooser.py Normal file
View file

@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
# Copyright: Damien Elmes <anki@ichi2.net>
# 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

View file

@ -325,7 +325,7 @@ class Editor(object):
self.setupOuter() self.setupOuter()
self.setupButtons() self.setupButtons()
self.setupWeb() self.setupWeb()
self.setupTagsAndDeck() self.setupTags()
self.setupKeyboard() self.setupKeyboard()
# Initial setup # Initial setup
@ -539,7 +539,7 @@ class Editor(object):
self.web.setHtml(_html % ( self.web.setHtml(_html % (
getBase(self.mw.col), fontForPlatform(), anki.js.jquery, getBase(self.mw.col), fontForPlatform(), anki.js.jquery,
_("Show Duplicates")), loadCB=self._loadFinished) _("Show Duplicates")), loadCB=self._loadFinished)
self.updateTagsAndDeck() self.updateTags()
self.updateKeyboard() self.updateKeyboard()
else: else:
self.hideCompleters() self.hideCompleters()
@ -637,36 +637,16 @@ class Editor(object):
self.note.fields[self.currentField] = html self.note.fields[self.currentField] = html
self.loadNote() self.loadNote()
# Tag & deck handling # Tag handling
###################################################################### ######################################################################
def setupTagsAndDeck(self): def setupTags(self):
import aqt.tagedit import aqt.tagedit
g = QGroupBox(self.widget) g = QGroupBox(self.widget)
g.setFlat(True) g.setFlat(True)
tb = QGridLayout() tb = QGridLayout()
tb.setSpacing(12) tb.setSpacing(12)
tb.setMargin(6) 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 # tags
l = QLabel(_("Tags")) l = QLabel(_("Tags"))
tb.addWidget(l, 1, 0) tb.addWidget(l, 1, 0)
@ -677,21 +657,9 @@ class Editor(object):
g.setLayout(tb) g.setLayout(tb)
self.outerLayout.addWidget(g) self.outerLayout.addWidget(g)
def updateTagsAndDeck(self): def updateTags(self):
if self.tags.col != self.mw.col: if self.tags.col != self.mw.col:
self.tags.setCol(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: if not self.tags.text() or not self.addMode:
self.tags.setText(self.note.stringTags().strip()) self.tags.setText(self.note.stringTags().strip())
@ -705,31 +673,11 @@ class Editor(object):
def saveAddModeVars(self): def saveAddModeVars(self):
if self.addMode: 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 # save tags to model
m = self.note.model() m = self.note.model()
m['tags'] = self.note.tags m['tags'] = self.note.tags
self.mw.col.models.save(m) 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): def hideCompleters(self):
self.tags.hideCompleter() self.tags.hideCompleter()

View file

@ -23,29 +23,18 @@ class ModelChooser(QHBoxLayout):
self.widget.setLayout(self) self.widget.setLayout(self)
def setupModels(self): def setupModels(self):
if self.label: if self.label:
self.modelLabel = QLabel(_("Note Type:")) self.modelLabel = QLabel(_("Type"))
self.addWidget(self.modelLabel) self.addWidget(self.modelLabel)
# models box # models box
self.models = QPushButton() self.models = QPushButton()
self.models.setStyleSheet("* { text-align: left; }") #self.models.setStyleSheet("* { text-align: left; }")
self.models.setToolTip(_("Change Note Type (Ctrl+N)")) self.models.setToolTip(_("Change Note Type (Ctrl+N)"))
s = QShortcut(QKeySequence(_("Ctrl+N")), self.widget) s = QShortcut(QKeySequence(_("Ctrl+N")), self.widget)
s.connect(s, SIGNAL("activated()"), self.onModelChange) s.connect(s, SIGNAL("activated()"), self.onModelChange)
self.addWidget(self.models) self.addWidget(self.models)
self.connect(self.models, SIGNAL("clicked()"), self.onModelChange) 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 # layout
sizePolicy = QSizePolicy( sizePolicy = QSizePolicy(
QSizePolicy.Policy(7), QSizePolicy.Policy(7),
@ -72,9 +61,13 @@ class ModelChooser(QHBoxLayout):
def onModelChange(self): def onModelChange(self):
from aqt.studydeck import StudyDeck from aqt.studydeck import StudyDeck
current = self.deck.models.current()['name'] 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()), ret = StudyDeck(self.mw, names=sorted(self.deck.models.allNames()),
accept=_("Select"), title=_("Choose Note Type"), 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: if not ret.name:
return return
m = self.deck.models.byName(ret.name) m = self.deck.models.byName(ret.name)

View file

@ -11,7 +11,7 @@ from operator import itemgetter
class StudyDeck(QDialog): class StudyDeck(QDialog):
def __init__(self, mw, names=None, accept=None, title=None, def __init__(self, mw, names=None, accept=None, title=None,
help="studydeck", current=None, cancel=True, help="studydeck", current=None, cancel=True,
parent=None, dyn=False): parent=None, dyn=False, buttons=[]):
QDialog.__init__(self, parent or mw) QDialog.__init__(self, parent or mw)
self.mw = mw self.mw = mw
self.form = aqt.forms.studydeck.Ui_Dialog() self.form = aqt.forms.studydeck.Ui_Dialog()
@ -21,6 +21,8 @@ class StudyDeck(QDialog):
if not cancel: if not cancel:
self.form.buttonBox.removeButton( self.form.buttonBox.removeButton(
self.form.buttonBox.button(QDialogButtonBox.Cancel)) self.form.buttonBox.button(QDialogButtonBox.Cancel))
for b in buttons:
self.form.buttonBox.addButton(b, QDialogButtonBox.ActionRole)
if title: if title:
self.setWindowTitle(title) self.setWindowTitle(title)
if not names: if not names:

View file

@ -21,30 +21,27 @@
<property name="spacing"> <property name="spacing">
<number>3</number> <number>3</number>
</property> </property>
<property name="margin"> <property name="leftMargin">
<number>12</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>12</number>
</property>
<property name="bottomMargin">
<number>12</number> <number>12</number>
</property> </property>
<item> <item>
<layout class="QGridLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin"> <property name="spacing">
<number>0</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>0</number> <number>0</number>
</property> </property>
<property name="bottomMargin"> <property name="bottomMargin">
<number>4</number>
</property>
<property name="horizontalSpacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="verticalSpacing"> <item>
<number>4</number>
</property>
<item row="0" column="0">
<widget class="QWidget" name="modelArea" native="true"> <widget class="QWidget" name="modelArea" native="true">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
@ -54,15 +51,18 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item>
<widget class="Line" name="line"> <widget class="QWidget" name="deckArea" native="true"/>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item> <item>
<widget class="QWidget" name="fieldsArea" native="true"> <widget class="QWidget" name="fieldsArea" native="true">
<property name="sizePolicy"> <property name="sizePolicy">