mirror of
https://github.com/ankitects/anki.git
synced 2025-09-20 06:52:21 -04:00
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
3 changed files with 120 additions and 4 deletions
|
@ -2112,6 +2112,84 @@ class _ReviewerWillEndHook:
|
||||||
reviewer_will_end = _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:
|
class _ReviewerWillShowContextMenuHook:
|
||||||
_hooks: List[Callable[["aqt.reviewer.Reviewer", QMenu], None]] = []
|
_hooks: List[Callable[["aqt.reviewer.Reviewer", QMenu], None]] = []
|
||||||
|
|
||||||
|
|
|
@ -183,10 +183,14 @@ class Reviewer:
|
||||||
q = c.q()
|
q = c.q()
|
||||||
# play audio?
|
# play audio?
|
||||||
if c.autoplay():
|
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:
|
else:
|
||||||
av_player.clear_queue_and_maybe_interrupt()
|
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
|
# render & update bottom
|
||||||
q = self._mungeQA(q)
|
q = self._mungeQA(q)
|
||||||
q = gui_hooks.card_will_show(q, c, "reviewQuestion")
|
q = gui_hooks.card_will_show(q, c, "reviewQuestion")
|
||||||
|
@ -225,10 +229,14 @@ class Reviewer:
|
||||||
a = c.a()
|
a = c.a()
|
||||||
# play audio?
|
# play audio?
|
||||||
if c.autoplay():
|
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:
|
else:
|
||||||
av_player.clear_queue_and_maybe_interrupt()
|
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 = self._mungeQA(a)
|
||||||
a = gui_hooks.card_will_show(a, c, "reviewAnswer")
|
a = gui_hooks.card_will_show(a, c, "reviewAnswer")
|
||||||
# render and update bottom
|
# render and update bottom
|
||||||
|
|
|
@ -90,6 +90,36 @@ hooks = [
|
||||||
legacy_hook="reviewCleanup",
|
legacy_hook="reviewCleanup",
|
||||||
doc="Called before Anki transitions from the review screen to another screen.",
|
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
|
# Debug
|
||||||
###################
|
###################
|
||||||
Hook(
|
Hook(
|
||||||
|
|
Loading…
Reference in a new issue