diff --git a/qt/aqt/main.py b/qt/aqt/main.py index 06b8f1faa..85475276d 100644 --- a/qt/aqt/main.py +++ b/qt/aqt/main.py @@ -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="{}" {}>{}""".format( from aqt.reviewer import Reviewer self.reviewer = Reviewer(self) - self._auto_advance_was_enabled = self.reviewer.auto_advance_enabled # Syncing ########################################################################## diff --git a/qt/aqt/reviewer.py b/qt/aqt/reviewer.py index 07a7e7256..eac9b23c7 100644 --- a/qt/aqt/reviewer.py +++ b/qt/aqt/reviewer.py @@ -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: