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:
commit
628d961ad6
@ -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]] = []
|
||||
|
||||
|
@ -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
|
||||
|
@ -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(
|
||||
|
Loading…
Reference in New Issue
Block a user