diff --git a/ftl/core/preferences.ftl b/ftl/core/preferences.ftl
index a2555992f..9be0b3e5d 100644
--- a/ftl/core/preferences.ftl
+++ b/ftl/core/preferences.ftl
@@ -19,6 +19,7 @@ preferences-preferences = Preferences
preferences-scheduling = Scheduling
preferences-show-learning-cards-with-larger-steps = Show learning cards with larger steps before reviews
preferences-show-next-review-time-above-answer = Show next review time above answer buttons
+preferences-spacebar-rates-card = Spacebar also answers card
preferences-show-play-buttons-on-cards-with = Show play buttons on cards with audio
preferences-show-remaining-card-count = Show remaining card count
preferences-some-settings-will-take-effect-after = Some settings will take effect after you restart Anki.
diff --git a/qt/aqt/forms/preferences.ui b/qt/aqt/forms/preferences.ui
index fc2600a34..f66608d45 100644
--- a/qt/aqt/forms/preferences.ui
+++ b/qt/aqt/forms/preferences.ui
@@ -456,6 +456,19 @@
+ -
+
+
+
+ 0
+ 0
+
+
+
+ preferences_spacebar_rates_card
+
+
+
@@ -1125,6 +1138,7 @@
interrupt_audio
showProgress
showEstimates
+ spacebar_rates_card
pastePNG
paste_strips_formatting
useCurrent
diff --git a/qt/aqt/preferences.py b/qt/aqt/preferences.py
index 53a3902b0..7d0229b5a 100644
--- a/qt/aqt/preferences.py
+++ b/qt/aqt/preferences.py
@@ -226,6 +226,12 @@ class Preferences(QDialog):
self.form.minimalist_mode.setChecked(self.mw.pm.minimalist_mode())
qconnect(self.form.minimalist_mode.stateChanged, self.mw.pm.set_minimalist_mode)
+ self.form.spacebar_rates_card.setChecked(self.mw.pm.spacebar_rates_card())
+ qconnect(
+ self.form.spacebar_rates_card.stateChanged,
+ self.mw.pm.set_spacebar_rates_card,
+ )
+
hide_choices = [tr.preferences_full_screen_only(), tr.preferences_always()]
self.form.hide_top_bar.setChecked(self.mw.pm.hide_top_bar())
diff --git a/qt/aqt/profiles.py b/qt/aqt/profiles.py
index c15cbffce..f757355d8 100644
--- a/qt/aqt/profiles.py
+++ b/qt/aqt/profiles.py
@@ -531,6 +531,12 @@ create table if not exists profiles
self.meta["minimalist_mode"] = on
gui_hooks.body_classes_need_update()
+ def spacebar_rates_card(self) -> bool:
+ return self.meta.get("spacebar_rates_card", True)
+
+ def set_spacebar_rates_card(self, on: bool) -> None:
+ self.meta["spacebar_rates_card"] = on
+
def hide_top_bar(self) -> bool:
return self.meta.get("hide_top_bar", False)
diff --git a/qt/aqt/reviewer.py b/qt/aqt/reviewer.py
index ba870e8cf..d56402236 100644
--- a/qt/aqt/reviewer.py
+++ b/qt/aqt/reviewer.py
@@ -511,6 +511,11 @@ class Reviewer:
("2", lambda: self._answerCard(2)),
("3", lambda: self._answerCard(3)),
("4", lambda: self._answerCard(4)),
+ ("h", lambda: self._answerCard(1)),
+ ("j", lambda: self._answerCard(2)),
+ ("k", lambda: self._answerCard(3)),
+ ("l", lambda: self._answerCard(4)),
+ ("u", self.mw.undo),
("5", self.on_pause_audio),
("6", self.on_seek_backward),
("7", self.on_seek_forward),
@@ -531,7 +536,7 @@ class Reviewer:
def onEnterKey(self) -> None:
if self.state == "question":
self._getTypedAnswer()
- elif self.state == "answer":
+ elif self.state == "answer" and aqt.mw.pm.spacebar_rates_card():
self.bottom.web.evalWithCallback(
"selectedAnswerButton()", self._onAnswerButton
)