diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index fd4b93f4b..6247e0369 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -17,6 +17,7 @@ from anki.hooks import runFilter, runHook from anki.models import NoteType from aqt.qt import QDialog, QEvent, QMenu from aqt.tagedit import TagEdit +from aqt.models import Models # New hook/filter handling ############################################################################## @@ -1869,6 +1870,55 @@ class _ModelsAdvancedWillShowHook: models_advanced_will_show = _ModelsAdvancedWillShowHook() +class _ModelsDidInitButtonsFilter: + """Allows adding buttons to the Model dialog""" + + _hooks: List[ + Callable[ + [List[Tuple[str, Callable[[Models], None]]], Models], + List[Tuple[str, Callable[[Models], None]]], + ] + ] = [] + + def append( + self, + cb: Callable[ + [List[Tuple[str, Callable[[Models], None]]], Models], + List[Tuple[str, Callable[[Models], None]]], + ], + ) -> None: + """(buttons: List[Tuple[str, Callable[[Models], None]]], models: Models)""" + self._hooks.append(cb) + + def remove( + self, + cb: Callable[ + [List[Tuple[str, Callable[[Models], None]]], Models], + List[Tuple[str, Callable[[Models], None]]], + ], + ) -> None: + if cb in self._hooks: + self._hooks.remove(cb) + + def count(self) -> int: + return len(self._hooks) + + def __call__( + self, buttons: List[Tuple[str, Callable[[Models], None]]], models: Models + ) -> List[Tuple[str, Callable[[Models], None]]]: + for filter in self._hooks: + try: + buttons = filter(buttons, models) + except: + # if the hook fails, remove it + self._hooks.remove(filter) + raise + return buttons + + +models_did_init_buttons = _ModelsDidInitButtonsFilter() + + class _OverviewDidRefreshHook: """Allow to update the overview window. E.g. add the deck name in the title.""" diff --git a/qt/tools/genhooks_gui.py b/qt/tools/genhooks_gui.py index ce491c294..d12f3487d 100644 --- a/qt/tools/genhooks_gui.py +++ b/qt/tools/genhooks_gui.py @@ -689,7 +689,7 @@ hooks = [ Hook( name="models_did_init_buttons", args=["buttons: List[Tuple[str, Callable[[Models], None]]]", "models: Models"], - return_type="buttons: List[Tuple[str, Callable[[Models], None]]]", + return_type="List[Tuple[str, Callable[[Models], None]]]", doc="""Allows adding buttons to the Model dialog""", ), # Stats