diff --git a/aqt/browser.py b/aqt/browser.py
index 9709e07e1..ce72edebd 100644
--- a/aqt/browser.py
+++ b/aqt/browser.py
@@ -1422,9 +1422,9 @@ class BrowserToolbar(Toolbar):
def _centerLinks(self):
links = [
- ["setDeck", _("Move to Deck")],
- ["addTags", _("Add Tags")],
- ["remTags", _("Remove Tags")],
+ ["setDeck", _("Move to Deck"), ""],
+ ["addTags", _("Add Tags"), ""],
+ ["remTags", _("Remove Tags"), ""],
]
return self._linkHTML(links)
diff --git a/aqt/editor.py b/aqt/editor.py
index cc63b666f..3aff095aa 100644
--- a/aqt/editor.py
+++ b/aqt/editor.py
@@ -234,7 +234,7 @@ class Editor(object):
######################################################################
def _addButton(self, name, func, key=None, tip=None, size=True, text="",
- check=False, native=False):
+ check=False, native=False, canDisable=True):
b = QPushButton(text)
if check:
b.connect(b, SIGNAL("clicked(bool)"), func)
@@ -255,7 +255,8 @@ class Editor(object):
if check:
b.setCheckable(True)
self.iconsBox.addWidget(b)
- self._buttons[name] = b
+ if canDisable:
+ self._buttons[name] = b
return b
def setupButtons(self):
@@ -271,10 +272,10 @@ class Editor(object):
b = self._addButton
b("fields", self.onFields, "",
shortcut(_("Customize Fields")), size=False, text=_("Fields..."),
- native=True)
+ native=True, canDisable=False)
b("layout", self.onCardLayout, "Ctrl+l",
shortcut(_("Customize Card Layout (Ctrl+l)")),
- size=False, text=_("Layout..."), native=True)
+ size=False, text=_("Layout..."), native=True, canDisable=False)
# align to right
self.iconsBox.addItem(QSpacerItem(20,1, QSizePolicy.Expanding))
b("text_bold", self.toggleBold, "Ctrl+b", _("Bold text (Ctrl+b)"),
diff --git a/aqt/main.py b/aqt/main.py
index 06ae57727..cfcdbac86 100755
--- a/aqt/main.py
+++ b/aqt/main.py
@@ -18,7 +18,8 @@ import anki.consts
import aqt, aqt.progress, aqt.webview, aqt.toolbar
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
saveState, restoreState, getOnlyText, askUser, GetTextDialog, \
- askUserDialog, applyStyles, getText, showText, showCritical, getFile
+ askUserDialog, applyStyles, getText, showText, showCritical, getFile, \
+ tooltip
## fixme: open plugin folder broken on win32?
@@ -565,8 +566,10 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
f = self.reviewer.card.note()
if f.hasTag("marked"):
f.delTag("marked")
+ tooltip("Mark Removed.")
else:
f.addTag("marked")
+ tooltip("Mark Added.")
f.flush()
def onSuspend(self):
@@ -574,16 +577,19 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
self.col.sched.suspendCards(
[c.id for c in self.reviewer.card.note().cards()])
self.reviewer.nextCard()
+ tooltip("Note suspended.")
def onDelete(self):
self.checkpoint(_("Delete"))
self.col.remNotes([self.reviewer.card.note().id])
self.reviewer.nextCard()
+ tooltip("Note and its cards deleted.")
def onBuryNote(self):
self.checkpoint(_("Bury"))
self.col.sched.buryNote(self.reviewer.card.nid)
self.reviewer.nextCard()
+ tooltip("Note buried.")
# Undo & autosave
##########################################################################
diff --git a/aqt/reviewer.py b/aqt/reviewer.py
index d08ff7553..05ce802e0 100644
--- a/aqt/reviewer.py
+++ b/aqt/reviewer.py
@@ -195,27 +195,42 @@ function _typeAnsPress() {
return True
def _keyHandler(self, evt):
- print "rev event", evt.key()
- if self.state == "question":
- show = False
- if evt.key() == Qt.Key_Space and self.typeAns() is None:
- show = True
- elif evt.key() == Qt.Key_Escape:
- self.web.eval("$('#typeans').blur();")
- if show:
- self._showAnswer()
- self.web.eval("_showans();")
- return True
- elif self.state == "answer":
- if evt.key() == Qt.Key_Space:
- self.web.eval("_onSpace();")
- else:
- key = unicode(evt.text())
- if key and key >= "1" and key <= "4":
- key=int(key)
- if self.card.queue == 2 or key < 4:
- self._answerCard(key)
- return True
+ key = unicode(evt.text())
+ if key == "e":
+ self.mw.onEditCurrent()
+ elif key == " " and self.state == "question":
+ self._showAnswer()
+ elif key == "r":
+ self.replayAudio()
+ elif key == "*":
+ self.mw.onMark()
+ elif key == "-":
+ self.mw.onBuryNote()
+ elif key == "=":
+ self.mw.onSuspend()
+ elif evt.key() == Qt.Key_Delete:
+ self.mw.onDelete()
+ print "key", evt.key()
+ # if self.state == "question":
+ # show = False
+ # if evt.key() == Qt.Key_Space and self.typeAns() is None:
+ # show = True
+ # elif evt.key() == Qt.Key_Escape:
+ # self.web.eval("$('#typeans').blur();")
+ # if show:
+ # self._showAnswer()
+ # self.web.eval("_showans();")
+ # return True
+ # elif self.state == "answer":
+ # if evt.key() == Qt.Key_Space:
+ # self.web.eval("_onSpace();")
+ # else:
+ # key = unicode(evt.text())
+ # if key and key >= "1" and key <= "4":
+ # key=int(key)
+ # if self.card.queue == 2 or key < 4:
+ # self._answerCard(key)
+ # return True
def _linkHandler(self, url):
if url == "ans":
@@ -492,14 +507,15 @@ Card was a leech.""") % link)
def showContextMenu(self):
opts = [
- [_("Replay Audio (r)"), self.replayAudio],
- [_("Mark Note (m)"), self.mw.onMark],
- [_("Bury Note (b)"), self.mw.onBuryNote],
- [_("Suspend Note (!)"), self.mw.onSuspend],
- [shortcut(_("Delete Note (Ctrl+delete)")), self.mw.onDelete]
+ [_("Replay Audio"), "r", self.replayAudio],
+ [_("Mark Note"), "*", self.mw.onMark],
+ [_("Bury Note"), "-", self.mw.onBuryNote],
+ [_("Suspend Note"), "=", self.mw.onSuspend],
+ [_("Delete Note"), "Delete", self.mw.onDelete]
]
m = QMenu(self.mw)
- for label, func in opts:
+ for label, scut, func in opts:
a = m.addAction(label)
+ a.setShortcut(QKeySequence(scut))
a.connect(a, SIGNAL("triggered()"), func)
m.exec_(QCursor.pos())
diff --git a/aqt/toolbar.py b/aqt/toolbar.py
index d8ceff041..9aa8c0e7b 100644
--- a/aqt/toolbar.py
+++ b/aqt/toolbar.py
@@ -4,6 +4,7 @@
from aqt.qt import *
from aqt.webview import AnkiWebView
+from anki.lang import _
class Toolbar(object):
@@ -26,31 +27,34 @@ class Toolbar(object):
######################################################################
rightIcons = [
- ["stats", "qrc:/icons/view-statistics.png"],
- ["sync", "qrc:/icons/view-refresh.png"],
+ ["stats", "qrc:/icons/view-statistics.png",
+ _("Show statistics. Shortcut key: %s") % "S"],
+ ["sync", "qrc:/icons/view-refresh.png",
+ _("Synchronize with AnkiWeb. Shortcut key: %s") % "y"],
]
def _centerLinks(self):
links = [
- ["decks", _("Decks")],
- ["study", _("Study")],
- ["add", _("Add")],
- ["browse", _("Browse")],
+ ["decks", _("Decks"), _("Shortcut key: %s") % "d"],
+ ["study", _("Study"), _("Shortcut key: %s") % "s"],
+ ["add", _("Add"), _("Shortcut key: %s") % "a"],
+ ["browse", _("Browse"), _("Shortcut key: %s") % "b"],
]
return self._linkHTML(links)
def _linkHTML(self, links):
buf = ""
- for ln, name in links:
- buf += '%s' % (ln, name)
+ for ln, name, title in links:
+ buf += '%s' % (
+ title, ln, name)
buf += " "*3
return buf
def _rightIcons(self):
buf = ""
- for ln, icon in self.rightIcons:
- buf += '
' % (
- ln, icon)
+ for ln, icon, title in self.rightIcons:
+ buf += '
' % (
+ title, ln, icon)
return buf
# Link handling