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.app = app
|
||||||
self.pm = profileManager
|
self.pm = profileManager
|
||||||
self.fullscreen = False
|
self.fullscreen = False
|
||||||
self._auto_advance_was_enabled = False
|
|
||||||
# init rest of app
|
# init rest of app
|
||||||
self.safeMode = (
|
self.safeMode = (
|
||||||
bool(self.app.queryKeyboardModifiers() & Qt.KeyboardModifier.ShiftModifier)
|
bool(self.app.queryKeyboardModifiers() & Qt.KeyboardModifier.ShiftModifier)
|
||||||
|
@ -773,6 +772,7 @@ class AnkiQt(QMainWindow):
|
||||||
|
|
||||||
def _reviewCleanup(self, newState: MainWindowState) -> None:
|
def _reviewCleanup(self, newState: MainWindowState) -> None:
|
||||||
if newState != "resetRequired" and newState != "review":
|
if newState != "resetRequired" and newState != "review":
|
||||||
|
self.reviewer.auto_advance_enabled = False
|
||||||
self.reviewer.cleanup()
|
self.reviewer.cleanup()
|
||||||
self.toolbarWeb.elevate()
|
self.toolbarWeb.elevate()
|
||||||
self.toolbarWeb.show()
|
self.toolbarWeb.show()
|
||||||
|
@ -829,18 +829,10 @@ class AnkiQt(QMainWindow):
|
||||||
if new_focus and new_focus.window() == self:
|
if new_focus and new_focus.window() == self:
|
||||||
if self.state == "review":
|
if self.state == "review":
|
||||||
self.reviewer.refresh_if_needed()
|
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":
|
elif self.state == "overview":
|
||||||
self.overview.refresh_if_needed()
|
self.overview.refresh_if_needed()
|
||||||
elif self.state == "deckBrowser":
|
elif self.state == "deckBrowser":
|
||||||
self.deckBrowser.refresh_if_needed()
|
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:
|
def fade_out_webview(self) -> None:
|
||||||
self.web.eval("document.body.style.opacity = 0.3")
|
self.web.eval("document.body.style.opacity = 0.3")
|
||||||
|
@ -1036,7 +1028,6 @@ title="{}" {}>{}</button>""".format(
|
||||||
from aqt.reviewer import Reviewer
|
from aqt.reviewer import Reviewer
|
||||||
|
|
||||||
self.reviewer = Reviewer(self)
|
self.reviewer = Reviewer(self)
|
||||||
self._auto_advance_was_enabled = self.reviewer.auto_advance_enabled
|
|
||||||
|
|
||||||
# Syncing
|
# Syncing
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -298,12 +298,14 @@ class Reviewer:
|
||||||
def _on_av_player_did_end_playing(self, *args) -> None:
|
def _on_av_player_did_end_playing(self, *args) -> None:
|
||||||
def task() -> None:
|
def task() -> None:
|
||||||
if av_player.queue_is_empty():
|
if av_player.queue_is_empty():
|
||||||
if self._show_question_timer and not sip.isdeleted(
|
if (
|
||||||
self._show_question_timer
|
self._show_question_timer
|
||||||
|
and self._show_question_timer.remainingTime() <= 0
|
||||||
):
|
):
|
||||||
self._on_show_question_timeout()
|
self._on_show_question_timeout()
|
||||||
elif self._show_answer_timer and not sip.isdeleted(
|
elif (
|
||||||
self._show_answer_timer
|
self._show_answer_timer
|
||||||
|
and self._show_answer_timer.remainingTime() <= 0
|
||||||
):
|
):
|
||||||
self._on_show_answer_timeout()
|
self._on_show_answer_timeout()
|
||||||
|
|
||||||
|
@ -394,30 +396,31 @@ class Reviewer:
|
||||||
self._auto_advance_to_answer_if_enabled()
|
self._auto_advance_to_answer_if_enabled()
|
||||||
|
|
||||||
def _auto_advance_to_answer_if_enabled(self) -> None:
|
def _auto_advance_to_answer_if_enabled(self) -> None:
|
||||||
|
self._clear_auto_advance_timers()
|
||||||
if self.auto_advance_enabled:
|
if self.auto_advance_enabled:
|
||||||
conf = self.mw.col.decks.config_dict_for_deck_id(
|
conf = self.mw.col.decks.config_dict_for_deck_id(
|
||||||
self.card.current_deck_id()
|
self.card.current_deck_id()
|
||||||
)
|
)
|
||||||
timer = None
|
|
||||||
if conf["secondsToShowQuestion"]:
|
if conf["secondsToShowQuestion"]:
|
||||||
timer = self._show_answer_timer = self.mw.progress.timer(
|
self._show_answer_timer = self.mw.progress.timer(
|
||||||
int(conf["secondsToShowQuestion"] * 1000),
|
int(conf["secondsToShowQuestion"] * 1000),
|
||||||
lambda: self._on_show_answer_timeout(timer),
|
self._on_show_answer_timeout,
|
||||||
repeat=False,
|
repeat=False,
|
||||||
parent=self.mw,
|
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:
|
if self.card is None:
|
||||||
return
|
return
|
||||||
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
|
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
|
||||||
if (conf["waitForAudio"] and av_player.current_player) or (
|
if conf["waitForAudio"] and av_player.current_player:
|
||||||
timer and self._show_answer_timer != timer
|
|
||||||
):
|
|
||||||
return
|
return
|
||||||
if self._show_answer_timer is not None:
|
if (
|
||||||
self._show_answer_timer.deleteLater()
|
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
|
return
|
||||||
self._showAnswer()
|
self._showAnswer()
|
||||||
|
|
||||||
|
@ -464,30 +467,31 @@ class Reviewer:
|
||||||
self._auto_advance_to_question_if_enabled()
|
self._auto_advance_to_question_if_enabled()
|
||||||
|
|
||||||
def _auto_advance_to_question_if_enabled(self) -> None:
|
def _auto_advance_to_question_if_enabled(self) -> None:
|
||||||
|
self._clear_auto_advance_timers()
|
||||||
if self.auto_advance_enabled:
|
if self.auto_advance_enabled:
|
||||||
conf = self.mw.col.decks.config_dict_for_deck_id(
|
conf = self.mw.col.decks.config_dict_for_deck_id(
|
||||||
self.card.current_deck_id()
|
self.card.current_deck_id()
|
||||||
)
|
)
|
||||||
timer = None
|
|
||||||
if conf["secondsToShowAnswer"]:
|
if conf["secondsToShowAnswer"]:
|
||||||
timer = self._show_question_timer = self.mw.progress.timer(
|
self._show_question_timer = self.mw.progress.timer(
|
||||||
int(conf["secondsToShowAnswer"] * 1000),
|
int(conf["secondsToShowAnswer"] * 1000),
|
||||||
lambda: self._on_show_question_timeout(timer),
|
self._on_show_question_timeout,
|
||||||
repeat=False,
|
repeat=False,
|
||||||
parent=self.mw,
|
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:
|
if self.card is None:
|
||||||
return
|
return
|
||||||
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
|
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
|
||||||
if (conf["waitForAudio"] and av_player.current_player) or (
|
if conf["waitForAudio"] and av_player.current_player:
|
||||||
timer and self._show_question_timer != timer
|
|
||||||
):
|
|
||||||
return
|
return
|
||||||
if self._show_question_timer is not None:
|
if (
|
||||||
self._show_question_timer.deleteLater()
|
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
|
return
|
||||||
try:
|
try:
|
||||||
answer_action = list(AnswerAction)[conf["answerAction"]]
|
answer_action = list(AnswerAction)[conf["answerAction"]]
|
||||||
|
@ -1145,6 +1149,14 @@ timerStopped = false;
|
||||||
return
|
return
|
||||||
av_player.play_file(self._recordedAudio)
|
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:
|
def toggle_auto_advance(self) -> None:
|
||||||
self.auto_advance_enabled = not self.auto_advance_enabled
|
self.auto_advance_enabled = not self.auto_advance_enabled
|
||||||
if self.auto_advance_enabled:
|
if self.auto_advance_enabled:
|
||||||
|
|
Loading…
Reference in a new issue