idempotent hook removal

This matches remHook()'s behaviour
This commit is contained in:
Damien Elmes 2020-01-15 13:07:05 +10:00
parent 97bd86e0ad
commit 26cb9851b4
3 changed files with 108 additions and 54 deletions

View file

@ -42,6 +42,7 @@ class _CreateExportersListHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[List[Tuple[str, Any]]], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, exporters: List[Tuple[str, Any]]) -> None:
@ -67,6 +68,7 @@ class _DeckCreatedHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Dict[str, Any]], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, deck: Dict[str, Any]) -> None:
@ -92,6 +94,7 @@ class _ExportedMediaFilesHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[int], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, count: int) -> None:
@ -115,6 +118,7 @@ class _FieldReplacementFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[str, str, str, Dict[str, str]], str]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(
@ -141,6 +145,7 @@ class _HttpDataReceivedHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[int], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, bytes: int) -> None:
@ -164,6 +169,7 @@ class _HttpDataSentHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[int], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, bytes: int) -> None:
@ -187,6 +193,7 @@ class _LeechHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Card], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, card: Card) -> None:
@ -212,6 +219,7 @@ class _ModSchemaFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[bool], bool]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, proceed: bool) -> bool:
@ -240,6 +248,7 @@ class _ModifyFieldsForRenderingHook:
def remove(
self, cb: Callable[[Dict[str, str], Dict[str, Any], QAData], None]
) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(
@ -265,6 +274,7 @@ class _NoteTypeCreatedHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Dict[str, Any]], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, notetype: Dict[str, Any]) -> None:
@ -290,6 +300,7 @@ class _OdueInvalidHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self) -> None:
@ -313,6 +324,7 @@ class _OriginalCardTemplateFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[str, bool], str]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, template: str, question_side: bool) -> str:
@ -337,6 +349,7 @@ class _PrepareSearchesHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Dict[str, Callable]], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, searches: Dict[str, Callable]) -> None:
@ -366,6 +379,7 @@ class _RemoveNotesHook:
def remove(
self, cb: Callable[["anki.storage._Collection", List[int]], None]
) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, col: anki.storage._Collection, ids: List[int]) -> None:
@ -429,6 +443,7 @@ class _RenderedCardTemplateFilter:
str,
],
) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(
@ -463,6 +478,7 @@ class _SyncProgressMessageHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, msg: str) -> None:
@ -488,6 +504,7 @@ class _SyncStageHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, stage: str) -> None:
@ -513,6 +530,7 @@ class _TagCreatedHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, tag: str) -> None:

View file

@ -81,6 +81,7 @@ class {self.classname()}:
self._hooks.append(cb)
def remove(self, cb: {self.callable()}) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
{self.fire_code()}
{self.full_name()} = {self.classname()}()

View file

@ -31,6 +31,7 @@ class _AddCardsHistoryMenuWillShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.addcards.AddCards", QMenu], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, addcards: aqt.addcards.AddCards, menu: QMenu) -> None:
@ -56,6 +57,7 @@ class _AddCardsNoteDidAddHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["anki.notes.Note"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, note: anki.notes.Note) -> None:
@ -81,6 +83,7 @@ class _BrowserContextMenuWillShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.browser.Browser", QMenu], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, browser: aqt.browser.Browser, menu: QMenu) -> None:
@ -106,6 +109,7 @@ class _BrowserMenusDidSetupHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.browser.Browser"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, browser: aqt.browser.Browser) -> None:
@ -131,6 +135,7 @@ class _BrowserRowDidChangeHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.browser.Browser"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, browser: aqt.browser.Browser) -> None:
@ -158,6 +163,7 @@ class _CardTextFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[str, Card, str], str]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, text: str, card: Card, kind: str) -> str:
@ -184,6 +190,7 @@ class _CollectionDidLoadHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["anki.storage._Collection"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, col: anki.storage._Collection) -> None:
@ -209,6 +216,7 @@ class _CurrentNoteTypeDidChangeHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Dict[str, Any]], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, notetype: Dict[str, Any]) -> None:
@ -234,6 +242,7 @@ class _DeckBrowserOptionsMenuWillShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[QMenu, int], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, menu: QMenu, deck_id: int) -> None:
@ -259,6 +268,7 @@ class _EditorButtonsDidSetupHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[List, "aqt.editor.Editor"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, buttons: List, editor: aqt.editor.Editor) -> None:
@ -282,6 +292,7 @@ class _EditorContextMenuWillShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.editor.EditorWebView", QMenu], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, editor_webview: aqt.editor.EditorWebView, menu: QMenu) -> None:
@ -307,6 +318,7 @@ class _EditorFieldDidGainFocusHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["anki.notes.Note", int], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, note: anki.notes.Note, current_field_idx: int) -> None:
@ -332,6 +344,7 @@ class _EditorFieldDidLoseFocusFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[bool, "anki.notes.Note", int], bool]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(
@ -360,6 +373,7 @@ class _EditorFontForFieldFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], str]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, font: str) -> str:
@ -386,6 +400,7 @@ class _EditorNoteDidLoadHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.editor.Editor"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, editor: aqt.editor.Editor) -> None:
@ -411,6 +426,7 @@ class _EditorShortcutsDidSetupHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[List[Tuple], "aqt.editor.Editor"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, shortcuts: List[Tuple], editor: aqt.editor.Editor) -> None:
@ -436,6 +452,7 @@ class _EditorTagsDidUpdateHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["anki.notes.Note"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, note: anki.notes.Note) -> None:
@ -461,6 +478,7 @@ class _EditorTypingTimerDidFireHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["anki.notes.Note"], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, note: anki.notes.Note) -> None:
@ -486,6 +504,7 @@ class _MpvDidIdleHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self) -> None:
@ -509,6 +528,7 @@ class _MpvWillPlayHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, file: str) -> None:
@ -534,6 +554,7 @@ class _ProfileDidOpenHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self) -> None:
@ -559,6 +580,7 @@ class _ProfileWillCloseHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self) -> None:
@ -584,6 +606,7 @@ class _ReviewDidUndoHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[int], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, card_id: int) -> None:
@ -609,6 +632,7 @@ class _ReviewerAnswerDidShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Card], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, card: Card) -> None:
@ -634,6 +658,7 @@ class _ReviewerContextMenuWillShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.reviewer.Reviewer", QMenu], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, reviewer: aqt.reviewer.Reviewer, menu: QMenu) -> None:
@ -659,6 +684,7 @@ class _ReviewerQuestionDidShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[Card], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, card: Card) -> None:
@ -686,6 +712,7 @@ class _ReviewerWillEndHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self) -> None:
@ -711,6 +738,7 @@ class _StateDidChangeHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str, str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, new_state: str, old_state: str) -> None:
@ -738,6 +766,7 @@ class _StateDidResetHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self) -> None:
@ -765,6 +794,7 @@ class _StateDidRevertHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, action: str) -> None:
@ -790,6 +820,7 @@ class _StateShortcutsWillChangeHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str, List[Tuple[str, Callable]]], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, state: str, shortcuts: List[Tuple[str, Callable]]) -> None:
@ -813,6 +844,7 @@ class _StateWillChangeHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[str, str], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, new_state: str, old_state: str) -> None:
@ -838,6 +870,7 @@ class _StyleDidSetupFilter:
self._hooks.append(cb)
def remove(self, cb: Callable[[str], str]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, style: str) -> str:
@ -864,6 +897,7 @@ class _UndoStateDidChangeHook:
self._hooks.append(cb)
def remove(self, cb: Callable[[bool], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, can_undo: bool) -> None:
@ -889,6 +923,7 @@ class _WebviewContextMenuWillShowHook:
self._hooks.append(cb)
def remove(self, cb: Callable[["aqt.webview.AnkiWebView", QMenu], None]) -> None:
if cb in self._hooks:
self._hooks.remove(cb)
def __call__(self, webview: aqt.webview.AnkiWebView, menu: QMenu) -> None: