diff --git a/aqt/browser.py b/aqt/browser.py
index d23abc576..7d1b594cc 100644
--- a/aqt/browser.py
+++ b/aqt/browser.py
@@ -314,6 +314,7 @@ class DataModel(QAbstractTableModel):
######################################################################
COLOUR_SUSPENDED = "#FFFFB2"
+COLOUR_MARKED = "#ccc"
flagColours = {
1: "#F5B7B1",
@@ -345,7 +346,8 @@ class StatusDelegate(QItemDelegate):
col = COLOUR_SUSPENDED
elif c.userFlag() > 0:
col = flagColours[c.userFlag()]
-
+ elif c.note().hasTag("Marked"):
+ col = COLOUR_MARKED
if col:
brush = QBrush(QColor(col))
painter.save()
@@ -408,6 +410,7 @@ class Browser(QMainWindow):
f.actionAdd_Tags.triggered.connect(lambda: self.addTags())
f.actionRemove_Tags.triggered.connect(lambda: self.deleteTags())
f.actionClear_Unused_Tags.triggered.connect(self.clearUnusedTags)
+ f.actionToggle_Mark.triggered.connect(lambda: self.onMark())
f.actionChangeModel.triggered.connect(self.onChangeModel)
f.actionFindDuplicates.triggered.connect(self.onFindDupes)
f.actionFindReplace.triggered.connect(self.onFindReplace)
@@ -1464,13 +1467,24 @@ update cards set usn=?, mod=?, did=? where id in """ + scids,
self.model.reset()
self.mw.requireReset()
- # Flags
+ # Flags & Marking
######################################################################
def onSetFlag(self, n):
self.col.setUserFlag(n, self.selectedCards())
self.model.reset()
+ def onMark(self, mark=None):
+ if mark is None:
+ mark = not self.isMarked()
+ if mark:
+ self.addTags(tags="marked", label=False)
+ else:
+ self.deleteTags(tags="marked", label=False)
+
+ def isMarked(self):
+ return not not (self.card and self.card.note().hasTag("Marked"))
+
# Repositioning
######################################################################
diff --git a/aqt/reviewer.py b/aqt/reviewer.py
index 452da6972..2a6003a05 100644
--- a/aqt/reviewer.py
+++ b/aqt/reviewer.py
@@ -120,6 +120,7 @@ class Reviewer:
def revHtml(self):
extra = self.mw.col.conf.get("reviewExtra", "")
return f"""
+
★
⚑
{extra}
@@ -171,6 +172,7 @@ The front of this card is empty. Please run Tools>Empty Cards.""")
self.web.eval("_showQuestion(%s,'%s');" % (json.dumps(q), bodyclass))
self._drawFlag()
+ self._drawMark()
self._showAnswerButton()
# if we have a type answer field, focus main web
if self.typeCorrect:
@@ -190,6 +192,10 @@ The front of this card is empty. Please run Tools>Empty Cards.""")
def _drawFlag(self):
self.web.eval("_drawFlag(%s);" % self.card.userFlag())
+ def _drawMark(self):
+ self.web.eval("_drawMark(%s);" % json.dumps(
+ self.card.note().hasTag("marked")))
+
# Showing the answer
##########################################################################
@@ -243,6 +249,7 @@ The front of this card is empty. Please run Tools>Empty Cards.""")
("Ctrl+3", lambda: self.setFlag(3)),
("Ctrl+4", lambda: self.setFlag(4)),
("Ctrl+0", lambda: self.setFlag(0)),
+ ("*", self.onMark),
("=", self.onBuryNote),
("-", self.onBuryCard),
("!", self.onSuspend),
@@ -574,6 +581,7 @@ time = %(time)d;
[_("Blue Flag"), "Ctrl+4", lambda: self.setFlag(4)],
[_("No Flag"), "Ctrl+5", lambda: self.setFlag(0)],
]],
+ [_("Mark Note"), "*", self.onMark],
[_("Bury Card"), "-", self.onBuryCard],
[_("Bury Note"), "=", self.onBuryNote],
[_("Suspend Card"), "@", self.onSuspendCard],
@@ -616,6 +624,15 @@ time = %(time)d;
self.card.flush()
self._drawFlag()
+ def onMark(self):
+ f = self.card.note()
+ if f.hasTag("marked"):
+ f.delTag("marked")
+ else:
+ f.addTag("marked")
+ f.flush()
+ self._drawMark()
+
def onSuspend(self):
self.mw.checkpoint(_("Suspend"))
self.mw.col.sched.suspendCards(
diff --git a/designer/browser.ui b/designer/browser.ui
index c85c37288..38713fcc6 100644
--- a/designer/browser.ui
+++ b/designer/browser.ui
@@ -294,6 +294,7 @@
+
@@ -569,6 +570,14 @@
Manage Note Types...
+
+
+ Toggle Mark
+
+
+ Ctrl+K
+
+
diff --git a/web/reviewer.css b/web/reviewer.css
index 44967cbaf..59c2f8561 100644
--- a/web/reviewer.css
+++ b/web/reviewer.css
@@ -14,10 +14,23 @@ img {
#_flag {
position: fixed;
- right: 7px;
+ right: 10px;
top: 0;
font-size: 30px;
display: none;
+ -webkit-text-stroke-width: 1px;
+ -webkit-text-stroke-color: black;
+}
+
+#_mark {
+ position: fixed;
+ left: 10px;
+ top: 0;
+ font-size: 30px;
+ color: yellow;
+ display: none;
+ -webkit-text-stroke-width: 1px;
+ -webkit-text-stroke-color: black;
}
#typeans {
diff --git a/web/reviewer.js b/web/reviewer.js
index 5b195c134..ef2b21e24 100644
--- a/web/reviewer.js
+++ b/web/reviewer.js
@@ -76,6 +76,15 @@ function _drawFlag(flag) {
elem.css("color", _flagColours[flag]);
}
+function _drawMark(mark) {
+ var elem = $("#_mark");
+ if (!mark) {
+ elem.hide();
+ } else {
+ elem.show();
+ }
+}
+
function _typeAnsPress() {
if (window.event.keyCode === 13) {
pycmd("ans");