Merge pull request #719 from ANH25/reviewer-hooks

Add reviewer_will_play_question_sounds and reviewer_will_play_answer_sounds hooks
This commit is contained in:
Damien Elmes 2020-07-31 14:06:28 +10:00 committed by GitHub
commit 628d961ad6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 120 additions and 4 deletions

View File

@ -2112,6 +2112,84 @@ class _ReviewerWillEndHook:
reviewer_will_end = _ReviewerWillEndHook()
class _ReviewerWillPlayAnswerSoundsHook:
"""Called before showing the answer/back side.
`tags` can be used to inspect and manipulate the sounds
that will be played (if any).
This won't be called when the user manually plays sounds
using `Replay Audio`.
Note that this hook is called even when the `Automatically play audio`
option is unchecked; This is so as to allow playing custom
sounds regardless of that option."""
_hooks: List[Callable[[Card, "List[anki.sound.AVTag]"], None]] = []
def append(self, cb: Callable[[Card, "List[anki.sound.AVTag]"], None]) -> None:
"""(card: Card, tags: List[anki.sound.AVTag])"""
self._hooks.append(cb)
def remove(self, cb: Callable[[Card, "List[anki.sound.AVTag]"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def count(self) -> int:
return len(self._hooks)
def __call__(self, card: Card, tags: List[anki.sound.AVTag]) -> None:
for hook in self._hooks:
try:
hook(card, tags)
except:
# if the hook fails, remove it
self._hooks.remove(hook)
raise
reviewer_will_play_answer_sounds = _ReviewerWillPlayAnswerSoundsHook()
class _ReviewerWillPlayQuestionSoundsHook:
"""Called before showing the question/front side.
`tags` can be used to inspect and manipulate the sounds
that will be played (if any).
This won't be called when the user manually plays sounds
using `Replay Audio`.
Note that this hook is called even when the `Automatically play audio`
option is unchecked; This is so as to allow playing custom
sounds regardless of that option."""
_hooks: List[Callable[[Card, "List[anki.sound.AVTag]"], None]] = []
def append(self, cb: Callable[[Card, "List[anki.sound.AVTag]"], None]) -> None:
"""(card: Card, tags: List[anki.sound.AVTag])"""
self._hooks.append(cb)
def remove(self, cb: Callable[[Card, "List[anki.sound.AVTag]"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def count(self) -> int:
return len(self._hooks)
def __call__(self, card: Card, tags: List[anki.sound.AVTag]) -> None:
for hook in self._hooks:
try:
hook(card, tags)
except:
# if the hook fails, remove it
self._hooks.remove(hook)
raise
reviewer_will_play_question_sounds = _ReviewerWillPlayQuestionSoundsHook()
class _ReviewerWillShowContextMenuHook:
_hooks: List[Callable[["aqt.reviewer.Reviewer", QMenu], None]] = []

View File

@ -183,10 +183,14 @@ class Reviewer:
q = c.q()
# play audio?
if c.autoplay():
av_player.play_tags(c.question_av_tags())
sounds = c.question_av_tags()
gui_hooks.reviewer_will_play_question_sounds(c, sounds)
av_player.play_tags(sounds)
else:
av_player.clear_queue_and_maybe_interrupt()
sounds = []
gui_hooks.reviewer_will_play_question_sounds(c, sounds)
av_player.play_tags(sounds)
# render & update bottom
q = self._mungeQA(q)
q = gui_hooks.card_will_show(q, c, "reviewQuestion")
@ -225,10 +229,14 @@ class Reviewer:
a = c.a()
# play audio?
if c.autoplay():
av_player.play_tags(c.answer_av_tags())
sounds = c.answer_av_tags()
gui_hooks.reviewer_will_play_answer_sounds(c, sounds)
av_player.play_tags(sounds)
else:
av_player.clear_queue_and_maybe_interrupt()
sounds = []
gui_hooks.reviewer_will_play_answer_sounds(c, sounds)
av_player.play_tags(sounds)
a = self._mungeQA(a)
a = gui_hooks.card_will_show(a, c, "reviewAnswer")
# render and update bottom

View File

@ -90,6 +90,36 @@ hooks = [
legacy_hook="reviewCleanup",
doc="Called before Anki transitions from the review screen to another screen.",
),
Hook(
name="reviewer_will_play_question_sounds",
args=["card: Card", "tags: List[anki.sound.AVTag]"],
doc="""Called before showing the question/front side.
`tags` can be used to inspect and manipulate the sounds
that will be played (if any).
This won't be called when the user manually plays sounds
using `Replay Audio`.
Note that this hook is called even when the `Automatically play audio`
option is unchecked; This is so as to allow playing custom
sounds regardless of that option.""",
),
Hook(
name="reviewer_will_play_answer_sounds",
args=["card: Card", "tags: List[anki.sound.AVTag]"],
doc="""Called before showing the answer/back side.
`tags` can be used to inspect and manipulate the sounds
that will be played (if any).
This won't be called when the user manually plays sounds
using `Replay Audio`.
Note that this hook is called even when the `Automatically play audio`
option is unchecked; This is so as to allow playing custom
sounds regardless of that option.""",
),
# Debug
###################
Hook(