diff --git a/pylib/anki/hooks.py b/pylib/anki/hooks.py index 9aac5568d..ba48e4afa 100644 --- a/pylib/anki/hooks.py +++ b/pylib/anki/hooks.py @@ -12,7 +12,7 @@ modifying it. from __future__ import annotations -from typing import Any, Callable, Dict, List, Tuple +from typing import Any, Callable, Dict, List, Sequence, Tuple import decorator @@ -39,6 +39,9 @@ class _CardDidLeechHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, card: Card) -> None: for hook in self._hooks: try: @@ -93,6 +96,9 @@ class _CardDidRenderHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, output: anki.template.TemplateRenderOutput, @@ -121,6 +127,9 @@ class _CardOdueWasInvalidHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -147,6 +156,9 @@ class _CardWillFlushHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, card: Card) -> None: for hook in self._hooks: try: @@ -173,6 +185,9 @@ class _DeckAddedHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, deck: Dict[str, Any]) -> None: for hook in self._hooks: try: @@ -197,6 +212,9 @@ class _ExportersListCreatedHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, exporters: List[Tuple[str, Any]]) -> None: for hook in self._hooks: try: @@ -234,6 +252,9 @@ class _FieldFilterFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, field_text: str, @@ -265,6 +286,9 @@ class _MediaFilesDidExportHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, count: int) -> None: for hook in self._hooks: try: @@ -291,6 +315,9 @@ class _NoteTypeAddedHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, notetype: Dict[str, Any]) -> None: for hook in self._hooks: try: @@ -317,6 +344,9 @@ class _NoteWillFlushHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, note: Note) -> None: for hook in self._hooks: try: @@ -331,21 +361,24 @@ note_will_flush = _NoteWillFlushHook() class _NotesWillBeDeletedHook: - _hooks: List[Callable[["anki.collection.Collection", List[int]], None]] = [] + _hooks: List[Callable[["anki.collection.Collection", Sequence[int]], None]] = [] def append( - self, cb: Callable[["anki.collection.Collection", List[int]], None] + self, cb: Callable[["anki.collection.Collection", Sequence[int]], None] ) -> None: - """(col: anki.collection.Collection, ids: List[int])""" + """(col: anki.collection.Collection, ids: Sequence[int])""" self._hooks.append(cb) def remove( - self, cb: Callable[["anki.collection.Collection", List[int]], None] + self, cb: Callable[["anki.collection.Collection", Sequence[int]], None] ) -> None: if cb in self._hooks: self._hooks.remove(cb) - def __call__(self, col: anki.collection.Collection, ids: List[int]) -> None: + def count(self) -> int: + return len(self._hooks) + + def __call__(self, col: anki.collection.Collection, ids: Sequence[int]) -> None: for hook in self._hooks: try: hook(col, ids) @@ -374,6 +407,9 @@ class _SchedulerNewLimitForSingleDeckFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, count: int, deck: Dict[str, Any]) -> int: for filter in self._hooks: try: @@ -402,6 +438,9 @@ class _SchedulerReviewLimitForSingleDeckFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, count: int, deck: Dict[str, Any]) -> int: for filter in self._hooks: try: @@ -427,6 +466,9 @@ class _Schedv2DidAnswerReviewCardHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, card: anki.cards.Card, ease: int, early: bool) -> None: for hook in self._hooks: try: @@ -451,6 +493,9 @@ class _SchemaWillChangeFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, proceed: bool) -> bool: for filter in self._hooks: try: @@ -478,6 +523,9 @@ class _SyncProgressDidChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, msg: str) -> None: for hook in self._hooks: try: @@ -504,6 +552,9 @@ class _SyncStageDidChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, stage: str) -> None: for hook in self._hooks: try: diff --git a/pylib/tools/genhooks.py b/pylib/tools/genhooks.py index fb1fe14b9..921a652fc 100644 --- a/pylib/tools/genhooks.py +++ b/pylib/tools/genhooks.py @@ -24,7 +24,7 @@ hooks = [ Hook(name="schema_will_change", args=["proceed: bool"], return_type="bool"), Hook( name="notes_will_be_deleted", - args=["col: anki.collection.Collection", "ids: List[int]"], + args=["col: anki.collection.Collection", "ids: Sequence[int]"], legacy_hook="remNotes", ), Hook(name="media_files_did_export", args=["count: int"]), diff --git a/pylib/tools/hookslib.py b/pylib/tools/hookslib.py index f06775507..3159e55af 100644 --- a/pylib/tools/hookslib.py +++ b/pylib/tools/hookslib.py @@ -83,6 +83,10 @@ class {self.classname()}: def remove(self, cb: {self.callable()}) -> None: if cb in self._hooks: self._hooks.remove(cb) + + def count(self) -> int: + return len(self._hooks) + {self.fire_code()} {self.name} = {self.classname()}() """ diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index d3efe8339..af8577ce0 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -35,6 +35,9 @@ class _AddCardsDidAddNoteHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, note: anki.notes.Note) -> None: for hook in self._hooks: try: @@ -61,6 +64,9 @@ class _AddCardsDidInitHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, addcards: aqt.addcards.AddCards) -> None: for hook in self._hooks: try: @@ -97,6 +103,9 @@ class _AddCardsWillAddNoteFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, problem: Optional[str], note: anki.notes.Note) -> Optional[str]: for filter in self._hooks: try: @@ -122,6 +131,9 @@ class _AddCardsWillShowHistoryMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, addcards: aqt.addcards.AddCards, menu: QMenu) -> None: for hook in self._hooks: try: @@ -154,6 +166,9 @@ class _AddonConfigEditorWillDisplayJsonFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, text: str) -> str: for filter in self._hooks: try: @@ -183,6 +198,9 @@ class _AddonConfigEditorWillSaveJsonFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, text: str) -> str: for filter in self._hooks: try: @@ -216,6 +234,9 @@ class _AddonsDialogDidChangeSelectedAddonHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, dialog: aqt.addons.AddonsDialog, add_on: aqt.addons.AddonMeta ) -> None: @@ -245,6 +266,9 @@ class _AddonsDialogWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, dialog: aqt.addons.AddonsDialog) -> None: for hook in self._hooks: try: @@ -273,6 +297,9 @@ class _AvPlayerDidBeginPlayingHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, player: aqt.sound.Player, tag: anki.sound.AVTag) -> None: for hook in self._hooks: try: @@ -297,6 +324,9 @@ class _AvPlayerDidEndPlayingHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, player: aqt.sound.Player) -> None: for hook in self._hooks: try: @@ -321,6 +351,9 @@ class _AvPlayerWillPlayHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, tag: anki.sound.AVTag) -> None: for hook in self._hooks: try: @@ -345,6 +378,9 @@ class _BackupDidCompleteHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -369,6 +405,9 @@ class _BrowserDidChangeRowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, browser: aqt.browser.Browser) -> None: for hook in self._hooks: try: @@ -397,6 +436,9 @@ class _BrowserDidSearchHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, context: aqt.browser.SearchContext) -> None: for hook in self._hooks: try: @@ -421,6 +463,9 @@ class _BrowserHeaderWillShowContextMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, browser: aqt.browser.Browser, menu: QMenu) -> None: for hook in self._hooks: try: @@ -445,6 +490,9 @@ class _BrowserMenusDidInitHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, browser: aqt.browser.Browser) -> None: for hook in self._hooks: try: @@ -539,6 +587,9 @@ class _BrowserWillBuildTreeFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, handled: bool, @@ -582,6 +633,9 @@ class _BrowserWillSearchHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, context: aqt.browser.SearchContext) -> None: for hook in self._hooks: try: @@ -606,6 +660,9 @@ class _BrowserWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, browser: aqt.browser.Browser) -> None: for hook in self._hooks: try: @@ -630,6 +687,9 @@ class _BrowserWillShowContextMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, browser: aqt.browser.Browser, menu: QMenu) -> None: for hook in self._hooks: try: @@ -659,6 +719,9 @@ class _CardLayoutWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, clayout: aqt.clayout.CardLayout) -> None: for hook in self._hooks: try: @@ -685,6 +748,9 @@ class _CardWillShowFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, text: str, card: Card, kind: str) -> str: for filter in self._hooks: try: @@ -712,6 +778,9 @@ class _CollectionDidLoadHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, col: anki.collection.Collection) -> None: for hook in self._hooks: try: @@ -738,6 +807,9 @@ class _CurrentNoteTypeDidChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, notetype: Dict[str, Any]) -> None: for hook in self._hooks: try: @@ -767,6 +839,9 @@ class _DebugConsoleDidEvaluatePythonFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, output: str, query: str, debug_window: QDialog) -> str: for filter in self._hooks: try: @@ -795,6 +870,9 @@ class _DebugConsoleWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, debug_window: QDialog) -> None: for hook in self._hooks: try: @@ -821,6 +899,9 @@ class _DeckBrowserDidRenderHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, deck_browser: aqt.deckbrowser.DeckBrowser) -> None: for hook in self._hooks: try: @@ -874,6 +955,9 @@ class _DeckBrowserWillRenderContentHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, deck_browser: aqt.deckbrowser.DeckBrowser, @@ -902,6 +986,9 @@ class _DeckBrowserWillShowOptionsMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, menu: QMenu, deck_id: int) -> None: for hook in self._hooks: try: @@ -943,6 +1030,9 @@ class _DeckConfDidAddConfigHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, deck_conf: aqt.deckconf.DeckConf, @@ -976,6 +1066,9 @@ class _DeckConfDidLoadConfigHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, deck_conf: aqt.deckconf.DeckConf, deck: Any, config: Any ) -> None: @@ -1004,6 +1097,9 @@ class _DeckConfDidSetupUiFormHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, deck_conf: aqt.deckconf.DeckConf) -> None: for hook in self._hooks: try: @@ -1030,6 +1126,9 @@ class _DeckConfWillRemoveConfigHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, deck_conf: aqt.deckconf.DeckConf, deck: Any, config: Any ) -> None: @@ -1062,6 +1161,9 @@ class _DeckConfWillRenameConfigHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, deck_conf: aqt.deckconf.DeckConf, deck: Any, config: Any, new_name: str ) -> None: @@ -1090,6 +1192,9 @@ class _DeckConfWillSaveConfigHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, deck_conf: aqt.deckconf.DeckConf, deck: Any, config: Any ) -> None: @@ -1118,6 +1223,9 @@ class _DeckConfWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, deck_conf: aqt.deckconf.DeckConf) -> None: for hook in self._hooks: try: @@ -1142,6 +1250,9 @@ class _EditorDidFireTypingTimerHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, note: anki.notes.Note) -> None: for hook in self._hooks: try: @@ -1168,6 +1279,9 @@ class _EditorDidFocusFieldHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, note: anki.notes.Note, current_field_idx: int) -> None: for hook in self._hooks: try: @@ -1194,6 +1308,9 @@ class _EditorDidInitHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, editor: aqt.editor.Editor) -> None: for hook in self._hooks: try: @@ -1218,6 +1335,9 @@ class _EditorDidInitButtonsHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, buttons: List, editor: aqt.editor.Editor) -> None: for hook in self._hooks: try: @@ -1242,6 +1362,9 @@ class _EditorDidInitShortcutsHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, shortcuts: List[Tuple], editor: aqt.editor.Editor) -> None: for hook in self._hooks: try: @@ -1268,6 +1391,9 @@ class _EditorDidLoadNoteHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, editor: aqt.editor.Editor) -> None: for hook in self._hooks: try: @@ -1294,6 +1420,9 @@ class _EditorDidUnfocusFieldFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, changed: bool, note: anki.notes.Note, current_field_idx: int ) -> bool: @@ -1323,6 +1452,9 @@ class _EditorDidUpdateTagsHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, note: anki.notes.Note) -> None: for hook in self._hooks: try: @@ -1349,6 +1481,9 @@ class _EditorWebViewDidInitHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, editor_web_view: aqt.editor.EditorWebView) -> None: for hook in self._hooks: try: @@ -1380,6 +1515,9 @@ class _EditorWillLoadNoteFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, js: str, note: anki.notes.Note, editor: aqt.editor.Editor ) -> str: @@ -1407,6 +1545,9 @@ class _EditorWillShowContextMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, editor_webview: aqt.editor.EditorWebView, menu: QMenu) -> None: for hook in self._hooks: try: @@ -1433,6 +1574,9 @@ class _EditorWillUseFontForFieldFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, font: str) -> str: for filter in self._hooks: try: @@ -1462,6 +1606,9 @@ class _EmptyCardsWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, diag: aqt.emptycards.EmptyCardsDialog) -> None: for hook in self._hooks: try: @@ -1494,6 +1641,9 @@ class _MainWindowDidInitHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -1518,6 +1668,9 @@ class _MediaSyncDidProgressHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, entry: aqt.mediasync.LogEntryWithTime) -> None: for hook in self._hooks: try: @@ -1542,6 +1695,9 @@ class _MediaSyncDidStartOrStopHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, running: bool) -> None: for hook in self._hooks: try: @@ -1566,6 +1722,9 @@ class _ModelsAdvancedWillShowHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, advanced: QDialog) -> None: for hook in self._hooks: try: @@ -1593,6 +1752,9 @@ class _OverviewDidRefreshHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, overview: aqt.overview.Overview) -> None: for hook in self._hooks: try: @@ -1640,6 +1802,9 @@ class _OverviewWillRenderContentHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, overview: aqt.overview.Overview, content: aqt.overview.OverviewContent ) -> None: @@ -1673,6 +1838,9 @@ class _ProfileDidOpenHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -1699,6 +1867,9 @@ class _ProfileWillCloseHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -1725,6 +1896,9 @@ class _ReviewDidUndoHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, card_id: int) -> None: for hook in self._hooks: try: @@ -1751,6 +1925,9 @@ class _ReviewerDidAnswerCardHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, reviewer: aqt.reviewer.Reviewer, card: Card, ease: int) -> None: for hook in self._hooks: try: @@ -1775,6 +1952,9 @@ class _ReviewerDidShowAnswerHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, card: Card) -> None: for hook in self._hooks: try: @@ -1801,6 +1981,9 @@ class _ReviewerDidShowQuestionHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, card: Card) -> None: for hook in self._hooks: try: @@ -1849,6 +2032,9 @@ class _ReviewerWillAnswerCardFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, ease_tuple: Tuple[bool, int], reviewer: aqt.reviewer.Reviewer, card: Card ) -> Tuple[bool, int]: @@ -1878,6 +2064,9 @@ class _ReviewerWillEndHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -1904,6 +2093,9 @@ class _ReviewerWillShowContextMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, reviewer: aqt.reviewer.Reviewer, menu: QMenu) -> None: for hook in self._hooks: try: @@ -1930,6 +2122,9 @@ class _SidebarShouldRefreshDecksHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -1954,6 +2149,9 @@ class _SidebarShouldRefreshNotetypesHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -1978,6 +2176,9 @@ class _StateDidChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, new_state: str, old_state: str) -> None: for hook in self._hooks: try: @@ -2006,6 +2207,9 @@ class _StateDidResetHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self) -> None: for hook in self._hooks: try: @@ -2034,6 +2238,9 @@ class _StateDidRevertHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, action: str) -> None: for hook in self._hooks: try: @@ -2060,6 +2267,9 @@ class _StateShortcutsWillChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, state: str, shortcuts: List[Tuple[str, Callable]]) -> None: for hook in self._hooks: try: @@ -2084,6 +2294,9 @@ class _StateWillChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, new_state: str, old_state: str) -> None: for hook in self._hooks: try: @@ -2110,6 +2323,9 @@ class _StyleDidInitFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, style: str) -> str: for filter in self._hooks: try: @@ -2137,6 +2353,9 @@ class _TagEditorDidProcessKeyHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, tag_edit: TagEdit, evt: QEvent) -> None: for hook in self._hooks: try: @@ -2172,6 +2391,9 @@ class _TopToolbarDidInitLinksHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, links: List[str], top_toolbar: aqt.toolbar.Toolbar) -> None: for hook in self._hooks: try: @@ -2196,6 +2418,9 @@ class _UndoStateDidChangeHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, can_undo: bool) -> None: for hook in self._hooks: try: @@ -2257,6 +2482,9 @@ class _WebviewDidReceiveJsMessageFilter: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, handled: Tuple[bool, Any], message: str, context: Any ) -> Tuple[bool, Any]: @@ -2319,6 +2547,9 @@ class _WebviewWillSetContentHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__( self, web_content: aqt.webview.WebContent, context: Optional[Any] ) -> None: @@ -2345,6 +2576,9 @@ class _WebviewWillShowContextMenuHook: if cb in self._hooks: self._hooks.remove(cb) + def count(self) -> int: + return len(self._hooks) + def __call__(self, webview: aqt.webview.AnkiWebView, menu: QMenu) -> None: for hook in self._hooks: try: