diff --git a/ftl/core/preferences.ftl b/ftl/core/preferences.ftl
index 23b72f267..a702cca4a 100644
--- a/ftl/core/preferences.ftl
+++ b/ftl/core/preferences.ftl
@@ -14,6 +14,7 @@ preferences-on-next-sync-force-changes-in = On next sync, force changes in one d
preferences-paste-clipboard-images-as-png = Paste clipboard images as PNG
preferences-paste-without-shift-key-strips-formatting = Paste without shift key strips formatting
preferences-generate-latex-images-automatically = Generate LaTeX images (security risk)
+preferences-use-new-reviewer = Use new reviewer
preferences-latex-generation-disabled = LaTeX image generation is disabled in the preferences.
preferences-periodically-sync-media = Periodically sync media
preferences-please-restart-anki-to-complete-language = Please restart Anki to complete language change.
diff --git a/proto/anki/config.proto b/proto/anki/config.proto
index ea115f0fc..f7a04e38d 100644
--- a/proto/anki/config.proto
+++ b/proto/anki/config.proto
@@ -57,6 +57,7 @@ message ConfigKey {
LOAD_BALANCER_ENABLED = 26;
FSRS_SHORT_TERM_WITH_STEPS_ENABLED = 27;
FSRS_LEGACY_EVALUATE = 28;
+ NEW_REVIEWER = 29;
}
enum String {
SET_DUE_BROWSER = 0;
@@ -120,6 +121,7 @@ message Preferences {
uint32 time_limit_secs = 5;
bool load_balancer_enabled = 6;
bool fsrs_short_term_with_steps_enabled = 7;
+ bool new_reviewer = 8;
}
message Editing {
bool adding_defaults_to_current_deck = 1;
diff --git a/qt/aqt/forms/preferences.ui b/qt/aqt/forms/preferences.ui
index 0035e1f42..2a59b5f9d 100644
--- a/qt/aqt/forms/preferences.ui
+++ b/qt/aqt/forms/preferences.ui
@@ -451,6 +451,19 @@
+ -
+
+
+
+ 0
+ 0
+
+
+
+ preferences_use_new_reviewer
+
+
+
-
diff --git a/qt/aqt/main.py b/qt/aqt/main.py
index 3affb3a2e..98d4409a3 100644
--- a/qt/aqt/main.py
+++ b/qt/aqt/main.py
@@ -255,13 +255,11 @@ class AnkiQt(QMainWindow):
# screens
self.setupDeckBrowser()
self.setupOverview()
- self.setupReviewer()
+ # self.setupReviewer()
def finish_ui_setup(self) -> None:
"Actions that are deferred until after add-on loading."
self.toolbar.draw()
- # add-ons are only available here after setupAddons
- gui_hooks.reviewer_did_init(self.reviewer)
def setupProfileAfterWebviewsLoaded(self) -> None:
for w in (self.web, self.bottomWeb):
@@ -679,6 +677,8 @@ class AnkiQt(QMainWindow):
# dump error to stderr so it gets picked up by errors.py
traceback.print_exc()
+ self.setupReviewer(self.backend.get_config_bool(Config.Bool.NEW_REVIEWER))
+
return True
def _loadCollection(self) -> None:
@@ -1074,10 +1074,13 @@ title="{}" {}>{}""".format(
self.overview = Overview(self)
- def setupReviewer(self) -> None:
+ def setupReviewer(self, new: bool) -> None:
from aqt.reviewer import Reviewer, SvelteReviewer
- self.reviewer = SvelteReviewer(self) if True else Reviewer(self)
+ self.reviewer = SvelteReviewer(self) if new else Reviewer(self)
+
+ # add-ons are only available here after setupAddons
+ gui_hooks.reviewer_did_init(self.reviewer)
# Syncing
##########################################################################
diff --git a/qt/aqt/preferences.py b/qt/aqt/preferences.py
index 939dd8c2c..8895becb1 100644
--- a/qt/aqt/preferences.py
+++ b/qt/aqt/preferences.py
@@ -138,6 +138,7 @@ class Preferences(QDialog):
form.showProgress.setChecked(reviewing.show_remaining_due_counts)
form.showPlayButtons.setChecked(not reviewing.hide_audio_play_buttons)
form.interrupt_audio.setChecked(reviewing.interrupt_audio_when_answering)
+ form.new_reviewer.setChecked(reviewing.new_reviewer)
editing = self.prefs.editing
form.useCurrent.setCurrentIndex(
@@ -173,6 +174,8 @@ class Preferences(QDialog):
reviewing.time_limit_secs = form.timeLimit.value() * 60
reviewing.hide_audio_play_buttons = not self.form.showPlayButtons.isChecked()
reviewing.interrupt_audio_when_answering = self.form.interrupt_audio.isChecked()
+ reviewing.new_reviewer = form.new_reviewer.isChecked()
+ aqt.mw.setupReviewer(reviewing.new_reviewer)
editing = self.prefs.editing
editing.adding_defaults_to_current_deck = not form.useCurrent.currentIndex()
diff --git a/rslib/src/backend/config.rs b/rslib/src/backend/config.rs
index b6e81ce2a..9bc1140a2 100644
--- a/rslib/src/backend/config.rs
+++ b/rslib/src/backend/config.rs
@@ -40,6 +40,7 @@ impl From for BoolKey {
BoolKeyProto::LoadBalancerEnabled => BoolKey::LoadBalancerEnabled,
BoolKeyProto::FsrsShortTermWithStepsEnabled => BoolKey::FsrsShortTermWithStepsEnabled,
BoolKeyProto::FsrsLegacyEvaluate => BoolKey::FsrsLegacyEvaluate,
+ BoolKeyProto::NewReviewer => BoolKey::NewReviewer,
}
}
}
diff --git a/rslib/src/config/bool.rs b/rslib/src/config/bool.rs
index c76787cb0..a5ba0e70f 100644
--- a/rslib/src/config/bool.rs
+++ b/rslib/src/config/bool.rs
@@ -44,6 +44,7 @@ pub enum BoolKey {
FsrsLegacyEvaluate,
LoadBalancerEnabled,
FsrsShortTermWithStepsEnabled,
+ NewReviewer,
#[strum(to_string = "normalize_note_text")]
NormalizeNoteText,
#[strum(to_string = "dayLearnFirst")]
diff --git a/rslib/src/preferences.rs b/rslib/src/preferences.rs
index 96be8e461..fa760baef 100644
--- a/rslib/src/preferences.rs
+++ b/rslib/src/preferences.rs
@@ -101,6 +101,7 @@ impl Collection {
load_balancer_enabled: self.get_config_bool(BoolKey::LoadBalancerEnabled),
fsrs_short_term_with_steps_enabled: self
.get_config_bool(BoolKey::FsrsShortTermWithStepsEnabled),
+ new_reviewer: self.get_config_bool(BoolKey::NewReviewer),
})
}
@@ -125,6 +126,7 @@ impl Collection {
BoolKey::FsrsShortTermWithStepsEnabled,
s.fsrs_short_term_with_steps_enabled,
)?;
+ self.set_config_bool_inner(BoolKey::NewReviewer, settings.new_reviewer)?;
Ok(())
}