mirror of
https://github.com/ankitects/anki.git
synced 2025-09-23 08:22:24 -04:00
move deck selection to top of add cards
This commit is contained in:
parent
c3d990534e
commit
c42865425a
6 changed files with 128 additions and 98 deletions
|
@ -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
83
aqt/deckchooser.py
Normal 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
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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">
|
||||||
|
|
Loading…
Reference in a new issue