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.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")

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.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()

View file

@ -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)

View file

@ -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:

View file

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