mirror of
https://github.com/ankitects/anki.git
synced 2025-09-22 16:02:23 -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.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
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.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()
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in a new issue