mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 14:02:21 -04:00
More fixes for auto advance state (#2879)
* Disable auto advance on review cleanup * Fix auto advance state resetting on card flip when bottom bar is focused * Move focus handling to reviewer * Simplify destruction of previous timers * Fix auto advance firing early * Fix handling of 'wait for audio' * Remove unused import * When focus is lost, disable auto advance (dae) Otherwise it will resume when the user answers a card, which is surprising.
This commit is contained in:
parent
eb58863a7c
commit
aa71313d12
2 changed files with 35 additions and 32 deletions
|
@ -189,7 +189,6 @@ class AnkiQt(QMainWindow):
|
|||
self.app = app
|
||||
self.pm = profileManager
|
||||
self.fullscreen = False
|
||||
self._auto_advance_was_enabled = False
|
||||
# init rest of app
|
||||
self.safeMode = (
|
||||
bool(self.app.queryKeyboardModifiers() & Qt.KeyboardModifier.ShiftModifier)
|
||||
|
@ -773,6 +772,7 @@ class AnkiQt(QMainWindow):
|
|||
|
||||
def _reviewCleanup(self, newState: MainWindowState) -> None:
|
||||
if newState != "resetRequired" and newState != "review":
|
||||
self.reviewer.auto_advance_enabled = False
|
||||
self.reviewer.cleanup()
|
||||
self.toolbarWeb.elevate()
|
||||
self.toolbarWeb.show()
|
||||
|
@ -829,18 +829,10 @@ class AnkiQt(QMainWindow):
|
|||
if new_focus and new_focus.window() == self:
|
||||
if self.state == "review":
|
||||
self.reviewer.refresh_if_needed()
|
||||
self.reviewer.auto_advance_enabled = self._auto_advance_was_enabled
|
||||
if self.reviewer.auto_advance_enabled:
|
||||
tooltip(tr.actions_auto_advance_activated())
|
||||
self.reviewer.auto_advance_if_enabled()
|
||||
elif self.state == "overview":
|
||||
self.overview.refresh_if_needed()
|
||||
elif self.state == "deckBrowser":
|
||||
self.deckBrowser.refresh_if_needed()
|
||||
elif (not new_focus or new_focus.window() != self) and self.state == "review":
|
||||
self._auto_advance_was_enabled = self.reviewer.auto_advance_enabled
|
||||
self.reviewer.auto_advance_enabled = False
|
||||
tooltip(tr.actions_auto_advance_deactivated())
|
||||
|
||||
def fade_out_webview(self) -> None:
|
||||
self.web.eval("document.body.style.opacity = 0.3")
|
||||
|
@ -1036,7 +1028,6 @@ title="{}" {}>{}</button>""".format(
|
|||
from aqt.reviewer import Reviewer
|
||||
|
||||
self.reviewer = Reviewer(self)
|
||||
self._auto_advance_was_enabled = self.reviewer.auto_advance_enabled
|
||||
|
||||
# Syncing
|
||||
##########################################################################
|
||||
|
|
|
@ -298,12 +298,14 @@ class Reviewer:
|
|||
def _on_av_player_did_end_playing(self, *args) -> None:
|
||||
def task() -> None:
|
||||
if av_player.queue_is_empty():
|
||||
if self._show_question_timer and not sip.isdeleted(
|
||||
if (
|
||||
self._show_question_timer
|
||||
and self._show_question_timer.remainingTime() <= 0
|
||||
):
|
||||
self._on_show_question_timeout()
|
||||
elif self._show_answer_timer and not sip.isdeleted(
|
||||
elif (
|
||||
self._show_answer_timer
|
||||
and self._show_answer_timer.remainingTime() <= 0
|
||||
):
|
||||
self._on_show_answer_timeout()
|
||||
|
||||
|
@ -394,30 +396,31 @@ class Reviewer:
|
|||
self._auto_advance_to_answer_if_enabled()
|
||||
|
||||
def _auto_advance_to_answer_if_enabled(self) -> None:
|
||||
self._clear_auto_advance_timers()
|
||||
if self.auto_advance_enabled:
|
||||
conf = self.mw.col.decks.config_dict_for_deck_id(
|
||||
self.card.current_deck_id()
|
||||
)
|
||||
timer = None
|
||||
if conf["secondsToShowQuestion"]:
|
||||
timer = self._show_answer_timer = self.mw.progress.timer(
|
||||
self._show_answer_timer = self.mw.progress.timer(
|
||||
int(conf["secondsToShowQuestion"] * 1000),
|
||||
lambda: self._on_show_answer_timeout(timer),
|
||||
self._on_show_answer_timeout,
|
||||
repeat=False,
|
||||
parent=self.mw,
|
||||
)
|
||||
|
||||
def _on_show_answer_timeout(self, timer: QTimer | None = None) -> None:
|
||||
def _on_show_answer_timeout(self) -> None:
|
||||
if self.card is None:
|
||||
return
|
||||
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
|
||||
if (conf["waitForAudio"] and av_player.current_player) or (
|
||||
timer and self._show_answer_timer != timer
|
||||
):
|
||||
if conf["waitForAudio"] and av_player.current_player:
|
||||
return
|
||||
if self._show_answer_timer is not None:
|
||||
self._show_answer_timer.deleteLater()
|
||||
if not self.auto_advance_enabled:
|
||||
if (
|
||||
not self.auto_advance_enabled
|
||||
or not self.mw.app.focusWidget()
|
||||
or self.mw.app.focusWidget().window() != self.mw
|
||||
):
|
||||
self.auto_advance_enabled = False
|
||||
return
|
||||
self._showAnswer()
|
||||
|
||||
|
@ -464,30 +467,31 @@ class Reviewer:
|
|||
self._auto_advance_to_question_if_enabled()
|
||||
|
||||
def _auto_advance_to_question_if_enabled(self) -> None:
|
||||
self._clear_auto_advance_timers()
|
||||
if self.auto_advance_enabled:
|
||||
conf = self.mw.col.decks.config_dict_for_deck_id(
|
||||
self.card.current_deck_id()
|
||||
)
|
||||
timer = None
|
||||
if conf["secondsToShowAnswer"]:
|
||||
timer = self._show_question_timer = self.mw.progress.timer(
|
||||
self._show_question_timer = self.mw.progress.timer(
|
||||
int(conf["secondsToShowAnswer"] * 1000),
|
||||
lambda: self._on_show_question_timeout(timer),
|
||||
self._on_show_question_timeout,
|
||||
repeat=False,
|
||||
parent=self.mw,
|
||||
)
|
||||
|
||||
def _on_show_question_timeout(self, timer: QTimer | None = None) -> None:
|
||||
def _on_show_question_timeout(self) -> None:
|
||||
if self.card is None:
|
||||
return
|
||||
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
|
||||
if (conf["waitForAudio"] and av_player.current_player) or (
|
||||
timer and self._show_question_timer != timer
|
||||
):
|
||||
if conf["waitForAudio"] and av_player.current_player:
|
||||
return
|
||||
if self._show_question_timer is not None:
|
||||
self._show_question_timer.deleteLater()
|
||||
if not self.auto_advance_enabled:
|
||||
if (
|
||||
not self.auto_advance_enabled
|
||||
or not self.mw.app.focusWidget()
|
||||
or self.mw.app.focusWidget().window() != self.mw
|
||||
):
|
||||
self.auto_advance_enabled = False
|
||||
return
|
||||
try:
|
||||
answer_action = list(AnswerAction)[conf["answerAction"]]
|
||||
|
@ -1145,6 +1149,14 @@ timerStopped = false;
|
|||
return
|
||||
av_player.play_file(self._recordedAudio)
|
||||
|
||||
def _clear_auto_advance_timers(self) -> None:
|
||||
if self._show_answer_timer:
|
||||
self._show_answer_timer.deleteLater()
|
||||
self._show_answer_timer = None
|
||||
if self._show_question_timer:
|
||||
self._show_question_timer.deleteLater()
|
||||
self._show_question_timer = None
|
||||
|
||||
def toggle_auto_advance(self) -> None:
|
||||
self.auto_advance_enabled = not self.auto_advance_enabled
|
||||
if self.auto_advance_enabled:
|
||||
|
|
Loading…
Reference in a new issue