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:
Abdo 2023-12-13 02:23:11 +03:00 committed by GitHub
parent eb58863a7c
commit aa71313d12
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 32 deletions

View file

@ -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
##########################################################################

View file

@ -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: