diff --git a/pylib/anki/hooks.py b/pylib/anki/hooks.py index bf5d77695..a7a419335 100644 --- a/pylib/anki/hooks.py +++ b/pylib/anki/hooks.py @@ -42,7 +42,8 @@ class _CreateExportersListHook: self._hooks.append(cb) def remove(self, cb: Callable[[List[Tuple[str, Any]]], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, exporters: List[Tuple[str, Any]]) -> None: for hook in self._hooks: @@ -67,7 +68,8 @@ class _DeckCreatedHook: self._hooks.append(cb) def remove(self, cb: Callable[[Dict[str, Any]], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, deck: Dict[str, Any]) -> None: for hook in self._hooks: @@ -92,7 +94,8 @@ class _ExportedMediaFilesHook: self._hooks.append(cb) def remove(self, cb: Callable[[int], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, count: int) -> None: for hook in self._hooks: @@ -115,7 +118,8 @@ class _FieldReplacementFilter: self._hooks.append(cb) def remove(self, cb: Callable[[str, str, str, Dict[str, str]], str]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__( self, field_text: str, field_name: str, filter_name: str, fields: Dict[str, str] @@ -141,7 +145,8 @@ class _HttpDataReceivedHook: self._hooks.append(cb) def remove(self, cb: Callable[[int], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, bytes: int) -> None: for hook in self._hooks: @@ -164,7 +169,8 @@ class _HttpDataSentHook: self._hooks.append(cb) def remove(self, cb: Callable[[int], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, bytes: int) -> None: for hook in self._hooks: @@ -187,7 +193,8 @@ class _LeechHook: self._hooks.append(cb) def remove(self, cb: Callable[[Card], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, card: Card) -> None: for hook in self._hooks: @@ -212,7 +219,8 @@ class _ModSchemaFilter: self._hooks.append(cb) def remove(self, cb: Callable[[bool], bool]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, proceed: bool) -> bool: for filter in self._hooks: @@ -240,7 +248,8 @@ class _ModifyFieldsForRenderingHook: def remove( self, cb: Callable[[Dict[str, str], Dict[str, Any], QAData], None] ) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__( self, fields: Dict[str, str], notetype: Dict[str, Any], data: QAData @@ -265,7 +274,8 @@ class _NoteTypeCreatedHook: self._hooks.append(cb) def remove(self, cb: Callable[[Dict[str, Any]], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, notetype: Dict[str, Any]) -> None: for hook in self._hooks: @@ -290,7 +300,8 @@ class _OdueInvalidHook: self._hooks.append(cb) def remove(self, cb: Callable[[], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self) -> None: for hook in self._hooks: @@ -313,7 +324,8 @@ class _OriginalCardTemplateFilter: self._hooks.append(cb) def remove(self, cb: Callable[[str, bool], str]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, template: str, question_side: bool) -> str: for filter in self._hooks: @@ -337,7 +349,8 @@ class _PrepareSearchesHook: self._hooks.append(cb) def remove(self, cb: Callable[[Dict[str, Callable]], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, searches: Dict[str, Callable]) -> None: for hook in self._hooks: @@ -366,7 +379,8 @@ class _RemoveNotesHook: def remove( self, cb: Callable[["anki.storage._Collection", List[int]], None] ) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, col: anki.storage._Collection, ids: List[int]) -> None: for hook in self._hooks: @@ -429,7 +443,8 @@ class _RenderedCardTemplateFilter: str, ], ) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__( self, @@ -463,7 +478,8 @@ class _SyncProgressMessageHook: self._hooks.append(cb) def remove(self, cb: Callable[[str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, msg: str) -> None: for hook in self._hooks: @@ -488,7 +504,8 @@ class _SyncStageHook: self._hooks.append(cb) def remove(self, cb: Callable[[str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, stage: str) -> None: for hook in self._hooks: @@ -513,7 +530,8 @@ class _TagCreatedHook: self._hooks.append(cb) def remove(self, cb: Callable[[str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, tag: str) -> None: for hook in self._hooks: diff --git a/pylib/tools/hookslib.py b/pylib/tools/hookslib.py index 42618b076..800790fc4 100644 --- a/pylib/tools/hookslib.py +++ b/pylib/tools/hookslib.py @@ -81,7 +81,8 @@ class {self.classname()}: self._hooks.append(cb) def remove(self, cb: {self.callable()}) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) {self.fire_code()} {self.full_name()} = {self.classname()}() """ diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index 16f26bc6f..92e245bec 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -31,7 +31,8 @@ class _AddCardsHistoryMenuWillShowHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.addcards.AddCards", QMenu], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, addcards: aqt.addcards.AddCards, menu: QMenu) -> None: for hook in self._hooks: @@ -56,7 +57,8 @@ class _AddCardsNoteDidAddHook: self._hooks.append(cb) def remove(self, cb: Callable[["anki.notes.Note"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, note: anki.notes.Note) -> None: for hook in self._hooks: @@ -81,7 +83,8 @@ class _BrowserContextMenuWillShowHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.browser.Browser", QMenu], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, browser: aqt.browser.Browser, menu: QMenu) -> None: for hook in self._hooks: @@ -106,7 +109,8 @@ class _BrowserMenusDidSetupHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.browser.Browser"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, browser: aqt.browser.Browser) -> None: for hook in self._hooks: @@ -131,7 +135,8 @@ class _BrowserRowDidChangeHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.browser.Browser"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, browser: aqt.browser.Browser) -> None: for hook in self._hooks: @@ -158,7 +163,8 @@ class _CardTextFilter: self._hooks.append(cb) def remove(self, cb: Callable[[str, Card, str], str]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, text: str, card: Card, kind: str) -> str: for filter in self._hooks: @@ -184,7 +190,8 @@ class _CollectionDidLoadHook: self._hooks.append(cb) def remove(self, cb: Callable[["anki.storage._Collection"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, col: anki.storage._Collection) -> None: for hook in self._hooks: @@ -209,7 +216,8 @@ class _CurrentNoteTypeDidChangeHook: self._hooks.append(cb) def remove(self, cb: Callable[[Dict[str, Any]], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, notetype: Dict[str, Any]) -> None: for hook in self._hooks: @@ -234,7 +242,8 @@ class _DeckBrowserOptionsMenuWillShowHook: self._hooks.append(cb) def remove(self, cb: Callable[[QMenu, int], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, menu: QMenu, deck_id: int) -> None: for hook in self._hooks: @@ -259,7 +268,8 @@ class _EditorButtonsDidSetupHook: self._hooks.append(cb) def remove(self, cb: Callable[[List, "aqt.editor.Editor"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, buttons: List, editor: aqt.editor.Editor) -> None: for hook in self._hooks: @@ -282,7 +292,8 @@ class _EditorContextMenuWillShowHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.editor.EditorWebView", QMenu], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, editor_webview: aqt.editor.EditorWebView, menu: QMenu) -> None: for hook in self._hooks: @@ -307,7 +318,8 @@ class _EditorFieldDidGainFocusHook: self._hooks.append(cb) def remove(self, cb: Callable[["anki.notes.Note", int], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, note: anki.notes.Note, current_field_idx: int) -> None: for hook in self._hooks: @@ -332,7 +344,8 @@ class _EditorFieldDidLoseFocusFilter: self._hooks.append(cb) def remove(self, cb: Callable[[bool, "anki.notes.Note", int], bool]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__( self, changed: bool, note: anki.notes.Note, current_field_idx: int @@ -360,7 +373,8 @@ class _EditorFontForFieldFilter: self._hooks.append(cb) def remove(self, cb: Callable[[str], str]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, font: str) -> str: for filter in self._hooks: @@ -386,7 +400,8 @@ class _EditorNoteDidLoadHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.editor.Editor"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, editor: aqt.editor.Editor) -> None: for hook in self._hooks: @@ -411,7 +426,8 @@ class _EditorShortcutsDidSetupHook: self._hooks.append(cb) def remove(self, cb: Callable[[List[Tuple], "aqt.editor.Editor"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, shortcuts: List[Tuple], editor: aqt.editor.Editor) -> None: for hook in self._hooks: @@ -436,7 +452,8 @@ class _EditorTagsDidUpdateHook: self._hooks.append(cb) def remove(self, cb: Callable[["anki.notes.Note"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, note: anki.notes.Note) -> None: for hook in self._hooks: @@ -461,7 +478,8 @@ class _EditorTypingTimerDidFireHook: self._hooks.append(cb) def remove(self, cb: Callable[["anki.notes.Note"], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, note: anki.notes.Note) -> None: for hook in self._hooks: @@ -486,7 +504,8 @@ class _MpvDidIdleHook: self._hooks.append(cb) def remove(self, cb: Callable[[], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self) -> None: for hook in self._hooks: @@ -509,7 +528,8 @@ class _MpvWillPlayHook: self._hooks.append(cb) def remove(self, cb: Callable[[str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, file: str) -> None: for hook in self._hooks: @@ -534,7 +554,8 @@ class _ProfileDidOpenHook: self._hooks.append(cb) def remove(self, cb: Callable[[], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self) -> None: for hook in self._hooks: @@ -559,7 +580,8 @@ class _ProfileWillCloseHook: self._hooks.append(cb) def remove(self, cb: Callable[[], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self) -> None: for hook in self._hooks: @@ -584,7 +606,8 @@ class _ReviewDidUndoHook: self._hooks.append(cb) def remove(self, cb: Callable[[int], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, card_id: int) -> None: for hook in self._hooks: @@ -609,7 +632,8 @@ class _ReviewerAnswerDidShowHook: self._hooks.append(cb) def remove(self, cb: Callable[[Card], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, card: Card) -> None: for hook in self._hooks: @@ -634,7 +658,8 @@ class _ReviewerContextMenuWillShowHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.reviewer.Reviewer", QMenu], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, reviewer: aqt.reviewer.Reviewer, menu: QMenu) -> None: for hook in self._hooks: @@ -659,7 +684,8 @@ class _ReviewerQuestionDidShowHook: self._hooks.append(cb) def remove(self, cb: Callable[[Card], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, card: Card) -> None: for hook in self._hooks: @@ -686,7 +712,8 @@ class _ReviewerWillEndHook: self._hooks.append(cb) def remove(self, cb: Callable[[], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self) -> None: for hook in self._hooks: @@ -711,7 +738,8 @@ class _StateDidChangeHook: self._hooks.append(cb) def remove(self, cb: Callable[[str, str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, new_state: str, old_state: str) -> None: for hook in self._hooks: @@ -738,7 +766,8 @@ class _StateDidResetHook: self._hooks.append(cb) def remove(self, cb: Callable[[], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self) -> None: for hook in self._hooks: @@ -765,7 +794,8 @@ class _StateDidRevertHook: self._hooks.append(cb) def remove(self, cb: Callable[[str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, action: str) -> None: for hook in self._hooks: @@ -790,7 +820,8 @@ class _StateShortcutsWillChangeHook: self._hooks.append(cb) def remove(self, cb: Callable[[str, List[Tuple[str, Callable]]], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, state: str, shortcuts: List[Tuple[str, Callable]]) -> None: for hook in self._hooks: @@ -813,7 +844,8 @@ class _StateWillChangeHook: self._hooks.append(cb) def remove(self, cb: Callable[[str, str], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, new_state: str, old_state: str) -> None: for hook in self._hooks: @@ -838,7 +870,8 @@ class _StyleDidSetupFilter: self._hooks.append(cb) def remove(self, cb: Callable[[str], str]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, style: str) -> str: for filter in self._hooks: @@ -864,7 +897,8 @@ class _UndoStateDidChangeHook: self._hooks.append(cb) def remove(self, cb: Callable[[bool], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, can_undo: bool) -> None: for hook in self._hooks: @@ -889,7 +923,8 @@ class _WebviewContextMenuWillShowHook: self._hooks.append(cb) def remove(self, cb: Callable[["aqt.webview.AnkiWebView", QMenu], None]) -> None: - self._hooks.remove(cb) + if cb in self._hooks: + self._hooks.remove(cb) def __call__(self, webview: aqt.webview.AnkiWebView, menu: QMenu) -> None: for hook in self._hooks: